ClapNET

clapnet

Version Downloads

Small helper library that provides a simple way to use System.CommandLine by just passing a bunch of functions into a builder and creating a command line application.

Usage

It works great with the newly introduced dotnet scripts. More about the scripts here.

Logic for how the library turns a function into a command is straightforward:

  • each basic type (e.g. bool, string, int) parameter is turned into an argument
  • each class parameter is turned into bunch of options, where each field is turned into an option. Default values from class declaration are respected.
  • if return type is int then the command will return the value of the function. Otherwise, it will return 0.

Small example

This is a valid program that can be run from the command line:

#!/usr/bin/env dotnet run
#:package clapnet@0.2.*

return clapnet.CommandBuilder.New()
    .WithRootCommand(()=> Console.WriteLine("Hello world"), "Small program")
    .Run(args);

More feature-rich example

Example with extra settings and more commands:

#!/usr/bin/env dotnet run
#:package clapnet@0.3.*

var builder = clapnet.CommandBuilder.New();
return builder
    .UseCamelCase()
    .With(() => Console.WriteLine("ssss"), "Other function to call", "lambda_two")
    .With(Gather)
    .With(Failing)
    .With(() => Console.WriteLine("ssss"), "Test command", "lambda")
    .WithRootCommand(Other, "Super command to show what can be done")
    .Run(args);

/// <summary>
/// Documentation for gather command
/// </summary>
/// <param name="test2">extra argument</param>
/// <param name="assert">other argument</param>
void Gather(SomeSettings settings, string test2 = "some", bool assert = false)
{
    Console.WriteLine("Hello World argument test: {0}", test2);
}

void Other(SomeSettings settings)
{
    Console.WriteLine("Hello World from the root command");
    Console.WriteLine("Hello World from the root command");
}
/// <summary>
/// This command will fail
/// </summary>
int Failing()
{
    /// Returning non zero value
    return 1;
}

class SomeSettings
{
    /// <summary>
    /// Test value, first one.
    /// </summary>
    public bool TestV = false;
    /// <summary>
    /// Test value.
    /// </summary>
    public string other = "Default Value";
}

Now when called from the CLI it will print out:

 ./Test.cs -- --help
 Description:
   Super command to show what can be done
 
 Usage:
   Test [command] [options]
 
 Options:
   --testV          Test value, first one.
   --other <other>  Test value.
   -?, -h, --help   Show help and usage information
   --version        Show version information
 
 Commands:
   lambda_two               Other function to call
   gather <test2> <assert>  Documentation for gather command [default: some]
   failing                  This command will fail
   lambda                   Test command

Take a look at the examples directory for a simple example of how to use clapnet.

avatar

Piotr Siuszko

GameDev tool engineer, C#/C++ at day, Rust at night.


See all projects