From ec22181750304509fd7a39201bbcb44aed357c5d Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 25 Apr 2025 09:47:36 +0200 Subject: [PATCH] add SettingsValueOption --- .../ISettingsValueOptionValueAccessor.cs | 6 +++ Pilz.Configuration/SettingsValueOption.cs | 49 +++++++++++++++++++ .../SettingsValueOptionJsonConverter.cs | 27 ++++++++++ 3 files changed, 82 insertions(+) create mode 100644 Pilz.Configuration/ISettingsValueOptionValueAccessor.cs create mode 100644 Pilz.Configuration/SettingsValueOption.cs create mode 100644 Pilz.Configuration/SettingsValueOptionJsonConverter.cs diff --git a/Pilz.Configuration/ISettingsValueOptionValueAccessor.cs b/Pilz.Configuration/ISettingsValueOptionValueAccessor.cs new file mode 100644 index 0000000..4e0451d --- /dev/null +++ b/Pilz.Configuration/ISettingsValueOptionValueAccessor.cs @@ -0,0 +1,6 @@ +namespace Pilz.Configuration; + +internal interface ISettingsValueOptionValueAccessor +{ + public object ValueRaw { get; set; } +} diff --git a/Pilz.Configuration/SettingsValueOption.cs b/Pilz.Configuration/SettingsValueOption.cs new file mode 100644 index 0000000..26f9e25 --- /dev/null +++ b/Pilz.Configuration/SettingsValueOption.cs @@ -0,0 +1,49 @@ +using Newtonsoft.Json; + +namespace Pilz.Configuration; + +[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)] +[JsonConverter(typeof(SettingsValueOptionJsonConverter))] +public class SettingsValueOption : ISettingsValueOptionValueAccessor where T : struct +{ + protected T? value; + + public T DefaultValue { get; } + public virtual bool IsDefault => value == null; + + public SettingsValueOption() + { + } + + public SettingsValueOption(T value) + { + this.value = DefaultValue = value; + } + + public virtual T Value + { + get => value ?? DefaultValue; + set => this.value = value; + } + + public static implicit operator T(SettingsValueOption option) + { + return option.Value; + } + + object ISettingsValueOptionValueAccessor.ValueRaw + { + get => value; + set => this.value = (T?)value; + } + + public virtual void Reset() + { + value = null; + } + + public override string ToString() + { + return Value.ToString(); + } +} diff --git a/Pilz.Configuration/SettingsValueOptionJsonConverter.cs b/Pilz.Configuration/SettingsValueOptionJsonConverter.cs new file mode 100644 index 0000000..be73e3e --- /dev/null +++ b/Pilz.Configuration/SettingsValueOptionJsonConverter.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using System; + +namespace Pilz.Configuration; + +public class SettingsValueOptionJsonConverter : JsonConverter +{ + public override bool CanConvert(Type objectType) + { + return true; + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (existingValue is ISettingsValueOptionValueAccessor option) + option.ValueRaw = reader.Value; + return existingValue; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value is ISettingsValueOptionValueAccessor option) + writer.WriteValue(option.ValueRaw); + else + writer.WriteNull(); + } +}