using System.Text.Json; using System.Text.Json.Serialization; namespace Terminal.Gui; /// Implements a JSON converter for . internal class ColorSchemeJsonConverter : JsonConverter { private static ColorSchemeJsonConverter instance; /// Singleton public static ColorSchemeJsonConverter Instance { get { if (instance is null) { instance = new ColorSchemeJsonConverter (); } return instance; } } /// public override ColorScheme Read (ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException ($"Unexpected StartObject token when parsing ColorScheme: {reader.TokenType}."); } var normal = Attribute.Default; var focus = Attribute.Default; var hotNormal = Attribute.Default; var hotFocus = Attribute.Default; var disabled = Attribute.Default; while (reader.Read ()) { if (reader.TokenType == JsonTokenType.EndObject) { var colorScheme = new ColorScheme { Normal = normal, Focus = focus, HotNormal = hotNormal, HotFocus = hotFocus, Disabled = disabled }; return colorScheme; } if (reader.TokenType != JsonTokenType.PropertyName) { throw new JsonException ($"Unexpected token when parsing Attribute: {reader.TokenType}."); } string propertyName = reader.GetString (); reader.Read (); var attribute = JsonSerializer.Deserialize (ref reader, _serializerContext.Attribute); switch (propertyName.ToLower ()) { case "normal": normal = attribute; break; case "focus": focus = attribute; break; case "hotnormal": hotNormal = attribute; break; case "hotfocus": hotFocus = attribute; break; case "disabled": disabled = attribute; break; default: throw new JsonException ($"Unrecognized ColorScheme Attribute name: {propertyName}."); } } throw new JsonException (); } /// public override void Write (Utf8JsonWriter writer, ColorScheme value, JsonSerializerOptions options) { writer.WriteStartObject (); writer.WritePropertyName ("Normal"); AttributeJsonConverter.Instance.Write (writer, value.Normal, options); writer.WritePropertyName ("Focus"); AttributeJsonConverter.Instance.Write (writer, value.Focus, options); writer.WritePropertyName ("HotNormal"); AttributeJsonConverter.Instance.Write (writer, value.HotNormal, options); writer.WritePropertyName ("HotFocus"); AttributeJsonConverter.Instance.Write (writer, value.HotFocus, options); writer.WritePropertyName ("Disabled"); AttributeJsonConverter.Instance.Write (writer, value.Disabled, options); writer.WriteEndObject (); } }