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()