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 ();
}
}
}