IntervalJsonConverter.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4. namespace MonoGame.Extended.Serialization.Json;
  5. /// <summary>
  6. /// Converts a <see cref="Interval{T}"/> value to or from JSON.
  7. /// </summary>
  8. public class IntervalJsonConverter<T> : JsonConverter<Interval<T>> where T : IComparable<T>
  9. {
  10. /// <inheritdoc />
  11. public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Interval<T>);
  12. /// <inheritdoc />
  13. public override Interval<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  14. {
  15. Span<T> values = reader.ReadAsMultiDimensional<T>(options);
  16. if (values.Length == 2)
  17. {
  18. if (values[0].CompareTo(values[1]) < 0)
  19. {
  20. return new Interval<T>(values[0], values[1]);
  21. }
  22. return new Interval<T>(values[1], values[0]);
  23. }
  24. if (values.Length == 1)
  25. {
  26. return new Interval<T>(values[0], values[0]);
  27. }
  28. throw new InvalidOperationException("Invalid interval");
  29. }
  30. /// <inheritdoc />
  31. /// <exception cref="ArgumentNullException">
  32. /// Throw if <paramref name="writer"/> is <see langword="null"/>.
  33. /// </exception>
  34. public override void Write(Utf8JsonWriter writer, Interval<T> value, JsonSerializerOptions options)
  35. {
  36. ArgumentNullException.ThrowIfNull(writer);
  37. writer.WriteStartArray();
  38. JsonSerializer.Serialize(writer, value.Min, options);
  39. JsonSerializer.Serialize(writer, value.Max, options);
  40. writer.WriteEndArray();
  41. }
  42. }