custom/private/custom/eventhelper.cs
using System; using System.Threading; using System.Threading.Tasks; using System.Text.RegularExpressions; using ZeroNetworks.PowerShell.Cmdlets.Api.Runtime; namespace ZeroNetworks.PowerShell.Cmdlets.Common { using GetEventData = Func<EventArgs>; using SignalDelegate = Func<string, CancellationToken, Func<EventArgs>, Task>; /// <summary> /// Internal helpers and extensaions for EventData manipulation /// </summary> internal static class EventHelper { /// <summary> /// Create a tracing event containing a string message /// </summary> /// <param name="message">The string message to include in event data</param> /// <returns>Valid EventData containign the message</returns> public static EventData CreateLogEvent(string message) { return new EventData { Id = Guid.NewGuid().ToString(), Message = message }; } /// <summary> /// Create a new debug message event /// </summary> /// <param name="message">The message</param> /// <returns>An event cotnainng the debug message</returns> public static EventData CreateDebugEvent(string message) { return new EventData { Id = Events.Debug, Message = message }; } /// <summary> /// Create a new debug message event /// </summary> /// <param name="message">The message</param> /// <returns>An event cotnainng the debug message</returns> public static EventData CreateWarningEvent(string message) { return new EventData { Id = Events.Warning, Message = message }; } /// <summary> /// Print event details to the provided stream /// </summary> /// <param name="getEventData">The event data to print</param> /// <param name="signal">The delegate for signaling events to the runtime</param> /// <param name="token">The cancellation token for the request</param> /// <param name="streamName">The name of the stream to print data to</param> /// <param name="eventName">The name of the event to be printed</param> public static async void Print(this GetEventData getEventData, SignalDelegate signal, CancellationToken token, string streamName, string eventName) { var eventDisplayName = SplitPascalCase(eventName).ToUpperInvariant(); var data = EventDataConverter.ConvertFrom(getEventData()); // also, we manually use our TypeConverter to return an appropriate type if (data.Id != "Verbose" && data.Id != "Warning" && data.Id != "Debug" && data.Id != "Information" && data.Id != "Error") { await signal(streamName, token, () => EventHelper.CreateLogEvent($"{eventDisplayName} The contents are '{data?.Id}' and '{data?.Message}'")); if (data != null) { await signal(streamName, token, () => EventHelper.CreateLogEvent($"{eventDisplayName} Parameter: '{data.Parameter}'\n{eventDisplayName} RequestMessage '{data.RequestMessage}'\n{eventDisplayName} Response: '{data.ResponseMessage}'\n{eventDisplayName} Value: '{data.Value}'")); await signal(streamName, token, () => EventHelper.CreateLogEvent($"{eventDisplayName} ExtendedData Type: '{data.ExtendedData?.GetType()}'\n{eventDisplayName} ExtendedData '{data.ExtendedData}'")); } } } static string SplitPascalCase(string word) { var regex = new Regex("([a-z]+)([A-Z])"); var output = regex.Replace(word, "$1 $2"); regex = new Regex("([A-Z])([A-Z][a-z])"); return regex.Replace(output, "$1 $2"); } } } |