using System; using System.Collections.Generic; namespace Carbon.Json.Converters { public sealed class JsonConverterFactory { private static readonly Dictionary converters = new Dictionary(); static JsonConverterFactory() { AddInternal(new BooleanConverter()); AddInternal(new DateTimeConverter()); AddInternal(new DateTimeOffsetConverter()); AddInternal(new BinaryConverter()); AddInternal(new DecimalConverter()); AddInternal(new DoubleConverter()); AddInternal(new GuidConverter()); AddInternal(new Int16Converter()); AddInternal(new Int32Converter()); AddInternal(new Int64Converter()); AddInternal(new SingleConverter()); AddInternal(new StringConverter()); AddInternal(new TimeSpanConverter()); AddInternal(new UInt16Converter()); AddInternal(new UInt32Converter()); AddInternal(new UInt64Converter()); AddInternal(new UriConverter()); // Hash sets AddInternal(new HashSetConverter()); AddInternal(new HashSetConverter()); AddInternal(new HashSetConverter()); AddInternal(new HashSetConverter()); AddInternal(new HashSetConverter()); AddInternal(new HashSetConverter()); // JSON AddInternal(new JsonObjectConverter()); AddInternal(new JsonArrayConverter()); } internal static Dictionary Instances => converters; public static IJsonConverter Get(Type type) { var details = TypeDetails.Get(type); if (details.JsonConverter == null) { throw new ConversionException($"No converter found for '{type.Name}'."); } return details.JsonConverter; } public static bool TryGet(Type type, out IJsonConverter converter) { var typeDetails = TypeDetails.Get(type); converter = typeDetails.JsonConverter; return converter != null; } private static void AddInternal(JsonConverter converter) => converters.Add(typeof(T), converter); private static void AddInternal(IJsonConverter converter) => converters.Add(typeof(T), converter); public static void Add(JsonConverter converter) { if (converter == null) { throw new ArgumentNullException(nameof(converter)); } AddInternal(converter); var type = TypeDetails.Get(); type.JsonConverter = converter; } } }