using System.Globalization;
namespace Godosa.Core.Runs;
/// Shared run flags: --deterministic [seed] (fixed step, seeded streams), --digest [every=N]
/// (state hash lines), --headless (no window; implies deterministic). null = the game's default.
public sealed record RunFlags(bool Deterministic = false, ulong? Seed = null, bool Digest = false, int DigestEvery = 0, bool Headless = false)
{
public ulong SeedOr(ulong fallback) => Seed ?? fallback;
/// Consumes the run flag at (and its optional value, advancing );
/// false when args[i] is no run flag.
public static bool TryTake(IReadOnlyList args, ref int i, ref RunFlags flags)
{
string? next = i + 1 < args.Count ? args[i + 1] : null;
switch (args[i])
{
case "--deterministic":
flags = flags with { Deterministic = true };
if (next != null && ulong.TryParse(next, NumberStyles.None, CultureInfo.InvariantCulture, out var seed))
(flags, i) = (flags with { Seed = seed }, i + 1);
return true;
case "--digest":
flags = flags with { Digest = true };
if (next != null && next.StartsWith("every=", StringComparison.Ordinal))
{
if (!int.TryParse(next.AsSpan(6), NumberStyles.None, CultureInfo.InvariantCulture, out var every) || every < 1)
throw new ArgumentException($"--digest {next}: every=N needs N ≥ 1");
(flags, i) = (flags with { DigestEvery = every }, i + 1);
}
return true;
case "--headless":
flags = flags with { Headless = true, Deterministic = true };
return true;
default:
return false;
}
}
}