using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; namespace Terminal.Gui.Configuration; // ReSharper disable StringLiteralTypo /// Implements a JSON converter for . [RequiresUnreferencedCode ("AOT")] internal class SchemeJsonConverter : JsonConverter { /// public override Scheme Read (ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException ($"Unexpected StartObject token when parsing Scheme: {reader.TokenType}."); } var scheme = new Scheme (); var propertyName = string.Empty; while (reader.Read ()) { if (reader.TokenType == JsonTokenType.EndObject) { return scheme; } if (reader.TokenType != JsonTokenType.PropertyName) { throw new JsonException ($"After {propertyName}: Expected PropertyName but got another token when parsing Attribute: {reader.TokenType}."); } propertyName = reader.GetString (); reader.Read (); // Make sure attributes are marked as explicitly set when deserialized object? attrObj = JsonSerializer.Deserialize (ref reader, ConfigurationManager.SerializerContext.Attribute); if (attrObj is not Attribute attribute) { throw new JsonException ($"After {propertyName}: Expected Attribute but got {attrObj?.GetType ().Name ?? "null"} when parsing Scheme."); } if (propertyName is { }) { scheme = propertyName.ToLowerInvariant () switch { "normal" => scheme with { Normal = attribute }, "hotnormal" => scheme with { HotNormal = attribute }, "focus" => scheme with { Focus = attribute }, "hotfocus" => scheme with { HotFocus = attribute }, "active" => scheme with { Active = attribute }, "hotactive" => scheme with { HotActive = attribute }, "highlight" => scheme with { Highlight = attribute }, "editable" => scheme with { Editable = attribute }, "readonly" => scheme with { ReadOnly = attribute }, "disabled" => scheme with { Disabled = attribute }, _ => throw new JsonException ($"{propertyName}: Unrecognized Scheme Attribute name.") }; } else { throw new JsonException ("null property name."); } } throw new JsonException ($"After {propertyName}: Invalid Json."); } /// public override void Write (Utf8JsonWriter writer, Scheme value, JsonSerializerOptions options) { writer.WriteStartObject (); foreach (VisualRole role in Enum.GetValues()) { // Get the attribute for the role if (!value.TryGetExplicitlySetAttributeForRole (role, out Attribute? attribute)) { // Skip attributes that are not explicitly set continue; } writer.WritePropertyName (role.ToString ()); // Write the attribute using the AttributeJsonConverter AttributeJsonConverter.Instance.Write (writer, attribute!.Value, options); } writer.WriteEndObject (); } }