using System.Globalization; namespace MxGateway.Client.Cli; internal sealed class CliArguments { private readonly Dictionary _values = new(StringComparer.OrdinalIgnoreCase); private readonly HashSet _flags = new(StringComparer.OrdinalIgnoreCase); public CliArguments(IEnumerable args) { string? pendingName = null; foreach (string arg in args) { if (arg.StartsWith("--", StringComparison.Ordinal)) { if (pendingName is not null) { _flags.Add(pendingName); } pendingName = arg[2..]; continue; } if (pendingName is null) { throw new ArgumentException($"Unexpected argument '{arg}'."); } _values[pendingName] = arg; pendingName = null; } if (pendingName is not null) { _flags.Add(pendingName); } } public bool HasFlag(string name) { return _flags.Contains(name); } public string? GetOptional(string name) { return _values.TryGetValue(name, out string? value) ? value : null; } public string GetRequired(string name) { string? value = GetOptional(name); if (string.IsNullOrWhiteSpace(value)) { throw new ArgumentException($"Missing required option --{name}."); } return value; } public int GetInt32(string name, int? defaultValue = null) { string? value = GetOptional(name); if (string.IsNullOrWhiteSpace(value)) { if (defaultValue.HasValue) { return defaultValue.Value; } throw new ArgumentException($"Missing required option --{name}."); } return int.Parse(value, CultureInfo.InvariantCulture); } public uint GetUInt32(string name, uint defaultValue) { string? value = GetOptional(name); return string.IsNullOrWhiteSpace(value) ? defaultValue : uint.Parse(value, CultureInfo.InvariantCulture); } public ulong GetUInt64(string name, ulong defaultValue) { string? value = GetOptional(name); return string.IsNullOrWhiteSpace(value) ? defaultValue : ulong.Parse(value, CultureInfo.InvariantCulture); } public TimeSpan GetDuration(string name, TimeSpan defaultValue) { string? value = GetOptional(name); if (string.IsNullOrWhiteSpace(value)) { return defaultValue; } if (value.EndsWith("ms", StringComparison.OrdinalIgnoreCase)) { return TimeSpan.FromMilliseconds(double.Parse(value[..^2], CultureInfo.InvariantCulture)); } if (value.EndsWith('s')) { return TimeSpan.FromSeconds(double.Parse(value[..^1], CultureInfo.InvariantCulture)); } return TimeSpan.Parse(value, CultureInfo.InvariantCulture); } }