LaunchArgumentParser.HelpMessageHeader
This commit is contained in:
parent
ee20c9c5ec
commit
823169ca91
@ -2,55 +2,44 @@ namespace DTLib.Console;
|
|||||||
|
|
||||||
public class LaunchArgumentParser
|
public class LaunchArgumentParser
|
||||||
{
|
{
|
||||||
|
public string HelpMessageHeader = "USAGE:";
|
||||||
public bool IsAllowedNoArguments;
|
public bool IsAllowedNoArguments;
|
||||||
|
|
||||||
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();
|
||||||
|
|
||||||
public class ExitAfterHelpException : Exception
|
|
||||||
{
|
|
||||||
internal ExitAfterHelpException() : base("your program can use this exception to exit after displaying help message")
|
|
||||||
{ }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string CreateHelpMessage()
|
|
||||||
{
|
|
||||||
StringBuilder b = new();
|
|
||||||
foreach (var arg in argList)
|
|
||||||
arg.AppendHelpInfo(b).Append('\n');
|
|
||||||
b.Remove(b.Length-1, 1);
|
|
||||||
return b.ToString();
|
|
||||||
}
|
|
||||||
public string CreateHelpArgMessage(string argAlias)
|
|
||||||
{
|
|
||||||
StringBuilder b = new();
|
|
||||||
var arg = Parse(argAlias);
|
|
||||||
arg.AppendHelpInfo(b);
|
|
||||||
return b.ToString();
|
|
||||||
}
|
|
||||||
private void HelpHandler()
|
|
||||||
{
|
|
||||||
System.Console.WriteLine(CreateHelpMessage());
|
|
||||||
throw new ExitAfterHelpException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HelpArgHandler(string argAlias)
|
|
||||||
{
|
|
||||||
System.Console.WriteLine(CreateHelpArgMessage(argAlias));
|
|
||||||
throw new ExitAfterHelpException();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public LaunchArgumentParser()
|
public LaunchArgumentParser()
|
||||||
{
|
{
|
||||||
var help = new LaunchArgument(new[] { "h", "help" },
|
var help = new LaunchArgument(new[] { "h", "help" },
|
||||||
"shows help message", HelpHandler);
|
"shows help message", HelpHandler);
|
||||||
Add(help);
|
Add(help);
|
||||||
var helpArg = new LaunchArgument( new[]{ "ha", "helparg" },
|
var helpArg = new LaunchArgument(new[] { "ha", "helparg" },
|
||||||
"shows help message for particular argument",
|
"shows help message for specific argument",
|
||||||
HelpArgHandler, "argAlias");
|
HelpArgHandler, "argument");
|
||||||
Add(helpArg);
|
Add(helpArg);
|
||||||
}
|
}
|
||||||
|
public LaunchArgumentParser(ICollection<LaunchArgument> arguments) : this() => WithArgs(arguments);
|
||||||
|
public LaunchArgumentParser(params LaunchArgument[] arguments) : this() => WithArgs(arguments);
|
||||||
|
|
||||||
|
public LaunchArgumentParser WithArgs(IEnumerable<LaunchArgument> args)
|
||||||
|
{
|
||||||
|
foreach (var arg in args)
|
||||||
|
Add(arg);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LaunchArgumentParser WithArgs(params LaunchArgument[] args)
|
||||||
|
{
|
||||||
|
foreach (var arg in args)
|
||||||
|
Add(arg);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LaunchArgumentParser WithHelpMessageHeader(string header)
|
||||||
|
{
|
||||||
|
HelpMessageHeader = header;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public LaunchArgumentParser AllowNoArguments()
|
public LaunchArgumentParser AllowNoArguments()
|
||||||
{
|
{
|
||||||
@ -58,15 +47,24 @@ public class LaunchArgumentParser
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LaunchArgumentParser(ICollection<LaunchArgument> arguments) : this()
|
|
||||||
|
public string CreateHelpMessage()
|
||||||
{
|
{
|
||||||
foreach (var arg in arguments)
|
StringBuilder b = new(HelpMessageHeader);
|
||||||
Add(arg);
|
foreach (var arg in argList)
|
||||||
|
{
|
||||||
|
b.Append('\n');
|
||||||
|
arg.AppendHelpInfo(b);
|
||||||
|
}
|
||||||
|
return b.ToString();
|
||||||
}
|
}
|
||||||
public LaunchArgumentParser(params LaunchArgument[] arguments) : this()
|
|
||||||
|
public string CreateHelpArgMessage(string argAlias)
|
||||||
{
|
{
|
||||||
foreach (var arg in arguments)
|
StringBuilder b = new();
|
||||||
Add(arg);
|
var arg = ParseArg(argAlias);
|
||||||
|
arg.AppendHelpInfo(b);
|
||||||
|
return b.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Add(LaunchArgument arg)
|
public void Add(LaunchArgument arg)
|
||||||
@ -76,13 +74,13 @@ public class LaunchArgumentParser
|
|||||||
argDict.Add(alias, arg);
|
argDict.Add(alias, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LaunchArgument Parse(string argAlias)
|
public LaunchArgument ParseArg(string argAlias)
|
||||||
{
|
{
|
||||||
// different argument providing patterns
|
// different argument providing patterns
|
||||||
if (!argDict.TryGetValue(argAlias, out var arg) && // arg
|
if (!argDict.TryGetValue(argAlias, out var arg) && // arg
|
||||||
!(argAlias.StartsWith("--") && argDict.TryGetValue(argAlias.Substring(2), out 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
|
||||||
!(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()}");
|
throw new Exception($"invalid argument: {argAlias}\n{CreateHelpMessage()}");
|
||||||
|
|
||||||
return arg;
|
return arg;
|
||||||
@ -102,11 +100,12 @@ public class LaunchArgumentParser
|
|||||||
|
|
||||||
for (int i = 0; i < args.Length; i++)
|
for (int i = 0; i < args.Length; i++)
|
||||||
{
|
{
|
||||||
LaunchArgument arg = Parse(args[i]);
|
var arg = ParseArg(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)
|
||||||
throw new Exception($"argument '{arg.Aliases[0]}' should have parameter '{arg.Params[j]}' after it");
|
throw new Exception(
|
||||||
|
$"argument '{arg.Aliases[0]}' should have parameter '{arg.Params[j]}' after it");
|
||||||
arg.Params[j].Value = args[i];
|
arg.Params[j].Value = args[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,9 +113,29 @@ public class LaunchArgumentParser
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ascending sort by priority
|
// ascending sort by priority
|
||||||
execQueue.Sort((a0, a1) => a0.Priority-a1.Priority);
|
execQueue.Sort((a0, a1) => a0.Priority - a1.Priority);
|
||||||
// finally executing handlers
|
// finally executing handlers
|
||||||
foreach (var a in execQueue)
|
foreach (var a in execQueue)
|
||||||
a.Handle();
|
a.Handle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HelpHandler()
|
||||||
|
{
|
||||||
|
System.Console.WriteLine(CreateHelpMessage());
|
||||||
|
throw new ExitAfterHelpException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HelpArgHandler(string argAlias)
|
||||||
|
{
|
||||||
|
System.Console.WriteLine(CreateHelpArgMessage(argAlias));
|
||||||
|
throw new ExitAfterHelpException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ExitAfterHelpException : Exception
|
||||||
|
{
|
||||||
|
public ExitAfterHelpException()
|
||||||
|
: base("your program can use this exception to exit after displaying help message")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user