LaunchArgumentParser.UnknownArguments
This commit is contained in:
parent
e391f0238a
commit
c77b3e0742
@ -3,7 +3,10 @@ namespace DTLib.Console;
|
|||||||
public class LaunchArgumentParser
|
public class LaunchArgumentParser
|
||||||
{
|
{
|
||||||
public string HelpMessageHeader = "USAGE:";
|
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 Dictionary<string, LaunchArgument> argDict = new();
|
||||||
private readonly List<LaunchArgument> argList = new();
|
private readonly List<LaunchArgument> argList = new();
|
||||||
@ -43,7 +46,13 @@ public class LaunchArgumentParser
|
|||||||
|
|
||||||
public LaunchArgumentParser AllowNoArguments()
|
public LaunchArgumentParser AllowNoArguments()
|
||||||
{
|
{
|
||||||
IsAllowedNoArguments = true;
|
AllowedNoArguments = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LaunchArgumentParser AllowUnknownArguments()
|
||||||
|
{
|
||||||
|
AllowedUnknownArguments = true;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +71,8 @@ public class LaunchArgumentParser
|
|||||||
public string CreateHelpArgMessage(string argAlias)
|
public string CreateHelpArgMessage(string argAlias)
|
||||||
{
|
{
|
||||||
StringBuilder b = new();
|
StringBuilder b = new();
|
||||||
var arg = ParseArg(argAlias);
|
if(!TryParseArg(argAlias, out var arg))
|
||||||
|
throw new Exception($"unknown argument '{argAlias}'");
|
||||||
arg.AppendHelpInfo(b);
|
arg.AppendHelpInfo(b);
|
||||||
return b.ToString();
|
return b.ToString();
|
||||||
}
|
}
|
||||||
@ -74,16 +84,13 @@ public class LaunchArgumentParser
|
|||||||
argDict.Add(alias, arg);
|
argDict.Add(alias, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LaunchArgument ParseArg(string argAlias)
|
public bool TryParseArg(string argAlias, out LaunchArgument arg)
|
||||||
{
|
{
|
||||||
// different argument providing patterns
|
// different argument providing patterns
|
||||||
if (!argDict.TryGetValue(argAlias, out var arg) && // arg
|
arg = null!;
|
||||||
!(argAlias.StartsWith("--") && argDict.TryGetValue(argAlias.Substring(2), out arg)) && // --arg
|
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
|
||||||
!(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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <param name="args">program launch args</param>
|
/// <param name="args">program launch args</param>
|
||||||
@ -93,14 +100,19 @@ public class LaunchArgumentParser
|
|||||||
public void ParseAndHandle(string[] args)
|
public void ParseAndHandle(string[] args)
|
||||||
{
|
{
|
||||||
// show help message and throw ExitAfterHelpException
|
// show help message and throw ExitAfterHelpException
|
||||||
if (args.Length == 0 && !IsAllowedNoArguments)
|
if (args.Length == 0 && !AllowedNoArguments)
|
||||||
HelpHandler();
|
HelpHandler();
|
||||||
|
|
||||||
List<LaunchArgument> execQueue = new();
|
List<LaunchArgument> execQueue = new();
|
||||||
|
|
||||||
for (int i = 0; i < args.Length; i++)
|
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++)
|
for (int j = 0; j < arg.Params.Length; j++)
|
||||||
{
|
{
|
||||||
if (++i >= args.Length)
|
if (++i >= args.Length)
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!--package info-->
|
<!--package info-->
|
||||||
<PackageId>DTLib</PackageId>
|
<PackageId>DTLib</PackageId>
|
||||||
<Version>1.7.2</Version>
|
<Version>1.7.3</Version>
|
||||||
<Authors>Timerix</Authors>
|
<Authors>Timerix</Authors>
|
||||||
<Description>Library for all my C# projects</Description>
|
<Description>Library for all my C# projects</Description>
|
||||||
<RepositoryType>GIT</RepositoryType>
|
<RepositoryType>GIT</RepositoryType>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user