Files
FSI.BT.IR.Tools/Config.Net/Stores/Impl/CommandLine/CommandLineConfigStore.cs
Stephan Maier 647f938eee v1.2
2024-08-27 08:10:27 +02:00

102 lines
3.0 KiB
C#

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<string, string> _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<KeyValuePair<string, int>>? nameToPosition = null)
{
_isCaseSensitive = isCaseSensitive;
_nameToValue = new Dictionary<string, string>(_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<KeyValuePair<string, int>>? nameToPosition)
{
_nameToValue.Clear();
var posToName = new Dictionary<int, string>();
if (nameToPosition != null)
{
foreach(KeyValuePair<string, int> 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<string, string?>? 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];
}
}
}
}
}