--- title: Make your own CLI --- import Alert from '@theme/Alert' Tauri enables your app to have a CLI through clap, a robust command line argument parser. With a simple CLI definition in your `tauri.conf.json` file, you can define your interface and read its argument matches map on JavaScript and/or Rust. ## Base Configuration Under `tauri.conf.json`, you have the following structure to configure the interface: ```js title=src-tauri/tauri.conf.json { "tauri": { "cli": { "description": "", // command description that's shown on help "longDescription": "", // command long description that's shown on help "beforeHelp": "", // content to show before the help text "afterHelp": "", // content to show after the help text "args": [], // list of arguments of the command, we'll explain it later "subcommands": { "subcommand-name": { // configures a subcommand that is accessible // with `$ ./app subcommand-name --arg1 --arg2 --etc` // configuration as above, with "description", "args", etc. } } } } } ``` All JSON configurations here are just samples, many other fields have been omitted for the sake of clarity. ## Adding Arguments The `args` array represents the list of arguments accepted by its command or subcommand. You can find more details about the way to configure them here. ### Positional Arguments A positional argument is identified by its position in the list of arguments. With the following configuration: ```json title=src-tauri/tauri.conf.json:tauri.cli { "args": [ { "name": "source", "index": 1 }, { "name": "destination", "index": 2 } ] } ``` Users can run your app as `$ ./app tauri.txt dest.txt` and the arg matches map will define `source` as `"tauri.txt"` and `destination` as `"dest.txt"`. ### Named Arguments A named argument is a (key, value) pair where the key identifies the value. With the following configuration: ```json title=src-tauri/tauri.conf.json:tauri.cli { "args": [ { "name": "type", "short": "t", "takesValue": true, "multiple": true, "possibleValues": ["foo", "bar"] } ] } ``` Users can run your app as `$ ./app --type foo bar`, `$ ./app -t foo -t bar` or `$ ./app --type=foo,bar` and the arg matches map will define `type` as `["foo", "bar"]`. ### Flag Arguments A flag argument is a standalone key whose presence or absence provides information to your application. With the following configuration: ```js title=src-tauri/tauri.conf.json:tauri.cli { "args": [ "name": "verbose", "short": "v", "multipleOccurrences": true ] } ``` Users can run your app as `$ ./app -v -v -v`, `$ ./app --verbose --verbose --verbose` or `$ ./app -vvv` and the arg matches map will define `verbose` as `true`, with `occurrences = 3`. ## Subcommands Some CLI applications has additional interfaces as subcommands. For instance, the `git` CLI has `git branch`, `git commit` and `git push`. You can define additional nested interfaces with the `subcommands` array: ```js title=src-tauri/tauri.conf.json:tauri { "cli": { ... "subcommands": { "branch": { "args": [] }, "push": { "args": [] } } } } ``` Its configuration is the same as the root application configuration, with the `description`, `longDescription`, `args`, etc. ## Reading the matches ### Rust ```rust use tauri::cli::get_matches; fn main() { match get_matches() { Some(matches) => { // `matches` here is a Struct with { args, subcommand } // where args is the HashMap mapping each arg's name to it's { value, occurrences } // and subcommand is an Option of { name, matches } } } } ``` ### JavaScript ```js import { getMatches } from '@tauri-apps/api/cli' getMatches().then((matches) => { // do something with the { args, subcommand } matches }) ``` ## Complete documentation You can find more about the CLI configuration here.