diff options
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs')
-rw-r--r-- | Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs new file mode 100644 index 0000000..ef5b5cb --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended/Serialization/RangeJsonConverter.cs @@ -0,0 +1,50 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MonoGame.Extended.Serialization; + +/// <summary> +/// Converts a <see cref="Range{T}"/> value to or from JSON. +/// </summary> +public class RangeJsonConverter<T> : JsonConverter<Range<T>> where T : IComparable<T> +{ + /// <inheritdoc /> + public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Range<T>); + + /// <inheritdoc /> + public override Range<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Span<T> values = reader.ReadAsMultiDimensional<T>(); + + if (values.Length == 2) + { + if (values[0].CompareTo(values[1]) < 0) + { + return new Range<T>(values[0], values[1]); + } + + return new Range<T>(values[1], values[0]); + } + + if (values.Length == 1) + { + return new Range<T>(values[0], values[0]); + } + + throw new InvalidOperationException("Invalid range"); + } + + /// <inheritdoc /> + /// <exception cref="ArgumentNullException"> + /// Throw if <paramref name="writer"/> is <see langword="null"/>. + /// </exception> + public override void Write(Utf8JsonWriter writer, Range<T> value, JsonSerializerOptions options) + { + ArgumentNullException.ThrowIfNull(writer); + writer.WriteStartArray(); + JsonSerializer.Serialize(writer, value.Min, options); + JsonSerializer.Serialize(writer, value.Max, options); + writer.WriteEndArray(); + } +} |