From 542467ccea19957fa082990042ecfe2e91fa79d3 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 10 Jul 2025 06:31:43 +0200 Subject: [PATCH] rename IChildSettings to ISettingsNode & update Settings.Get() --- Pilz.Configuration/IChildSettings.cs | 6 ---- Pilz.Configuration/ISettings.cs | 4 +-- Pilz.Configuration/ISettingsNode.cs | 11 +++++++ Pilz.Configuration/Settings.cs | 44 +++++++++++++++++++--------- 4 files changed, 43 insertions(+), 22 deletions(-) delete mode 100644 Pilz.Configuration/IChildSettings.cs create mode 100644 Pilz.Configuration/ISettingsNode.cs diff --git a/Pilz.Configuration/IChildSettings.cs b/Pilz.Configuration/IChildSettings.cs deleted file mode 100644 index 7d4c3a3..0000000 --- a/Pilz.Configuration/IChildSettings.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Pilz.Configuration; - -public interface IChildSettings -{ - void Reset(); -} \ No newline at end of file diff --git a/Pilz.Configuration/ISettings.cs b/Pilz.Configuration/ISettings.cs index a53e50b..65bf1d9 100644 --- a/Pilz.Configuration/ISettings.cs +++ b/Pilz.Configuration/ISettings.cs @@ -5,8 +5,8 @@ namespace Pilz.Configuration; public interface ISettings { - IReadOnlyCollection Childs { get; } - T Get() where T : IChildSettings, ISettingsIdentifier; + IReadOnlyCollection Childs { get; } + T Get() where T : ISettingsNode, ISettingsIdentifier; void Reset(); string Save(JsonSerializerSettings serializer); bool Load(JsonSerializerSettings serializer, string raw); diff --git a/Pilz.Configuration/ISettingsNode.cs b/Pilz.Configuration/ISettingsNode.cs new file mode 100644 index 0000000..318a043 --- /dev/null +++ b/Pilz.Configuration/ISettingsNode.cs @@ -0,0 +1,11 @@ +using System; + +namespace Pilz.Configuration; + +public interface ISettingsNode +{ + void Reset(); +} + +[Obsolete("Use ISettingsNode instead!")] +public interface IChildSettings : ISettingsNode; diff --git a/Pilz.Configuration/Settings.cs b/Pilz.Configuration/Settings.cs index 8dfb9d8..b5c201b 100644 --- a/Pilz.Configuration/Settings.cs +++ b/Pilz.Configuration/Settings.cs @@ -8,32 +8,48 @@ namespace Pilz.Configuration; public class Settings : ISettings { protected readonly Dictionary settingsJson = []; - protected readonly Dictionary settings = []; + protected readonly Dictionary settings = []; protected JsonSerializerSettings serializerSettings; - public virtual IReadOnlyCollection Childs => settings.Values; + public virtual IReadOnlyCollection Childs => settings.Values; - public virtual T Get() where T : IChildSettings, ISettingsIdentifier + public virtual T Get() where T : ISettingsNode, ISettingsIdentifier { + // Find existing one if (settings.TryGetValue(T.Identifier, out var valueExisting) && valueExisting is T settingsExisting) return settingsExisting; - if (settingsJson.TryGetValue(T.Identifier, out var valueRaw) - && valueRaw.ToObject(JsonSerializer.CreateDefault(serializerSettings)) is T settingsDeserialized) - { - if (!settings.TryAdd(T.Identifier, settingsDeserialized)) - settings[T.Identifier] = settingsDeserialized; - return settingsDeserialized; - } - + // Create new & reset + T instance = default; if (Activator.CreateInstance() is T settingsNew) { settingsNew.Reset(); - settings.Add(T.Identifier, settingsNew); - return settingsNew; + settings[T.Identifier] = settingsNew; + instance = settingsNew; + } + else + settingsNew = default; + + // Try deserialize + if (settingsJson.TryGetValue(T.Identifier, out var valueRaw)) + { + var serializer = JsonSerializer.CreateDefault(serializerSettings); + + // Populate + if (settingsNew != null) + serializer.Populate(valueRaw.CreateReader(), instance); + + // Deserialize (fallback) + else if (valueRaw.ToObject() is T settingsDeserialized) + settingsNew = settingsDeserialized; } - return default; + // Remember + if (settingsNew != null) + settings[T.Identifier] = settingsNew; + + // Return + return settingsNew; } public void Reset()