2016-05-14 20:25:00 +00:00
// Copyright ⓒ 2015-2016 Kevin B. Knapp and [`clap-rs` contributors](https://github.com/kbknapp/clap-rs/blob/master/CONTRIBUTORS.md).
2016-01-31 13:03:09 +00:00
// Licensed under the MIT license
// (see LICENSE or <http://opensource.org/licenses/MIT>) All files in the project carrying such
// notice may not be copied, modified, or distributed except according to those terms.
2016-11-21 01:48:49 +00:00
//! `clap` is a simple-to-use, efficient, and full-featured library for parsing command line
//! arguments and subcommands when writing console/terminal applications.
2015-10-01 21:27:29 +00:00
//!
//! ## About
//!
2016-11-21 01:48:49 +00:00
//! `clap` is used to parse *and validate* the string of command line arguments provided by the user
//! at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means
//! you focus on your *applications* functionality, and less on the parsing and validating of
//! arguments.
2016-01-27 22:09:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! `clap` also provides the traditional version and help switches (or flags) 'for free' meaning
2019-10-18 17:53:02 +00:00
//! automatically with no configuration. It does this by checking the list of valid possibilities you
2016-11-21 01:48:49 +00:00
//! supplied and adding only the ones you haven't already defined. If you are using subcommands,
//! `clap` will also auto-generate a `help` subcommand for you in addition to the traditional flags.
2016-01-27 22:09:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! Once `clap` parses the user provided string of arguments, it returns the matches along with any
//! applicable values. If the user made an error or typo, `clap` informs them of the mistake and
//! exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to
//! exit). Because of this, you can make reasonable assumptions in your code about the validity of
//! the arguments.
2016-01-27 22:09:01 +00:00
//!
//!
//! ## Quick Example
//!
2016-11-21 01:48:49 +00:00
//! The following examples show a quick example of some of the very basic functionality of `clap`.
//! For more advanced usage, such as requirements, conflicts, groups, multiple values and
2018-06-30 23:33:34 +00:00
//! occurrences see the [documentation](https://docs.rs/clap/), [examples/] directory of
//! this repository or the [video tutorials].
2016-01-27 22:09:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! **NOTE:** All of these examples are functionally the same, but show different styles in which to
//! use `clap`
2016-01-27 22:09:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! The first example shows a method that allows more advanced configuration options (not shown in
//! this small example), or even dynamically generating arguments when desired. The downside is it's
//! more verbose.
2017-10-06 11:14:01 +00:00
//!
2016-11-21 02:27:17 +00:00
//! ```no_run
2016-01-27 22:09:01 +00:00
//! // (Full example with detailed comments in examples/01b_quick_example.rs)
2015-10-01 21:27:29 +00:00
//! //
2016-01-27 22:09:01 +00:00
//! // This example demonstrates clap's full 'builder pattern' style of creating arguments which is
//! // more verbose, but allows easier editing, and at times more advanced options, or the possibility
//! // to generate arguments dynamically.
2018-10-19 20:42:13 +00:00
//! use clap::{Arg, App, };
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! fn main() {
2016-01-27 22:09:01 +00:00
//! let matches = App::new("My Super Program")
//! .version("1.0")
//! .author("Kevin K. <kbknapp@gmail.com>")
//! .about("Does awesome things")
//! .arg(Arg::with_name("config")
2018-07-23 19:09:42 +00:00
//! .short('c')
2016-01-27 22:09:01 +00:00
//! .long("config")
//! .value_name("FILE")
//! .help("Sets a custom config file")
//! .takes_value(true))
//! .arg(Arg::with_name("INPUT")
//! .help("Sets the input file to use")
//! .required(true)
//! .index(1))
//! .arg(Arg::with_name("v")
2018-07-23 19:09:42 +00:00
//! .short('v')
2016-01-27 22:09:01 +00:00
//! .multiple(true)
//! .help("Sets the level of verbosity"))
2018-10-19 20:42:13 +00:00
//! .subcommand(App::new("test")
2016-01-27 22:09:01 +00:00
//! .about("controls testing features")
//! .version("1.3")
//! .author("Someone E. <someone_else@other.com>")
//! .arg(Arg::with_name("debug")
2018-07-23 19:09:42 +00:00
//! .short('d')
2016-01-27 22:09:01 +00:00
//! .help("print debug information verbosely")))
//! .get_matches();
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! // Gets a value for config if supplied by user, or defaults to "default.conf"
//! let config = matches.value_of("config").unwrap_or("default.conf");
2015-10-01 21:27:29 +00:00
//! println!("Value for config: {}", config);
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! // Calling .unwrap() is safe here because "INPUT" is required (if "INPUT" wasn't
//! // required we could have used an 'if let' to conditionally get the value)
//! println!("Using input file: {}", matches.value_of("INPUT").unwrap());
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! // Vary the output based on how many times the user used the "verbose" flag
//! // (i.e. 'myprog -v -v -v' or 'myprog -vvv' vs 'myprog -v'
//! match matches.occurrences_of("v") {
//! 0 => println!("No verbose info"),
//! 1 => println!("Some verbose info"),
//! 2 => println!("Tons of verbose info"),
2015-10-01 21:27:29 +00:00
//! 3 | _ => println!("Don't be crazy"),
//! }
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! // You can handle information about subcommands by requesting their matches by name
//! // (as below), requesting just the name used, or both at the same time
2015-10-01 21:27:29 +00:00
//! if let Some(matches) = matches.subcommand_matches("test") {
2016-01-27 22:09:01 +00:00
//! if matches.is_present("debug") {
//! println!("Printing debug info...");
2015-10-01 21:27:29 +00:00
//! } else {
//! println!("Printing normally...");
//! }
//! }
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! // more program logic goes here...
//! }
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! The next example shows a far less verbose method, but sacrifices some of the advanced
//! configuration options (not shown in this small example). This method also takes a *very* minor
//! runtime penalty.
2017-10-06 11:14:01 +00:00
//!
2016-11-21 02:27:17 +00:00
//! ```no_run
2016-01-27 22:09:01 +00:00
//! // (Full example with detailed comments in examples/01a_quick_example.rs)
2015-10-01 21:27:29 +00:00
//! //
2016-10-15 02:58:36 +00:00
//! // This example demonstrates clap's "usage strings" method of creating arguments
//! // which is less verbose
2018-10-19 20:42:13 +00:00
//! use clap::{Arg, App, };
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! fn main() {
//! let matches = App::new("myapp")
2016-01-27 22:09:01 +00:00
//! .version("1.0")
//! .author("Kevin K. <kbknapp@gmail.com>")
//! .about("Does awesome things")
2018-10-19 20:42:13 +00:00
//! .arg("-c, --config=[FILE] 'Sets a custom config file'")
//! .arg("<INPUT> 'Sets the input file to use'")
//! .arg("-v... 'Sets the level of verbosity'")
//! .subcommand(App::new("test")
2016-01-27 22:09:01 +00:00
//! .about("controls testing features")
//! .version("1.3")
//! .author("Someone E. <someone_else@other.com>")
2018-10-19 20:42:13 +00:00
//! .arg("-d, --debug 'Print debug information'"))
2016-01-27 22:09:01 +00:00
//! .get_matches();
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! // Same as previous example...
2015-10-01 21:27:29 +00:00
//! }
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! This third method shows how you can use a YAML file to build your CLI and keep your Rust source
//! tidy or support multiple localized translations by having different YAML files for each
//! localization.
//!
//! First, create the `cli.yml` file to hold your CLI options, but it could be called anything we
//! like:
2017-10-06 11:14:01 +00:00
//!
2015-10-02 00:03:31 +00:00
//! ```yaml
2015-10-01 21:27:29 +00:00
//! name: myapp
2016-11-21 01:48:49 +00:00
//! version: "1.0"
2015-10-01 21:27:29 +00:00
//! author: Kevin K. <kbknapp@gmail.com>
//! about: Does awesome things
//! args:
2016-01-27 22:09:01 +00:00
//! - config:
2015-10-01 21:27:29 +00:00
//! short: c
//! long: config
2016-01-27 22:09:01 +00:00
//! value_name: FILE
2015-10-01 21:27:29 +00:00
//! help: Sets a custom config file
//! takes_value: true
//! - INPUT:
//! help: Sets the input file to use
//! required: true
//! index: 1
2016-01-27 22:09:01 +00:00
//! - verbose:
//! short: v
2015-10-01 21:27:29 +00:00
//! multiple: true
2016-01-27 22:09:01 +00:00
//! help: Sets the level of verbosity
2015-10-01 21:27:29 +00:00
//! subcommands:
//! - test:
//! about: controls testing features
2016-11-21 01:48:49 +00:00
//! version: "1.3"
2015-10-01 21:27:29 +00:00
//! author: Someone E. <someone_else@other.com>
//! args:
2016-01-27 22:09:01 +00:00
//! - debug:
//! short: d
//! help: print debug information
2015-10-01 21:27:29 +00:00
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! Since this feature requires additional dependencies that not everyone may want, it is *not*
//! compiled in by default and we need to enable a feature flag in Cargo.toml:
2015-10-01 21:27:29 +00:00
//!
2017-10-25 00:30:11 +00:00
//! Simply change your `clap = "~2.27.0"` to `clap = {version = "~2.27.0", features = ["yaml"]}`.
2016-10-15 21:37:59 +00:00
//!
//! At last we create our `main.rs` file just like we would have with the previous two examples:
2017-10-06 11:14:01 +00:00
//!
2016-11-21 02:27:17 +00:00
//! ```ignore
2015-10-01 21:27:29 +00:00
//! // (Full example with detailed comments in examples/17_yaml.rs)
//! //
2016-01-27 22:09:01 +00:00
//! // This example demonstrates clap's building from YAML style of creating arguments which is far
//! // more clean, but takes a very small performance hit compared to the other two methods.
2015-10-01 21:27:29 +00:00
//! use clap::App;
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! fn main() {
2016-01-27 22:09:01 +00:00
//! // The YAML file is found relative to the current file, similar to how modules are found
2015-10-01 21:27:29 +00:00
//! let yaml = load_yaml!("cli.yml");
//! let matches = App::from_yaml(yaml).get_matches();
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! // Same as previous examples...
2015-10-01 21:27:29 +00:00
//! }
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! Finally there is a macro version, which is like a hybrid approach offering the speed of the
//! builder pattern (the first example), but without all the verbosity.
2017-10-06 11:14:01 +00:00
//!
2016-11-21 02:27:17 +00:00
//! ```no_run
2019-11-11 13:28:30 +00:00
//! use clap::clap_app;
2016-11-21 01:48:49 +00:00
//! fn main() {
//! let matches = clap_app!(myapp =>
//! (version: "1.0")
//! (author: "Kevin K. <kbknapp@gmail.com>")
//! (about: "Does awesome things")
//! (@arg CONFIG: -c --config +takes_value "Sets a custom config file")
//! (@arg INPUT: +required "Sets the input file to use")
//! (@arg debug: -d ... "Sets the level of debugging information")
//! (@subcommand test =>
//! (about: "controls testing features")
//! (version: "1.3")
//! (author: "Someone E. <someone_else@other.com>")
//! (@arg verbose: -v --verbose "Print test information verbosely")
//! )
//! ).get_matches();
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! // Same as before...
//! }
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! If you were to compile any of the above programs and run them with the flag `--help` or `-h` (or
//! `help` subcommand, since we defined `test` as a subcommand) the following would be output
2017-10-06 11:14:01 +00:00
//!
2016-11-21 02:27:17 +00:00
//! ```text
2016-01-27 22:09:01 +00:00
//! $ myprog --help
//! My Super Program 1.0
2015-10-01 21:27:29 +00:00
//! Kevin K. <kbknapp@gmail.com>
//! Does awesome things
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! USAGE:
//! MyApp [FLAGS] [OPTIONS] <INPUT> [SUBCOMMAND]
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! FLAGS:
//! -h, --help Prints this message
2016-01-27 22:09:01 +00:00
//! -v Sets the level of verbosity
2015-10-01 21:27:29 +00:00
//! -V, --version Prints version information
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! OPTIONS:
2016-01-27 22:09:01 +00:00
//! -c, --config <FILE> Sets a custom config file
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ARGS:
//! INPUT The input file to use
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! SUBCOMMANDS:
//! help Prints this message
//! test Controls testing features
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! **NOTE:** You could also run `myapp test --help` to see similar output and options for the
//! `test` subcommand.
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ## Try it!
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ### Pre-Built Test
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! To try out the pre-built example, use the following steps:
2017-10-06 11:14:01 +00:00
//!
2016-11-12 07:08:54 +00:00
//! * Clone the repository `$ git clone https://github.com/kbknapp/clap-rs && cd clap-rs/tests`
2015-10-01 21:27:29 +00:00
//! * Compile the example `$ cargo build --release`
//! * Run the help info `$ ./target/release/claptests --help`
//! * Play with the arguments!
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ### BYOB (Build Your Own Binary)
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! To test out `clap`'s default auto-generated help/version follow these steps:
2017-02-20 22:13:06 +00:00
//!
2016-11-21 01:48:49 +00:00
//! * Create a new cargo project `$ cargo new fake --bin && cd fake`
//! * Add `clap` to your `Cargo.toml`
2016-11-21 02:27:17 +00:00
//!
2016-11-21 01:48:49 +00:00
//! ```toml
//! [dependencies]
//! clap = "2"
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! * Add the following to your `src/main.rs`
2017-10-06 11:14:01 +00:00
//!
2016-11-21 02:27:17 +00:00
//! ```no_run
2015-10-01 21:27:29 +00:00
//! use clap::App;
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! fn main() {
2016-01-27 22:09:01 +00:00
//! App::new("fake").version("v1.0-beta").get_matches();
2015-10-01 21:27:29 +00:00
//! }
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! * Build your program `$ cargo build --release`
//! * Run with help or version `$ ./target/release/fake --help` or `$ ./target/release/fake
//! --version`
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ## Usage
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! For full usage, add `clap` as a dependency in your `Cargo.toml` (it is **highly** recommended to
//! use the `~major.minor.patch` style versions in your `Cargo.toml`, for more information see
//! [Compatibility Policy](#compatibility-policy)) to use from crates.io:
2017-10-06 11:14:01 +00:00
//!
2016-10-15 02:58:36 +00:00
//! ```toml
//! [dependencies]
2017-10-25 00:30:11 +00:00
//! clap = "~2.27.0"
2016-10-15 02:58:36 +00:00
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-10-15 02:58:36 +00:00
//! Or get the latest changes from the master branch at github:
2017-10-06 11:14:01 +00:00
//!
2015-10-02 00:03:31 +00:00
//! ```toml
2015-10-01 21:27:29 +00:00
//! [dependencies.clap]
//! git = "https://github.com/kbknapp/clap-rs.git"
//! ```
2017-10-06 11:14:01 +00:00
//!
//! Define a list of valid arguments for your program (see the
2018-06-30 23:33:34 +00:00
//! [documentation](https://docs.rs/clap/) or [examples/] directory of this repo)
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! Then run `cargo build` or `cargo update && cargo build` for your project.
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ### Optional Dependencies / Features
2017-10-06 11:14:01 +00:00
//!
2016-10-15 02:58:36 +00:00
//! #### Features enabled by default
2017-10-06 11:14:01 +00:00
//!
2020-04-04 20:16:30 +00:00
//! * `derive`: Enables the custom derive (i.e. `#[derive(Clap)]`). Without this you must use one of the other methods of creating a `clap` CLI listed above
2017-06-08 18:42:10 +00:00
//! * `suggestions`: Turns on the `Did you mean '--myoption'?` feature for when users make typos. (builds dependency `strsim`)
2020-04-04 20:16:30 +00:00
//! * `color`: Turns on colored error messages. This feature only works on non-Windows OSs. (builds dependency `ansi-term`)
2017-10-06 11:14:01 +00:00
//!
2016-10-15 02:58:36 +00:00
//! To disable these, add this to your `Cargo.toml`:
2017-10-06 11:14:01 +00:00
//!
2015-10-02 00:03:31 +00:00
//! ```toml
2015-10-01 21:27:29 +00:00
//! [dependencies.clap]
2017-10-25 00:30:11 +00:00
//! version = "~2.27.0"
2015-10-01 21:27:29 +00:00
//! default-features = false
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-01-27 22:09:01 +00:00
//! You can also selectively enable only the features you'd like to include, by adding:
2017-10-06 11:14:01 +00:00
//!
2015-10-02 00:03:31 +00:00
//! ```toml
2015-10-01 21:27:29 +00:00
//! [dependencies.clap]
2017-10-25 00:30:11 +00:00
//! version = "~2.27.0"
2015-10-01 21:27:29 +00:00
//! default-features = false
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! # Cherry-pick the features you'd like to use
//! features = [ "suggestions", "color" ]
//! ```
2017-10-06 11:14:01 +00:00
//!
2016-10-15 02:58:36 +00:00
//! #### Opt-in features
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! * **"yaml"**: Enables building CLIs from YAML documents. (builds dependency `yaml-rust`)
//! * **"unstable"**: Enables unstable `clap` features that may change from release to release
2020-04-04 20:16:30 +00:00
//! * **"wrap_help"**: Turns on the help text wrapping feature, based on the terminal size. (builds dependency `term-size`)
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! ### Dependencies Tree
2017-10-06 11:14:01 +00:00
//!
//! The following graphic depicts `clap`s dependency graph (generated using
2016-11-21 01:48:49 +00:00
//! [cargo-graph](https://github.com/kbknapp/cargo-graph)).
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! * **Dashed** Line: Optional dependency
//! * **Red** Color: **NOT** included by default (must use cargo `features` to enable)
//! * **Blue** Color: Dev dependency, only used while developing.
2017-10-06 11:14:01 +00:00
//!
2017-12-27 03:56:50 +00:00
//! ![clap dependencies](https://raw.githubusercontent.com/kbknapp/clap-rs/master/clap_dep_graph.png)
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ### More Information
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! You can find complete documentation on the [docs.rs](https://docs.rs/clap/) for this project.
2017-10-06 11:14:01 +00:00
//!
2018-06-30 23:33:34 +00:00
//! You can also find usage examples in the [examples/] directory of this repo.
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! #### Video Tutorials
2017-10-06 11:14:01 +00:00
//!
2018-06-30 23:33:34 +00:00
//! There's also the video tutorial series [Argument Parsing with Rust v2][video tutorials].
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! These videos slowly trickle out as I finish them and currently a work in progress.
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! ## How to Contribute
2017-10-06 11:14:01 +00:00
//!
2020-01-31 09:05:52 +00:00
//! Please read [CONTRIBUTING.md](https://raw.githubusercontent.com/clap-rs/clap/master/.github/CONTRIBUTING.md) before you start contributing.
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! ### Goals
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! There are a few goals of `clap` that I'd like to maintain throughout contributions. If your
//! proposed changes break, or go against any of these goals we'll discuss the changes further
//! before merging (but will *not* be ignored, all contributes are welcome!). These are by no means
//! hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by
//! mistake or ignorance).
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! * Remain backwards compatible when possible
//! - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before
//! removing legacy code - This does not apply for security concerns
//! * Parse arguments quickly
//! - Parsing of arguments shouldn't slow down usage of the main program - This is also true of
//! generating help and usage information (although *slightly* less stringent, as the program is about
//! to exit)
//! * Try to be cognizant of memory usage
//! - Once parsing is complete, the memory footprint of `clap` should be low since the main program
//! is the star of the show
//! * `panic!` on *developer* error, exit gracefully on *end-user* error
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! ### Compatibility Policy
//!
2017-06-08 18:42:10 +00:00
//! Because `clap` takes `SemVer` and compatibility seriously, this is the official policy regarding
2016-11-21 01:48:49 +00:00
//! breaking changes and previous versions of Rust.
//!
//! `clap` will pin the minimum required version of Rust to the CI builds. Bumping the minimum
//! version of Rust is considered a minor breaking change, meaning *at a minimum* the minor version
//! of `clap` will be bumped.
//!
//! In order to keep from being suprised of breaking changes, it is **highly** recommended to use
//! the `~major.minor.patch` style in your `Cargo.toml`:
//!
2017-10-06 11:14:01 +00:00
//! ```toml
2017-10-25 00:30:11 +00:00
//! [dependencies] clap = "~2.27.0"
2015-10-01 21:27:29 +00:00
//! ```
//!
2016-11-21 01:48:49 +00:00
//! This will cause *only* the patch version to be updated upon a `cargo update` call, and therefore
//! cannot break due to new features, or bumped minimum versions of Rust.
2016-10-15 02:58:36 +00:00
//!
2016-11-21 01:48:49 +00:00
//! #### Minimum Version of Rust
2016-10-15 02:58:36 +00:00
//!
2016-11-21 01:48:49 +00:00
//! `clap` will officially support current stable Rust, minus two releases, but may work with prior
2017-10-25 00:30:11 +00:00
//! releases as well. For example, current stable Rust at the time of this writing is 1.21.0,
//! meaning `clap` is guaranteed to compile with 1.19.0 and beyond. At the 1.22.0 release, `clap`
//! will be guaranteed to compile with 1.20.0 and beyond, etc.
2017-10-06 11:14:01 +00:00
//!
2016-11-21 01:48:49 +00:00
//! Upon bumping the minimum version of Rust (assuming it's within the stable-2 range), it *must* be
//! clearly annotated in the `CHANGELOG.md`
2017-10-06 11:14:01 +00:00
//!
2015-10-01 21:27:29 +00:00
//! ## License
2017-10-06 11:14:01 +00:00
//!
2018-06-30 23:33:34 +00:00
//! `clap` is licensed under the MIT license. Please read the [LICENSE-MIT][license] file in
2016-11-21 01:48:49 +00:00
//! this repository for more information.
2018-06-30 23:33:34 +00:00
//!
//! [examples/]: https://github.com/kbknapp/clap-rs/tree/master/examples
//! [video tutorials]: https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U
//! [license]: https://raw.githubusercontent.com/kbknapp/clap-rs/master/LICENSE-MIT
2015-10-01 23:48:25 +00:00
2017-11-28 12:30:06 +00:00
#![ crate_type = " lib " ]
2019-04-05 02:06:23 +00:00
#![ doc(html_root_url = " https://docs.rs/clap/3.0.0-beta.1 " ) ]
2019-04-05 19:51:22 +00:00
#![ deny(
missing_docs ,
missing_debug_implementations ,
missing_copy_implementations ,
trivial_casts ,
unused_import_braces ,
unused_allocation ,
trivial_numeric_casts
) ]
2015-08-20 01:44:25 +00:00
2020-02-02 01:02:10 +00:00
#[ cfg(not(feature = " std " )) ]
2020-03-19 07:17:52 +00:00
compile_error! ( " `std` feature is currently required to build `clap` " ) ;
2020-02-02 01:02:10 +00:00
2020-04-27 18:47:08 +00:00
pub use crate ::{
build ::{ App , AppSettings , Arg , ArgGroup , ArgSettings } ,
derive ::{ ArgEnum , Clap , FromArgMatches , IntoApp , Subcommand } ,
parse ::errors ::{ Error , ErrorKind , Result } ,
2020-04-29 18:34:59 +00:00
parse ::{ ArgMatches , OsValues , Values } ,
2020-04-27 18:47:08 +00:00
} ;
2020-02-14 16:22:01 +00:00
2018-07-23 19:09:42 +00:00
#[ cfg(feature = " yaml " ) ]
pub use yaml_rust ::YamlLoader ;
2015-02-25 13:37:25 +00:00
2018-07-13 15:36:53 +00:00
#[ cfg(feature = " derive " ) ]
#[ cfg_attr(feature = " derive " , doc(hidden)) ]
2019-12-29 15:53:12 +00:00
pub use clap_derive ::{ self , * } ;
#[ cfg(feature = " derive " ) ]
#[ cfg_attr(feature = " derive " , doc(hidden)) ]
pub use lazy_static ;
2018-07-13 15:36:53 +00:00
2015-04-10 15:40:08 +00:00
#[ macro_use ]
2020-01-01 17:57:44 +00:00
#[ allow(missing_docs) ]
pub mod macros ;
2018-07-26 15:15:47 +00:00
2020-02-08 19:36:00 +00:00
pub mod derive ;
2018-07-23 19:09:42 +00:00
mod build ;
2018-07-19 12:50:47 +00:00
mod mkeymap ;
2018-07-23 19:09:42 +00:00
mod output ;
2018-06-12 15:42:03 +00:00
mod parse ;
mod util ;
2016-01-11 08:59:56 +00:00
2018-11-14 17:12:34 +00:00
const INTERNAL_ERROR_MSG : & str = " Fatal internal error. Please consider filing a bug \
2020-02-05 10:04:59 +00:00
report at https ://github.com/clap-rs/clap/issues";
2018-11-14 17:12:34 +00:00
const INVALID_UTF8 : & str = " unexpected invalid UTF-8 code point " ;