Dirt.Args is a simple library for parsing command line arguments in .NET.
Its goal is to require no configuration and be a step up from using the built-in string[] args parameter in your Main method.
For more advanced scenarios, you should consider using a more feature-rich library.
Specifically, the following features are not supported:
- Displaying usage
- Validation of parameters
- Commands
- Parsing to anything other than strings
The library does support the following:
- Boolean Flags (e.g.
--foo) - Key-Value Pairs (e.g.
--foo=bar) - Using
--to separate flags from arguments (e.g.--foo -- --bar) - Counting repeated instances of a flag (e.g.
--foo --foo) - Short flags (e.g.
-f) - Multiple values for a single flag (e.g.
--foo=bar --foo=baz)
By default, values must be assigned using --flag=value. The LooseArgsSource provides an alternative that supports --flag value syntax:
var args = new Dirt.Args(new Dirt.LooseArgsSource());
// With: --output file.txt
var output = args.GetFlagValue("output"); // "file.txt"Loose values are collected until the next flag or -- separator:
// With: --files a.txt b.txt --verbose
var files = args.GetMultiFlagValue("files"); // ["a.txt", "b.txt"]
var verbose = args.HasFlag("verbose"); // trueBehavior notes:
- Long flags (
--flag) start a collection context for subsequent non-flag arguments - Explicit values (
--flag=value) do not start a collection context - Short flags (
-f) do not participate in loose argument collection - The
--separator stops all collection - Standard
--flag=valuesyntax continues to work alongside loose arguments
You can also wrap a custom IArgsSource:
var args = new Dirt.Args(new Dirt.LooseArgsSource(myCustomSource));var args = new Dirt.Args();
if (args.HasFlag("foo")) {
Console.WriteLine("Foo is set!");
}The IArgs interface exposes the following methods and properties
bool HasFlag(string flag)- Returns true if the flag was setint GetFlagCount(string flag)- Gets the number of times the flag was setstring GetValueFlag(string flag)- Gets the value of the flag, or null if it was not setIReadOnlyList<string> GetMultiValueFlag(string flag)- Gets the values of the flag, or an empty list if it was not setIReadOnlyList<string> Remaining- Any other arguments that are not flags
The Args class explicitly implements these properties from the IArgsData interface to allow access to the underlying data directly:
IReadOnlyDictionary<string, IFlagData> Flags- A dictionary of all flags that were set and their valuesIReadOnlyDictionary<string, string> ValueFlags- A dictionary of all key-value pairs that were setIReadOnlyDictionary<string, IReadOnlyList<string>> MultiValueFlags- A dictionary of all value flags with all their values
The ValueFlags and MultiValueFlags properties are projections of the data exposed by the Flags property.
The IFlagData interface exposes the following properties:
string Flag- The name of the flagint Count- The number of times the flag was setIReadOnlyList<string> Values- The values associated with the flag. This could be empty.
MIT