Haxe library for creating command line applications
Haxe library to make command line applications with ease. Primarily created to power up dreamengine-cli project.
Install it with haxelib install comma
then you can use it with import comma.*;
Code example below will create a command line application without any commands.
class Main{ static function main(){ // pass third parameter true for apps with single command var app = new CliApp("TestCliApp","0.1.0"); app.start(); } }To extend its behaviour, create command classes.
class HelloWorldCommand extends comma.Command{ override function getName(){ return "hello"; } override function getDescription(){ return "Prints \"hello, world!\""; } override function onExecuted(app:CliApp, values:Array<String>, options:ParsedOptions){ app.println("Hello, world!"); } }then, register your command to CliApp instance, before starting your application.
var app = new CliApp("TestCliApp", "0.1.0"); app.addCommand(new HelloWorldCommand()); app.start();To execute a specific command, return value of getName() is used to find in registered commands. The result would be
~ yourApp hello Hello, world! You can define options and values for commands using addOptionDefinition(OptionDefinition) and addValueDefinition(ValueDefinition) functions respectively. Call them in the constructor
class HelloWorld extends comma.Command{ public function new(){ super(); addValueDefinition(new ValueDefinition("name")); addOptionDefinition(new OptionDefinition("shout","s","Write the name with capital letters")); } }OptionDefinition takes a name, an alias and a description. This example option can be used either with --shout or -s
if number of value definitions and provided values do not match, execution will break and print help text for the command
~ yourApp hello Usage: hello [name]: Prints "hello, world!" to use options and values while executing the command use following:
override function onExecuted(app:CliApp, values:Array<String>, options:ParsedOptions){ var text = values[0] + ": Hello, world!"; if (options.exists("shout")){ text = text.toUpperCase(); } app.println(text); }result will be following:
~ yourApp hello Haxe Haxe: Hello, world! ~ yourApp hello Haxe --shout HAXE: HELLO, WORLD! commands can contain values. Anything provided after the option until another option is passed as array of strings
if (options.exists("shout")){ text = text.toUpperCase() + " " + options.get("shout").join("-"); }will result as
~ yourApp hello Haxe --shout some irrelevant values HAXE: HELLO, WORLD! some-irrelevant-values Default command is executed if no command is provided. By default, the first registered command is the default command, unless specified otherwise with CliApp.setDefaultCommand(command)
Use CliApp.prompt(String) function to request input from user.
override function onExecuted(app:CliApp, values:Array<String>, options:ParsedOptions){ app.println("Hello there, " + app.prompt("What is your name?")); }~ yourApp What is your name?: Foo Hello there, Foo Style class can be used to stylize the output.
Style.color(String, TextColor) converts given string to colored string
Style.background(String, BackgroundColor) sets the background color of the given string.
Style.textStyle(String, TextStyle) sets the style of the given string. (Bold, Underline, Reversed)
Style.space(Int) places space given times
Style.tabs(Int, Bool=true) places tabs given times, second parameter decides whether to use \t or 4x spaces.
Style.compose(String) creates a builder to combine multiple style functions.
var stylizedText = Style.compose("Hello, world!").setTextStyle(Bold).setTextColor(Red).setBackgroundColor(Blue).build(); cliApp.println(stylizedText);use CliApp.printHelp() to print help text.