namespace Bts.DataStreamWebApp.Server; using Bts.PubSub; using CommandLine; using System.Text.Json; using System.Text.Json.Serialization; class DataStreamWebAppServerConfig { /// /// The login user for sparkd /// [JsonPropertyName("user")] [Option("user", HelpText = "The sparkd login user")] public string? User { get; set; } /// /// The login password for sparkd /// [JsonPropertyName("password")] [Option("pass", HelpText = "The sparkd login password")] public string? Password { get; set; } /// /// The config server url for sparkd /// [JsonPropertyName("sparkd")] [Option("sparkd", HelpText = "The sparkd config server")] public string? Sparkd { get; set; } [JsonPropertyName("pubsub")] public PubSubConfig? PubSub { get; set; } [Option("content-root-path")] [JsonPropertyName("content_root_path")] public string? ContentRootPath { get; set; } [Option("web-root-path")] [JsonPropertyName("web_root_path")] public string? WebRootPath { get; set; } [Option("environment-name")] [JsonPropertyName("environment_name")] public string? EnvironmentName { get; set; } public DirectoryBrowserOptions? DirectoryBrowser { get; set; } [Option( "config", MetaValue = "PATH", HelpText = "Path to json file representing these options (DataStreamPublisherConfig)")] [JsonIgnore] public string? ConfigFile { get; set; } public static DataStreamWebAppServerConfig Default() => new() { User = "bts", PubSub = PubSubConfig.Default(), }; public void MergeWith(DataStreamWebAppServerConfig other) { User ??= other.User; Password ??= other.Password; PubSub ??= other.PubSub; Sparkd ??= other.Sparkd; ContentRootPath ??= other.ContentRootPath; WebRootPath ??= other.WebRootPath; ConfigFile ??= other.ConfigFile; } /// /// Merges options with those defined in `ConfigFile` (does not overwrite /// non-null existing values). /// /// /// JsonSerializer.Deserialize returns null /// public void MergeWithConfigFile() { if (ConfigFile is null) { return; } var cfgString = File.ReadAllText(ConfigFile); var parsedCfg = JsonSerializer.Deserialize(cfgString) ?? throw new InvalidOperationException($"Failed to parse json from {ConfigFile}"); MergeWith(parsedCfg); ConfigFile = null; } }