Aragas/Bannerlord.MBOptionScreen

View on GitHub
src/MCM.Implementation/FluentBuilder/DefaultSettingsPresetBuilder.cs

Summary

Maintainability
A
0 mins
Test Coverage
using MCM.Abstractions;
using MCM.Abstractions.Base;
using MCM.Abstractions.FluentBuilder;

using System.Collections.Generic;
using System.Linq;

namespace MCM.Implementation.FluentBuilder
{
    internal sealed class DefaultSettingsPresetBuilder : ISettingsPresetBuilder
    {
        private string Id { get; }
        private string Name { get; }
        private IDictionary<string, object?> PropertyValues { get; } = new Dictionary<string, object?>();

        public DefaultSettingsPresetBuilder(string id, string name)
        {
            Id = id;
            Name = name;
        }

        public ISettingsPresetBuilder SetPropertyValue(string property, object? value)
        {
            if (!PropertyValues.ContainsKey(property))
                PropertyValues[property] = value;
            return this;
        }

        /// <inheritdoc />
        public ISettingsPreset Build(BaseSettings settings) => new MemorySettingsPreset(settings.Id, Id, Name, () =>
        {
            var settingsProperties = settings.GetAllSettingPropertyDefinitions().ToList();
            foreach (var overridePropertyKeyValue in PropertyValues)
            {
                var overridePropertyId = overridePropertyKeyValue.Key;
                var overridePropertyValue = overridePropertyKeyValue.Value;

                if (settingsProperties.Find(x => x.Id == overridePropertyId) is { } property)
                    property.PropertyReference.Value = overridePropertyValue;
            }
            return settings;
        });
    }
}