Quikline 0.2.1

There is a newer version of this package available.
See the version list below for details.
dotnet add package Quikline --version 0.2.1                
NuGet\Install-Package Quikline -Version 0.2.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Quikline" Version="0.2.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Quikline --version 0.2.1                
#r "nuget: Quikline, 0.2.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Quikline as a Cake Addin
#addin nuget:?package=Quikline&version=0.2.1

// Install Quikline as a Cake Tool
#tool nuget:?package=Quikline&version=0.2.1                

Quikline

Quikline provides an easy, intuitive API for creating your Command Line Interface.

Quikline is attribute based, create a struct and tag it with the [Command] attribute. Tag your options with [Option] and your positional arguments with [Argument].

Each of these have several properties for you to fill in to customize your API, the most important of which is the Description.

Features

  • Command

    • Automatically generates a help text
    • Can have a --version flag which is generated from the assembly version
    • Can have a short and a long name which is used for all subcommands and options
    • Discriminates between lower and upper case short names (e.g. -v and -V are different)
    • Can have a description which is used in the help text
  • Subcommand

    • Automatically generates a help text
    • Can have a description which is used in the help text
  • Option

    • Can have a short and a long name
    • Can be required
    • Can have a default value
    • Choose prefix for short and long names (default is - and -- respectively)
    • Discriminates between lower and upper case short names (e.g. -v and -V are different)
    • Provide a description which is used in the help text
  • Argument

    • Can be nullable (optional) or non-nullable (required)
    • Can have a default value (only for non-nullable and makes it optional)
    • Can have a description which is used in the help text
  • Args

    • Use this to group arguments and options together in a struct
    • Can have a short and a long name which is used for all subcommands and options inside the struct
    • Discriminates between lower and upper case short names (e.g. -v and -V are different)
    • Provide a description which is used in the help text
Relations
  • Inclusive
    • All options in the group must be provided
  • Exclusive
    • Only one option in the group can be provided
  • OneOrMore
    • At least one option in the group must be provided
  • OneWay
    • If option 'a' is provided option 'b' must also be provided, but not the other way around

Examples

Simple command

[Command(Version=true, Description="Create some tea")]
public readonly struct Tea {  
    [Option(Short='s', Description="Add a number of sugar cubes to the tea")]
    public readonly int Sugar;
    
    [Option(Short='m', Description="Add milk to the tea")]
    public readonly bool Milk;
    
    [Argument(Description="The type of tea")]
    public readonly TeaType TeaType;
    
    [Argument(Description="The temperature of the water", Default = 90)] // Celcius
    public readonly int Temperature;
}

public enum TeaType {
    Green,
    Black,
    White,
    Oolong,
    Herbal
}

Command with subcommands

[Command(Version = true, Description="Create a beverage")]
public readonly struct Beverage {
    public readonly Tea Tea;
    public readonly Coffee Coffee;
}

[Arg

[Subcommand(Description="Create some tea")]
public readonly struct Tea {  
    [Option(Short='s', Description="Add a number of sugar cubes to the tea")]
    public readonly int Sugar;
    
    [Option(Short='m', Description="Add milk to the tea")]
    public readonly bool Milk;
    
    [Argument(Description="The type of tea")]
    public readonly TeaType TeaType;
    
    // Default value makes it optional, you can also use nullable types
    [Argument(Description="The temperature of the water", Default = 90)]
    public readonly int Temperature;
}

[Subcommand(Description="Create some coffee")]
public readonly struct Coffee {
    [Option(Short='m', Description="Add milk to the coffee")]
    public readonly bool Milk;
    
    [Argument(Description="The type of coffee")]
    public readonly CoffeeType CoffeeType;
    
    [Argument(Description="The temperature of the water", Default = 90)]
    public readonly int Temperature;
}

public enum TeaType {
    Green,
    Black,
    White,
    Oolong,
    Herbal
}

public enum CoffeeType {
    Espresso,
    Americano,
    Latte,
    Cappuccino,
    Mocha
}

Command with relations

[Command(Version = true, Description="Create a beverage")]
// This ensures that if you want extra milk, you also have to have milk... which just makes sense
[OneWayRelation("milk", From = nameof(ExtraMilk), To = nameof(Milk))]
public readonly struct Tea {  
    [Option(Short='s', Description="Add a number of sugar cubes to the tea")]
    public readonly int Sugar;
    
    [Option(Short='m', Description="Add milk to the tea")]
    public readonly bool Milk;
    
    [Option(Short='M', Description="Add more milk to the tea")]
    public readonly bool ExtraMilk;
    
    [Argument(Description="The type of tea")]
    public readonly TeaType TeaType;
    
    [Argument(Description="The temperature of the water", Default = 90)]
    public readonly int Temperature;
}

public enum TeaType {
    Green,
    Black,
    White,
    Oolong,
    Herbal
}

Now that you've defined your commands structure, all you have to do is let Quikline do the magic:

var myCommand = Quik.Parse<MyCommand>();
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.3.0 84 5/22/2024
0.2.1 109 4/30/2024
0.2.0 100 4/30/2024
0.1.3 82 4/23/2024
0.1.2 86 4/23/2024
0.1.1 100 4/23/2024
0.1.0.1 91 4/23/2024
0.1.0 95 4/23/2024

The first update of Quikline v0.2.0. You can now have relationships between options or other relationships. Four simple relations are provided: Inclsive, Exclusive, OneOrMore, and OneWay. They can be combined to create complex relations between your CLIs options