using System; using System.Text.Json.Serialization; using System.Text.Json; using System.Text.RegularExpressions; namespace Terminal.Gui { /// /// Json converter for the class. /// public class ColorJsonConverter : JsonConverter { private static ColorJsonConverter instance; /// /// Singleton /// public static ColorJsonConverter Instance { get { if (instance == null) { instance = new ColorJsonConverter (); } return instance; } } /// public override Color Read (ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // Check if the value is a string if (reader.TokenType == JsonTokenType.String) { // Get the color string var colorString = reader.GetString (); // Check if the color string is a color name if (Enum.TryParse (colorString, ignoreCase: true, out Color color)) { // Return the parsed color return color; } else { // Parse the color string as an RGB value var match = Regex.Match (colorString, @"rgb\((\d+),(\d+),(\d+)\)"); if (match.Success) { var r = int.Parse (match.Groups [1].Value); var g = int.Parse (match.Groups [2].Value); var b = int.Parse (match.Groups [3].Value); return new TrueColor (r, g, b).ToConsoleColor (); } else { throw new JsonException ($"Invalid Color: '{colorString}'"); } } } else { throw new JsonException ($"Unexpected token when parsing Color: {reader.TokenType}"); } } /// public override void Write (Utf8JsonWriter writer, Color value, JsonSerializerOptions options) { // Try to get the human readable color name from the map var name = Enum.GetName (typeof (Color), value); if (name != null) { // Write the color name to the JSON writer.WriteStringValue (name); } else { //// If the color is not in the map, look up its RGB values in the consoleDriver.colors array //ConsoleColor consoleColor = (ConsoleDriver [(int)value]); //int r = consoleColor.R; //int g = consoleColor.G; //int b = consoleColor.B; //// Write the RGB values as a string to the JSON //writer.WriteStringValue ($"rgb({r},{g},{b})"); throw new JsonException ($"Unknown Color value. Cannot serialize to JSON: {value}"); } } } }