COmmand LIne PARSer
Another library for parsing command line arguments using C#. Depends on .Net Standard 2.0
Has a default implementation to output to the console and get its configuration from attributes on a classes, but can be extended to output to something else or fetch its configuration from configuration files or other sources.
create --name test -d 0.42
[Verb("create")]
class CreateCommand
{
[NamedOption("name", Description = "Name of the element to create")]
public string Name { get; set; }
[NamedOption("double", Alias = "d", Description = "A floating point value.")]
public double Number { get; set; }
}
setPosition 0.40 -100
[Verb("setPosition")]
class SetPositionCommand
{
[PositionalOption(0, Description = "X coordinate")]
public float X { get; set; }
[PositionalOption(1, Description = "Y coordinate")]
public float Y { get; set; }
}
Supports flags and lists with custom converters based on TypeConverters.
convert -vvv -names Alfred Freddy Jason
[Verb("convert")]
class ConvertCommand
{
[CollectionTypeConverter(typeof(UserConverter))]
[NamedCollectionOption("names", Alias = "n")]
public ICollection<User> Users { get; } = new List<User>();
[TypeConverter(typeof(VerbosityLevelConverter))]
[FlagOption("verbosity", ShortHand = "v")]
public VerbosityLevel Verbosity { get; set; }
}
Uses a special CollectionTypeConverter attribute to specify a converter for the elements of a collection instead of the whole collection.
var exitCode = Parsers.Setup.ClassAttributes<Command>().Parse(args).Map(
(Command command) => command.Execute(),
(IEnumerable<IError> errors) => 1
);
var command = Parsers.Setup.ClassAttributes<Command>().Parse(args).GetCustomObject<Command>();
Help can be shown by using the -h flag or from code, this includes the description of the attributes.
Parsers.Setup.ClassAttributes<Command>().ShowHelp();
If a default command is specified, the verb doesn't have to be specified at the beginning of the argument list.
Parsers.Setup.ClassAttributes<ConvertCommand>((c) => c.UseAsDefault<ConvertCommand>());
Per default, the local use always CultureInfo.InvariantCulture, that can be changed in a similar way.
Parsers.Setup.ClassAttributes<SetPositionCommand>((c) => c.CultureInfo = CultureInfo.CurrentCulture);
It's possible to use the Verb attributes not only on classes but also on methods.
class MyContainer
{
[Verb("handleNumbers")]
public int HandleNumbers([NamedCollectionOption("numbers")] IEnumerable<int> numbers)
{
...
return 0;
}
}
Parsers.Setup.MethodAttributes<MyContainer>().Parse(args).Execute();