2 stable releases

1.0.1 Nov 27, 2022
1.0.0 Nov 20, 2022

#514 in Build Utils

MIT license

17KB
354 lines

Crates.io

easy-cli

A tool for building personal and team CLI tools.

easy-cli takes a CLI-Tool name option and a path to a directory of scripts as arguments. It assumes each script ist to be a CLI command, and builds an appropriate CLI parser.

It could be used as an alias, but (in my experience, in zsh) this does not work with completion. You can define a function for your cli, for instance:

mycli() {
    <Path>/easy-cli --name mycli <Path-to-easy-cli-root>/example -- $@
}

and then calling

mycli

produces output:

error: 'mycli' requires a subcommand but one was not provided
  [subcommands: hello, list, help]

Usage: mycli <COMMAND>

For more information try '--help'

Then calling

mycli hello

will print

Hello, world!

Arguments trailing the command will be passed to the relevant script.

Argument-Parsing

easy-cli looks for metadata in the scripts regarding the command and arguments. Currently, the following patterns are recognised:

  • #@description <description>: Used in the command line help text to describe the command.
  • #@argument <argname> <has_args> <description>: Defines an argument usable as "--argname". It may or may not have values (has_args), and can have a help text (description)
  • #@anyarg: If present, allows the command to accept any argument. Otherwise, only the defined ones will be accepted.

Completion

easy-cli offers completion for your cli in a number of shells - those supported by clap_complete. To generate completions for your cli, run:

easy-cli --name <cli-name> <Path-to-cli-dir> --completions <shell> > <completions_file>

and proceed as required by your shell.

Next Planned Features

  1. CLI subcommands (for instance, cli <commandA> <subcommandA1>), to group related commands.
  2. Parsing script options from the script and adding them to the CLI, for better help.
  3. Environments, so that the CLI can easily be used to apply different environments (e.g. for staging).

Dependencies

~3–4.5MB
~72K SLoC