From c77b3e074263dbe3658cff01a6153d6ffd7a66c6 Mon Sep 17 00:00:00 2001 From: Timerix Date: Sat, 26 Apr 2025 04:37:15 +0500 Subject: [PATCH] LaunchArgumentParser.UnknownArguments --- DTLib/Console/LaunchArgumentParser.cs | 38 ++++++++++++++++++--------- DTLib/DTLib.csproj | 2 +- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/DTLib/Console/LaunchArgumentParser.cs b/DTLib/Console/LaunchArgumentParser.cs index 092dc86..22156b9 100644 --- a/DTLib/Console/LaunchArgumentParser.cs +++ b/DTLib/Console/LaunchArgumentParser.cs @@ -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 UnknownArguments = new(); private readonly Dictionary argDict = new(); private readonly List 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 } /// program launch args @@ -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 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) diff --git a/DTLib/DTLib.csproj b/DTLib/DTLib.csproj index 419e646..a4b4f60 100644 --- a/DTLib/DTLib.csproj +++ b/DTLib/DTLib.csproj @@ -2,7 +2,7 @@ DTLib - 1.7.2 + 1.7.3 Timerix Library for all my C# projects GIT