From b8843237204dc1ae5f7d6cad20c5efd0a843acad Mon Sep 17 00:00:00 2001 From: Helco Date: Wed, 13 Mar 2024 17:52:32 +0100 Subject: [PATCH] Set configuration values from CLI option --- zzre/Program.Configuration.cs | 36 ++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/zzre/Program.Configuration.cs b/zzre/Program.Configuration.cs index 39022833..453fb7a4 100644 --- a/zzre/Program.Configuration.cs +++ b/zzre/Program.Configuration.cs @@ -2,6 +2,7 @@ using System.CommandLine; using System.CommandLine.Invocation; using System.IO; +using Serilog; using zzio; using zzio.vfs; @@ -9,14 +10,20 @@ namespace zzre; partial class Program { - private static readonly Option NoZanzarahConfig = new( + private static readonly Option OptionNoZanzarahConfig = new( "--no-zanzarah-config", () => false, "Prevents the loading of standard zanzarah config files (game.cfg, ai.cfg, net.cfg, wizform.cfg)"); + private static readonly Option OptionSingleConfigs = new( + new[] { "-c", "--config" }, + () => [], + "Sets a single configuration value in the form ="); + private static void AddConfigurationOptions(Command command) { - command.AddGlobalOption(NoZanzarahConfig); + command.AddGlobalOption(OptionNoZanzarahConfig); + command.AddGlobalOption(OptionSingleConfigs); } private static Configuration CreateConfiguration(ITagContainer diContainer) @@ -26,7 +33,7 @@ private static Configuration CreateConfiguration(ITagContainer diContainer) var config = new Configuration(); config.AddSource(GameConfigSource.Default); - if (!invocationCtx.ParseResult.GetValueForOption(NoZanzarahConfig)) + if (!invocationCtx.ParseResult.GetValueForOption(OptionNoZanzarahConfig)) { LoadGameConfig(diContainer, config, "Configs/game.cfg"); LoadVarConfig(diContainer, config, "System/ai.cfg", "zanzarah.ai"); @@ -36,6 +43,10 @@ private static Configuration CreateConfiguration(ITagContainer diContainer) else logger.Debug("Loading of Zanzarah standard config files disabled by command line"); + var singleConfigs = invocationCtx.ParseResult.GetValueForOption(OptionSingleConfigs) ?? []; + foreach (var singleConfig in singleConfigs) + AddSingleConfig(logger, config, singleConfig); + config.ApplyChanges(); return config; } @@ -71,6 +82,25 @@ private static void LoadVarConfig(ITagContainer diContainer, Configuration confi } } + private static void AddSingleConfig(ILogger logger, Configuration config, string spec) + { + var parts = spec.Split('='); + if (parts.Length == 2) + { + parts[0] = parts[0].Trim(); + parts[1] = parts[1].Trim(); + if (parts[0].Length > 0 && parts[1].Length > 0) + { + if (double.TryParse(parts[1], out var numeric)) + config.SetValue(parts[0], numeric); + else + config.SetValue(parts[0], parts[1]); + return; + } + } + logger.Warning("Did not understand single config spec: {Spec}", spec); + } + public static IConfigurationBinding GetConfigFor(this ITagContainer diContainer, TSection instance) where TSection : class, IConfigurationSection => diContainer.GetTag().Bind(instance);