public static void Main()
ParseArgs(["-f", "foo", "-f", "bar", "-f", "baz"]);
private static void PrintUsage(OptionSchema schema, TextWriter output)
"usage: command [Options...] [--] Arguments...",
var messages = usage.Concat(schema.GetHelpMessage());
foreach (var m in messages)
public static void ParseArgs(string[] args)
var schema = Options.NewSchema()
.Add("file", 'f', "FILE", "Specify an input file")
.Add("help", 'h', "Show help and exit");
var setting = schema.Parse(args);
var options = setting.Options;
var arguments = setting.Arguments;
foreach (var o in options)
PrintUsage(schema, Console.Out);
if (o is RequiredArgumentOption a)
var arg = a.ArgumentValue;
var all = string.Join(",", a.ArgumentValues);
Console.WriteLine($"{arg} {all}");
catch (OptionParsingException e)
var output = Console.Error;
output.WriteLine(e.Message);
PrintUsage(schema, output);