Getting Started

Requirements

HatTrick.CommandLine targets .NET 9 or later. The package has one runtime dependency (HatTrick.Text.Templating) which NuGet resolves automatically.

Installation

dotnet add package HatTrick.CommandLine

Namespace: HatTrick.CommandLine

Features

FeatureSupportedDetails
Dot-path command naming & namespace groupingCommands and Namespaces
Terse (-f) and verbose (--format) flagsOptions and Flags
Positional argumentsOptions and Flags
Boolean flags (implicit true)Options and Flags
Terse flag chaining (-osf)Options and Flags
Built-in type conversion (numerics, DateOnly, Guid, TimeSpan, etc.)Option Types
Custom type converters (arrays, enums, domain types)Option Types
Default option values (static or dynamic)Constraints
Accepted-value listsConstraints
Custom option-level validationConstraints
Command-level validation (mutually exclusive / one-of sets)Constraints
Synchronous and async handlersHandlers
Pre-execution argument rewritingPre-Execution Hooks
Masked console input (passwords/secrets)Masked Input
POCO hydration / typed delegate mapping and invocationObject Mapping
Global, scoped, and wildcard help outputDefault Command
Built-in --version (assembly + dependency versions)Default Command
Interactive command loop (--run)Default Command
Typed exceptions for definition/parse/runtime errorsExceptions

A complete first program

static void Main(string[] args)
{
    //Register commands
    RegisterGuidCommand();

    //build and execute
    var registry = DefinitionRegistry.GetInstance();
    Command cmd = CommandBuilder.Build(args);
    CommandExecutor executor = registry.GetCommandExecutor(cmd);
    executor.Execute();
}

static void RegisterGuidCommand()
{
    //get a ref to the command definition registry
    var registry = DefinitionRegistry.GetInstance();

    //build a complete command definition
    var cmdDef = new CommandDefinition("guid");
    cmdDef.Help = "Generates one or many GUID values.";

    cmdDef.AddOption<string>(
        key: "format", 
        defaultArg: "D", 
        help: "GUID format specifier.", 
        (terse: "-f", verbose: "--format")
    );
    cmdDef["format"].AcceptedValues("N", "D", "B", "P", "X");

    cmdDef.AddOption<int>(
        key: "count", 
        defaultArg: 1, 
        help: "Number of GUIDs to generate.", 
        (terse: "-c", verbose: "--count")
    );
    cmdDef["count"].ApplyConstraint<int>(
        constraint: (cnt) => cnt > 0 && cnt <= 100, 
        name: "Allowed Range", 
        description: "1..100."
    );

    cmdDef.Handler = (cmd) =>
    {
        int count = cmd["count"].GetValue<int>();
        string format = cmd["format"].GetValue<string>();
        for (int i = 0; i < count; i++)
            Console.WriteLine(Guid.NewGuid().ToString(format));
    };

    //register the command definition
    registry.Add(cmdDef);
}

Next steps