using InABox.Core; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace InABox.Configuration { public class SubConfiguration : IConfiguration where TParent : new() { public IConfiguration Configuration { get; set; } private Func Getter { get; set; } private Action Setter { get; set; } public SubConfiguration(IConfiguration configuration, Expression> expression) { Configuration = configuration; var property = CoreUtils.GetFullPropertyName(expression, "."); Getter = Expressions.Getter(expression); var setter = Expressions.Setter(property); Setter = (parent, value) => setter(parent, value); } public string[] Sections() => Configuration.Sections(); public T Load(bool useCache = true) { var parent = Configuration.Load(useCache); return Getter(parent); } public Dictionary LoadAll(IEnumerable? keys = null) { var parent = Configuration.LoadAll(keys); return parent.ToDictionary(x => x.Key, x => Getter(x.Value)); } public void Save(T obj) { var parent = Configuration.Load(true); Setter(parent, obj); Configuration.Save(parent); } public void SaveAll(Dictionary objs, bool reset = false) { var parents = Configuration.LoadAll(objs.Keys); foreach(var (key, obj) in objs) { var parent = parents.GetValueOrAdd(key); Setter(parent, obj); } Configuration.SaveAll(parents); } public void Delete(Action? callback = null) { var parent = Configuration.Load(true); Setter(parent, default); Configuration.Save(parent); } } }