LaunchArgumentParser.UnknownArguments

This commit is contained in:
Timerix 2025-04-26 04:37:15 +05:00
parent e391f0238a
commit c77b3e0742
2 changed files with 26 additions and 14 deletions

View File

@ -3,7 +3,10 @@ namespace DTLib.Console;
public class LaunchArgumentParser
{
public string HelpMessageHeader = "USAGE:";
public bool IsAllowedNoArguments;
public bool AllowedNoArguments;
public bool AllowedUnknownArguments;
// ReSharper disable once CollectionNeverQueried.Global
public readonly List<string> UnknownArguments = new();
private readonly Dictionary<string, LaunchArgument> argDict = new();
private readonly List<LaunchArgument> argList = new();
@ -43,7 +46,13 @@ public class LaunchArgumentParser
public LaunchArgumentParser AllowNoArguments()
{
IsAllowedNoArguments = true;
AllowedNoArguments = true;
return this;
}
public LaunchArgumentParser AllowUnknownArguments()
{
AllowedUnknownArguments = true;
return this;
}
@ -62,7 +71,8 @@ public class LaunchArgumentParser
public string CreateHelpArgMessage(string argAlias)
{
StringBuilder b = new();
var arg = ParseArg(argAlias);
if(!TryParseArg(argAlias, out var arg))
throw new Exception($"unknown argument '{argAlias}'");
arg.AppendHelpInfo(b);
return b.ToString();
}
@ -74,16 +84,13 @@ public class LaunchArgumentParser
argDict.Add(alias, arg);
}
public LaunchArgument ParseArg(string argAlias)
public bool TryParseArg(string argAlias, out LaunchArgument arg)
{
// different argument providing patterns
if (!argDict.TryGetValue(argAlias, out var arg) && // arg
!(argAlias.StartsWith("--") && argDict.TryGetValue(argAlias.Substring(2), out arg)) && // --arg
!(argAlias.StartsWith('-') && argDict.TryGetValue(argAlias.Substring(1), out arg)) && // -arg
!(argAlias.StartsWith('/') && argDict.TryGetValue(argAlias.Substring(1), out arg))) // /arg
throw new Exception($"invalid argument: {argAlias}\n{CreateHelpMessage()}");
return arg;
arg = null!;
return argAlias.StartsWith("--") && argDict.TryGetValue(argAlias.Substring(2), out arg) || // --arg
argAlias.StartsWith('-') && argDict.TryGetValue(argAlias.Substring(1), out arg) || // -arg
argAlias.StartsWith('/') && argDict.TryGetValue(argAlias.Substring(1), out arg); // /arg
}
/// <param name="args">program launch args</param>
@ -93,14 +100,19 @@ public class LaunchArgumentParser
public void ParseAndHandle(string[] args)
{
// show help message and throw ExitAfterHelpException
if (args.Length == 0 && !IsAllowedNoArguments)
if (args.Length == 0 && !AllowedNoArguments)
HelpHandler();
List<LaunchArgument> execQueue = new();
for (int i = 0; i < args.Length; i++)
{
var arg = ParseArg(args[i]);
if (!TryParseArg(args[i], out var arg))
{
if (!AllowedUnknownArguments)
throw new Exception($"unknown argument '{args[i]}'");
UnknownArguments.Add(args[i]);
}
for (int j = 0; j < arg.Params.Length; j++)
{
if (++i >= args.Length)

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<!--package info-->
<PackageId>DTLib</PackageId>
<Version>1.7.2</Version>
<Version>1.7.3</Version>
<Authors>Timerix</Authors>
<Description>Library for all my C# projects</Description>
<RepositoryType>GIT</RepositoryType>