ColorSchemeJsonConverter.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4. namespace Terminal.Gui {
  5. /// <summary>
  6. /// Implements a JSON converter for <see cref="ColorScheme"/>.
  7. /// </summary>
  8. public class ColorSchemeJsonConverter : JsonConverter<ColorScheme> {
  9. private static ColorSchemeJsonConverter instance;
  10. /// <summary>
  11. /// Singleton
  12. /// </summary>
  13. public static ColorSchemeJsonConverter Instance {
  14. get {
  15. if (instance == null) {
  16. instance = new ColorSchemeJsonConverter ();
  17. }
  18. return instance;
  19. }
  20. }
  21. /// <inheritdoc/>
  22. public override ColorScheme Read (ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  23. {
  24. if (reader.TokenType != JsonTokenType.StartObject) {
  25. throw new JsonException ($"Unexpected StartObject token when parsing ColorScheme: {reader.TokenType}.");
  26. }
  27. var colorScheme = new ColorScheme ();
  28. while (reader.Read ()) {
  29. if (reader.TokenType == JsonTokenType.EndObject) {
  30. return colorScheme;
  31. }
  32. if (reader.TokenType != JsonTokenType.PropertyName) {
  33. throw new JsonException ($"Unexpected token when parsing Attribute: {reader.TokenType}.");
  34. }
  35. var propertyName = reader.GetString ();
  36. reader.Read ();
  37. var attribute = JsonSerializer.Deserialize<Attribute> (ref reader, options);
  38. switch (propertyName.ToLower()) {
  39. case "normal":
  40. colorScheme.Normal = attribute;
  41. break;
  42. case "focus":
  43. colorScheme.Focus = attribute;
  44. break;
  45. case "hotnormal":
  46. colorScheme.HotNormal = attribute;
  47. break;
  48. case "hotfocus":
  49. colorScheme.HotFocus = attribute;
  50. break;
  51. case "disabled":
  52. colorScheme.Disabled = attribute;
  53. break;
  54. default:
  55. throw new JsonException ($"Unrecognized ColorScheme Attribute name: {propertyName}.");
  56. }
  57. }
  58. throw new JsonException ();
  59. }
  60. /// <inheritdoc/>
  61. public override void Write (Utf8JsonWriter writer, ColorScheme value, JsonSerializerOptions options)
  62. {
  63. writer.WriteStartObject ();
  64. writer.WritePropertyName ("Normal");
  65. AttributeJsonConverter.Instance.Write (writer, value.Normal, options);
  66. writer.WritePropertyName ("Focus");
  67. AttributeJsonConverter.Instance.Write (writer, value.Focus, options);
  68. writer.WritePropertyName ("HotNormal");
  69. AttributeJsonConverter.Instance.Write (writer, value.HotNormal, options);
  70. writer.WritePropertyName ("HotFocus");
  71. AttributeJsonConverter.Instance.Write (writer, value.HotFocus, options);
  72. writer.WritePropertyName ("Disabled");
  73. AttributeJsonConverter.Instance.Write (writer, value.Disabled, options);
  74. writer.WriteEndObject ();
  75. }
  76. }
  77. }