From 407cf5d0bf9d3563ae77fd34ce29ffae5af4339f Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Tue, 5 Mar 2024 00:44:54 +0100 Subject: Add MediaStreamProtocol enum (#10153) * Add MediaStreamProtocol enum * Add default handling for enum during deserialization --------- Co-authored-by: Cody Robibero --- .../Converters/JsonDefaultStringEnumConverter.cs | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/Jellyfin.Extensions/Json/Converters/JsonDefaultStringEnumConverter.cs (limited to 'src/Jellyfin.Extensions/Json/Converters/JsonDefaultStringEnumConverter.cs') diff --git a/src/Jellyfin.Extensions/Json/Converters/JsonDefaultStringEnumConverter.cs b/src/Jellyfin.Extensions/Json/Converters/JsonDefaultStringEnumConverter.cs new file mode 100644 index 0000000000..06ecfc5580 --- /dev/null +++ b/src/Jellyfin.Extensions/Json/Converters/JsonDefaultStringEnumConverter.cs @@ -0,0 +1,49 @@ +using System; +using System.ComponentModel; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Jellyfin.Extensions.Json.Converters; + +/// +/// Json unknown enum converter. +/// +/// The type of enum. +public class JsonDefaultStringEnumConverter : JsonConverter + where T : struct, Enum +{ + private readonly JsonConverter _baseConverter; + + /// + /// Initializes a new instance of the class. + /// + /// The base json converter. + public JsonDefaultStringEnumConverter(JsonConverter baseConverter) + { + _baseConverter = baseConverter; + } + + /// + public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.IsNull() || reader.IsEmptyString()) + { + var customValueAttribute = typeToConvert.GetCustomAttribute(); + if (customValueAttribute?.Value is null) + { + throw new InvalidOperationException($"Default value not set for '{typeToConvert.Name}'"); + } + + return (T)customValueAttribute.Value; + } + + return _baseConverter.Read(ref reader, typeToConvert, options); + } + + /// + public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) + { + _baseConverter.Write(writer, value, options); + } +} -- cgit v1.2.3