using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.Extensions.Configuration; namespace Elwig.Helpers { public record struct ScaleConfig { public string Id; public string? Type; public string? Model; public string? Connection; public string? Empty; public string? Filling; public string? Limit; public string? Log; public string? _Log; public ScaleConfig(string id, string? type, string? model, string? cnx, string? empty, string? filling, string? limit, string? log) { Id = id; Type = type; Model = model; Connection = cnx; Empty = empty; Filling = filling; Limit = limit; _Log = log; Log = log != null ? Path.Combine(App.DataPath, log) : null; } } public class Config { private static readonly string[] TrueValues = ["1", "true", "yes", "on"]; private readonly string FileName; public bool Debug; public string DatabaseFile = App.DataPath + "database.sqlite3"; public string? DatabaseLog = null; public string? Branch = null; public string? UpdateUrl = null; public bool UpdateAuto = false; public string? SmtpHost = null; public int? SmtpPort = null; public string? SmtpMode = null; public string? SmtpUsername = null; public string? SmtpPassword = null; public string? SmtpFrom = null; public (string Host, int Port, string Mode, string Username, string Password, string From)? Smtp => SmtpHost == null || SmtpPort == null || SmtpMode == null || SmtpUsername == null || SmtpPassword == null || SmtpFrom == null ? null : (SmtpHost, (int)SmtpPort, SmtpMode, SmtpUsername, SmtpPassword, SmtpFrom); public IList Scales; private readonly List ScaleList = []; public Config(string filename) { FileName = filename; Scales = ScaleList; Read(); } public void Read() { var config = new ConfigurationBuilder().AddIniFile(FileName).Build(); DatabaseFile = Path.Combine(App.DataPath, config["database:file"] ?? "database.sqlite3"); var log = config["database:log"]; DatabaseLog = log != null ? Path.Combine(App.DataPath, log) : null; Branch = config["general:branch"]; Debug = TrueValues.Contains(config["general:debug"]?.ToLower()); UpdateUrl = config["update:url"]; UpdateAuto = TrueValues.Contains(config["update:auto"]?.ToLower()); SmtpHost = config["smtp:host"]; SmtpPort = config["smtp:port"]?.All(char.IsAsciiDigit) == true && config["smtp:port"]?.Length > 0 ? int.Parse(config["smtp:port"]!) : null; SmtpMode = config["smtp:mode"]; SmtpUsername = config["smtp:username"]; SmtpPassword = config["smtp:password"]; SmtpFrom = config["smtp:from"]; var scales = config.AsEnumerable().Where(i => i.Key.StartsWith("scale.")).GroupBy(i => i.Key.Split(':')[0][6..]).Select(i => i.Key); ScaleList.Clear(); Scales = ScaleList; foreach (var s in scales) { ScaleList.Add(new( s, config[$"scale.{s}:type"], config[$"scale.{s}:model"], config[$"scale.{s}:connection"], config[$"scale.{s}:empty"], config[$"scale.{s}:filling"], config[$"scale.{s}:limit"], config[$"scale.{s}:log"] )); } } } }