// MIT License - Copyright (c) 2025 wallstop // Full license text: https://github.com/wallstop/unity-helpers/blob/main/LICENSE namespace WallstopStudios.UnityHelpers.Core.Serialization.JsonConverters { using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; using WallstopStudios.UnityHelpers.Core.DataStructure; public sealed class DequeConverterFactory : JsonConverterFactory { public static readonly DequeConverterFactory Instance = new(); private DequeConverterFactory() { } public override bool CanConvert(Type typeToConvert) { return typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(Deque<>); } public override JsonConverter CreateConverter( Type typeToConvert, JsonSerializerOptions options ) { Type elementType = typeToConvert.GetGenericArguments()[0]; Type convType = typeof(DequeConverter<>).MakeGenericType(elementType); return (JsonConverter)Activator.CreateInstance(convType); } private sealed class DequeConverter : JsonConverter> { public override Deque Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options ) { if (reader.TokenType != JsonTokenType.StartArray) { throw new JsonException("Deque expects a JSON array"); } List items = JsonSerializer.Deserialize>(ref reader, options); return items == null ? new Deque(Deque.DefaultCapacity) : new Deque(items); } public override void Write( Utf8JsonWriter writer, Deque value, JsonSerializerOptions options ) { writer.WriteStartArray(); foreach (T item in value) { JsonSerializer.Serialize(writer, item, options); } writer.WriteEndArray(); } } } }