using System; using System.Collections.Generic; using Config.Net.Core; using Config.Net.TypeParsers; namespace Config.Net.Stores.Impl.CommandLine { class CommandLineConfigStore : IConfigStore { private readonly Dictionary _nameToValue; private static readonly char[] ArgPrefixes = new[] { '-', '/' }; private static readonly string[] ArgDelimiters = new[] { "=", ":" }; private readonly bool _isCaseSensitive; public bool CanRead => true; public bool CanWrite => false; public CommandLineConfigStore(string[]? args = null, bool isCaseSensitive = false, IEnumerable>? nameToPosition = null) { _isCaseSensitive = isCaseSensitive; _nameToValue = new Dictionary(_isCaseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase); Parse(args ?? Environment.GetCommandLineArgs(), nameToPosition); } public void Dispose() { } public string? Read(string key) { if (key == null) return null; if(FlatArrays.IsArrayLength(key, k => _nameToValue.GetValueOrDefaultInternal(k), out int length)) { return length.ToString(); } if(FlatArrays.IsArrayElement(key, k => _nameToValue.GetValueOrDefaultInternal(k), out string? element)) { return element; } string? value; _nameToValue.TryGetValue(key, out value); return value; } private string[]? GetAsArray(string key) { if (!_nameToValue.TryGetValue(key, out string? allString)) return null; if (!StringArrayParser.TryParse(allString, out string[]? ar)) return null; return ar; } public void Write(string key, string? value) { throw new NotSupportedException("command line cannot be written to"); } private void Parse(string[] args, IEnumerable>? nameToPosition) { _nameToValue.Clear(); var posToName = new Dictionary(); if (nameToPosition != null) { foreach(KeyValuePair p in nameToPosition) { if (p.Key != null) { posToName[p.Value] = p.Key; } } } if (args == null) return; for (int i = 0; i < args.Length; i++) { string? name; string? value; Tuple? nameValue = Utils.SplitByDelimiter(args[i], ArgDelimiters); name = nameValue?.Item1.TrimStart(ArgPrefixes); value = nameValue?.Item2; if (name != null && value != null) { _nameToValue[name] = value; } else if(name != null && posToName.TryGetValue(i, out string? ptnName)) { _nameToValue[ptnName] = args[i]; } } } } }