using System; using System.Text.Json; using System.Text.Json.Serialization; using Terminal.Gui; namespace Terminal.Gui { /// /// Json converter fro the class. /// public class AttributeJsonConverter : JsonConverter { private static AttributeJsonConverter instance; /// /// /// public static AttributeJsonConverter Instance { get { if (instance == null) { instance = new AttributeJsonConverter (); } return instance; } } /// public override Attribute Read (ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException ($"Unexpected StartObject token when parsing Attribute: {reader.TokenType}."); } Attribute attribute = new Attribute (); Color foreground = (Color)(-1); Color background = (Color)(-1); while (reader.Read ()) { if (reader.TokenType == JsonTokenType.EndObject) { if (foreground == (Color)(-1) || background == (Color)(-1)) { throw new JsonException ($"Both Foreground and Background colors must be provided."); } return attribute; } if (reader.TokenType != JsonTokenType.PropertyName) { throw new JsonException ($"Unexpected token when parsing Attribute: {reader.TokenType}."); } string propertyName = reader.GetString (); reader.Read (); string color = $"\"{reader.GetString ()}\""; switch (propertyName.ToLower ()) { case "foreground": foreground = JsonSerializer.Deserialize (color, options); break; case "background": background = JsonSerializer.Deserialize (color, options); break; //case "Bright": // attribute.Bright = reader.GetBoolean (); // break; //case "Underline": // attribute.Underline = reader.GetBoolean (); // break; //case "Reverse": // attribute.Reverse = reader.GetBoolean (); // break; default: throw new JsonException ($"Unknown Attribute property {propertyName}."); } attribute = new Attribute (foreground, background); } throw new JsonException (); } /// public override void Write (Utf8JsonWriter writer, Attribute value, JsonSerializerOptions options) { writer.WriteStartObject (); writer.WritePropertyName ("Foreground"); ColorJsonConverter.Instance.Write (writer, value.Foreground, options); writer.WritePropertyName ("Background"); ColorJsonConverter.Instance.Write (writer, value.Background, options); writer.WriteEndObject (); } } }