Skip to content

Commit

Permalink
Set configuration values from CLI option
Browse files Browse the repository at this point in the history
  • Loading branch information
Helco committed Mar 13, 2024
1 parent 3396cde commit b884323
Showing 1 changed file with 33 additions and 3 deletions.
36 changes: 33 additions & 3 deletions zzre/Program.Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,28 @@
using System.CommandLine;
using System.CommandLine.Invocation;
using System.IO;
using Serilog;
using zzio;
using zzio.vfs;

namespace zzre;

partial class Program
{
private static readonly Option<bool> NoZanzarahConfig = new(
private static readonly Option<bool> 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<string[]> OptionSingleConfigs = new(
new[] { "-c", "--config" },
() => [],
"Sets a single configuration value in the form <name>=<value>");

private static void AddConfigurationOptions(Command command)
{
command.AddGlobalOption(NoZanzarahConfig);
command.AddGlobalOption(OptionNoZanzarahConfig);
command.AddGlobalOption(OptionSingleConfigs);
}

private static Configuration CreateConfiguration(ITagContainer diContainer)
Expand All @@ -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");
Expand All @@ -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;
}
Expand Down Expand Up @@ -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<TSection>(this ITagContainer diContainer, TSection instance)
where TSection : class, IConfigurationSection
=> diContainer.GetTag<Configuration>().Bind(instance);
Expand Down

0 comments on commit b884323

Please sign in to comment.