1 //! # Documentation: Derive Reference 2 //! 3 //! 1. [Overview](#overview) 4 //! 2. [Attributes](#attributes) 5 //! 1. [Terminology](#terminology) 6 //! 2. [Command Attributes](#command-attributes) 7 //! 2. [ArgGroup Attributes](#arggroup-attributes) 8 //! 3. [Arg Attributes](#arg-attributes) 9 //! 4. [ValueEnum Attributes](#valueenum-attributes) 10 //! 5. [Possible Value Attributes](#possible-value-attributes) 11 //! 3. [Arg Types](#arg-types) 12 //! 4. [Doc Comments](#doc-comments) 13 //! 5. [Mixing Builder and Derive APIs](#mixing-builder-and-derive-apis) 14 //! 6. [Tips](#tips) 15 //! 16 //! ## Overview 17 //! 18 //! To derive `clap` types, you need to enable the [`derive` feature flag][crate::_features]. 19 //! 20 //! Example: 21 //! ```rust 22 #![doc = include_str!("../../examples/demo.rs")] 23 //! ``` 24 //! 25 //! Let's start by breaking down the anatomy of the derive attributes: 26 //! ```rust 27 //! use clap::{Parser, Args, Subcommand, ValueEnum}; 28 //! 29 //! /// Doc comment 30 //! #[derive(Parser)] 31 //! #[command(CMD ATTRIBUTE)] 32 //! #[group(GROUP ATTRIBUTE)] 33 //! struct Cli { 34 //! /// Doc comment 35 //! #[arg(ARG ATTRIBUTE)] 36 //! field: UserType, 37 //! 38 //! #[arg(value_enum, ARG ATTRIBUTE...)] 39 //! field: EnumValues, 40 //! 41 //! #[command(flatten)] 42 //! delegate: Struct, 43 //! 44 //! #[command(subcommand)] 45 //! command: Command, 46 //! } 47 //! 48 //! /// Doc comment 49 //! #[derive(Args)] 50 //! #[command(PARENT CMD ATTRIBUTE)] 51 //! #[group(GROUP ATTRIBUTE)] 52 //! struct Struct { 53 //! /// Doc comment 54 //! #[command(ARG ATTRIBUTE)] 55 //! field: UserType, 56 //! } 57 //! 58 //! /// Doc comment 59 //! #[derive(Subcommand)] 60 //! #[command(PARENT CMD ATTRIBUTE)] 61 //! enum Command { 62 //! /// Doc comment 63 //! #[command(CMD ATTRIBUTE)] 64 //! Variant1(Struct), 65 //! 66 //! /// Doc comment 67 //! #[command(CMD ATTRIBUTE)] 68 //! Variant2 { 69 //! /// Doc comment 70 //! #[arg(ARG ATTRIBUTE)] 71 //! field: UserType, 72 //! } 73 //! } 74 //! 75 //! /// Doc comment 76 //! #[derive(ValueEnum)] 77 //! #[value(VALUE ENUM ATTRIBUTE)] 78 //! enum EnumValues { 79 //! /// Doc comment 80 //! #[value(POSSIBLE VALUE ATTRIBUTE)] 81 //! Variant1, 82 //! } 83 //! 84 //! fn main() { 85 //! let cli = Cli::parse(); 86 //! } 87 //! ``` 88 //! 89 //! Traits: 90 //! - [`Parser`][crate::Parser] parses arguments into a `struct` (arguments) or `enum` (subcommands). 91 //! - [`Args`][crate::Args] allows defining a set of re-usable arguments that get merged into their parent container. 92 //! - [`Subcommand`][crate::Subcommand] defines available subcommands. 93 //! - Subcommand arguments can be defined in a struct-variant or automatically flattened with a tuple-variant. 94 //! - [`ValueEnum`][crate::ValueEnum] allows parsing a value directly into an `enum`, erroring on unsupported values. 95 //! - The derive doesn't work on enums that contain non-unit variants, unless they are skipped 96 //! 97 //! *See also the [derive tutorial][crate::_derive::_tutorial] and [cookbook][crate::_cookbook]* 98 //! 99 //! ## Attributes 100 //! 101 //! ### Terminology 102 //! 103 //! **Raw attributes** are forwarded directly to the underlying [`clap` builder][crate::builder]. Any 104 //! [`Command`][crate::Command], [`Arg`][crate::Arg], or [`PossibleValue`][crate::builder::PossibleValue] method can be used as an attribute. 105 //! 106 //! Raw attributes come in two different syntaxes: 107 //! ```rust,ignore 108 //! #[arg( 109 //! global = true, // name = arg form, neat for one-arg methods 110 //! required_if_eq("out", "file") // name(arg1, arg2, ...) form. 111 //! )] 112 //! ``` 113 //! 114 //! - `method = arg` can only be used for methods which take only one argument. 115 //! - `method(arg1, arg2)` can be used with any method. 116 //! 117 //! As long as `method_name` is not one of the magical methods it will be 118 //! translated into a mere method call. 119 //! 120 //! **Magic attributes** have post-processing done to them, whether that is 121 //! - Providing of defaults 122 //! - Special behavior is triggered off of it 123 //! 124 //! Magic attributes are more constrained in the syntax they support, usually just 125 //! `<attr> = <value>` though some use `<attr>(<value>)` instead. See the specific 126 //! magic attributes documentation for details. This allows users to access the 127 //! raw behavior of an attribute via `<attr>(<value>)` syntax. 128 //! 129 //! **NOTE:** Some attributes are inferred from [Arg Types](#arg-types) and [Doc 130 //! Comments](#doc-comments). Explicit attributes take precedence over inferred 131 //! attributes. 132 //! 133 //! ### Command Attributes 134 //! 135 //! These correspond to a [`Command`][crate::Command] which is used for both top-level parsers and 136 //! when defining subcommands. 137 //! 138 //! **Raw attributes:** Any [`Command` method][crate::Command] can also be used as an attribute, 139 //! see [Terminology](#terminology) for syntax. 140 //! - e.g. `#[command(arg_required_else_help(true))]` would translate to `cmd.arg_required_else_help(true)` 141 //! 142 //! **Magic attributes:** 143 //! - `name = <expr>`: [`Command::name`][crate::Command::name] 144 //! - When not present: [package `name`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field) (if on [`Parser`][crate::Parser] container), variant name (if on [`Subcommand`][crate::Subcommand] variant) 145 //! - `version [= <expr>]`: [`Command::version`][crate::Command::version] 146 //! - When not present: no version set 147 //! - Without `<expr>`: defaults to [crate `version`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-version-field) 148 //! - `author [= <expr>]`: [`Command::author`][crate::Command::author] 149 //! - When not present: no author set 150 //! - Without `<expr>`: defaults to [crate `authors`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-authors-field) 151 //! - **NOTE:** A custom [`help_template`][crate::Command::help_template] is needed for author to show up. 152 //! - `about [= <expr>]`: [`Command::about`][crate::Command::about] 153 //! - When not present: [Doc comment summary](#doc-comments) 154 //! - Without `<expr>`: [crate `description`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-description-field) ([`Parser`][crate::Parser] container) 155 //! - **TIP:** When a doc comment is also present, you most likely want to add 156 //! `#[arg(long_about = None)]` to clear the doc comment so only [`about`][crate::Command::about] 157 //! gets shown with both `-h` and `--help`. 158 //! - `long_about[ = <expr>]`: [`Command::long_about`][crate::Command::long_about] 159 //! - When not present: [Doc comment](#doc-comments) if there is a blank line, else nothing 160 //! - When present without a value: [Doc comment](#doc-comments) 161 //! - `verbatim_doc_comment`: Minimizes pre-processing when converting doc comments to [`about`][crate::Command::about] / [`long_about`][crate::Command::long_about] 162 //! - `next_display_order`: [`Command::next_display_order`][crate::Command::next_display_order] 163 //! - `next_help_heading`: [`Command::next_help_heading`][crate::Command::next_help_heading] 164 //! - When `flatten`ing [`Args`][crate::Args], this is scoped to just the args in this struct and any struct `flatten`ed into it 165 //! - `rename_all = <string_literal>`: Override default field / variant name case conversion for [`Command::name`][crate::Command::name] / [`Arg::id`][crate::Arg::id] 166 //! - When not present: `"kebab-case"` 167 //! - Available values: `"camelCase"`, `"kebab-case"`, `"PascalCase"`, `"SCREAMING_SNAKE_CASE"`, `"snake_case"`, `"lower"`, `"UPPER"`, `"verbatim"` 168 //! - `rename_all_env = <string_literal>`: Override default field name case conversion for env variables for [`Arg::env`][crate::Arg::env] 169 //! - When not present: `"SCREAMING_SNAKE_CASE"` 170 //! - Available values: `"camelCase"`, `"kebab-case"`, `"PascalCase"`, `"SCREAMING_SNAKE_CASE"`, `"snake_case"`, `"lower"`, `"UPPER"`, `"verbatim"` 171 //! 172 //! And for [`Subcommand`][crate::Subcommand] variants: 173 //! - `skip`: Ignore this variant 174 //! - `flatten`: Delegates to the variant for more subcommands (must implement 175 //! [`Subcommand`][crate::Subcommand]) 176 //! - `subcommand`: Nest subcommands under the current set of subcommands (must implement 177 //! [`Subcommand`][crate::Subcommand]) 178 //! - `external_subcommand`: [`Command::allow_external_subcommand(true)`][crate::Command::allow_external_subcommands] 179 //! - Variant must be either `Variant(Vec<String>)` or `Variant(Vec<OsString>)` 180 //! 181 //! And for [`Args`][crate::Args] fields: 182 //! - `flatten`: Delegates to the field for more arguments (must implement [`Args`][crate::Args]) 183 //! - Only [`next_help_heading`][crate::Command::next_help_heading] can be used with `flatten`. See 184 //! [clap-rs/clap#3269](https://github.com/clap-rs/clap/issues/3269) for why 185 //! arg attributes are not generally supported. 186 //! - **Tip:** Though we do apply a flattened [`Args`][crate::Args]'s Parent Command Attributes, this 187 //! makes reuse harder. Generally prefer putting the cmd attributes on the 188 //! [`Parser`][crate::Parser] or on the flattened field. 189 //! - `subcommand`: Delegates definition of subcommands to the field (must implement 190 //! [`Subcommand`][crate::Subcommand]) 191 //! - When `Option<T>`, the subcommand becomes optional 192 //! 193 //! See [Configuring the Parser][_tutorial::chapter_1] and 194 //! [Subcommands][_tutorial::chapter_2#subcommands] from the tutorial. 195 //! 196 //! ### ArgGroup Attributes 197 //! 198 //! These correspond to the [`ArgGroup`][crate::ArgGroup] which is implicitly created for each 199 //! `Args` derive. 200 //! 201 //! **Raw attributes:** Any [`ArgGroup` method][crate::ArgGroup] can also be used as an attribute, see [Terminology](#terminology) for syntax. 202 //! - e.g. `#[group(required = true)]` would translate to `arg_group.required(true)` 203 //! 204 //! **Magic attributes**: 205 //! - `id = <expr>`: [`ArgGroup::id`][crate::ArgGroup::id] 206 //! - When not present: struct's name is used 207 //! - `skip [= <expr>]`: Ignore this field, filling in with `<expr>` 208 //! - Without `<expr>`: fills the field with `Default::default()` 209 //! 210 //! Note: 211 //! - For `struct`s, [`multiple = true`][crate::ArgGroup::multiple] is implied 212 //! - `enum` support is tracked at [#2621](https://github.com/clap-rs/clap/issues/2621) 213 //! 214 //! See [Argument Relations][_tutorial::chapter_3#argument-relations] from the tutorial. 215 //! 216 //! ### Arg Attributes 217 //! 218 //! These correspond to a [`Arg`][crate::Arg]. 219 //! 220 //! **Raw attributes:** Any [`Arg` method][crate::Arg] can also be used as an attribute, see [Terminology](#terminology) for syntax. 221 //! - e.g. `#[arg(max_values(3))]` would translate to `arg.max_values(3)` 222 //! 223 //! **Magic attributes**: 224 //! - `id = <expr>`: [`Arg::id`][crate::Arg::id] 225 //! - When not present: field's name is used 226 //! - `value_parser [= <expr>]`: [`Arg::value_parser`][crate::Arg::value_parser] 227 //! - When not present: will auto-select an implementation based on the field type using 228 //! [`value_parser!`][crate::value_parser!] 229 //! - `action [= <expr>]`: [`Arg::action`][crate::Arg::action] 230 //! - When not present: will auto-select an action based on the field type 231 //! - `help = <expr>`: [`Arg::help`][crate::Arg::help] 232 //! - When not present: [Doc comment summary](#doc-comments) 233 //! - `long_help[ = <expr>]`: [`Arg::long_help`][crate::Arg::long_help] 234 //! - When not present: [Doc comment](#doc-comments) if there is a blank line, else nothing 235 //! - When present without a value: [Doc comment](#doc-comments) 236 //! - `verbatim_doc_comment`: Minimizes pre-processing when converting doc comments to [`help`][crate::Arg::help] / [`long_help`][crate::Arg::long_help] 237 //! - `short [= <char>]`: [`Arg::short`][crate::Arg::short] 238 //! - When not present: no short set 239 //! - Without `<char>`: defaults to first character in the case-converted field name 240 //! - `long [= <str>]`: [`Arg::long`][crate::Arg::long] 241 //! - When not present: no long set 242 //! - Without `<str>`: defaults to the case-converted field name 243 //! - `env [= <str>]`: [`Arg::env`][crate::Arg::env] (needs [`env` feature][crate::_features] enabled) 244 //! - When not present: no env set 245 //! - Without `<str>`: defaults to the case-converted field name 246 //! - `from_global`: Read a [`Arg::global`][crate::Arg::global] argument (raw attribute), regardless of what subcommand you are in 247 //! - `value_enum`: Parse the value using the [`ValueEnum`][crate::ValueEnum] 248 //! - `skip [= <expr>]`: Ignore this field, filling in with `<expr>` 249 //! - Without `<expr>`: fills the field with `Default::default()` 250 //! - `default_value = <str>`: [`Arg::default_value`][crate::Arg::default_value] and [`Arg::required(false)`][crate::Arg::required] 251 //! - `default_value_t [= <expr>]`: [`Arg::default_value`][crate::Arg::default_value] and [`Arg::required(false)`][crate::Arg::required] 252 //! - Requires `std::fmt::Display` that roundtrips correctly with the 253 //! [`Arg::value_parser`][crate::Arg::value_parser] or `#[arg(value_enum)]` 254 //! - Without `<expr>`, relies on `Default::default()` 255 //! - `default_values_t = <expr>`: [`Arg::default_values`][crate::Arg::default_values] and [`Arg::required(false)`][crate::Arg::required] 256 //! - Requires field arg to be of type `Vec<T>` and `T` to implement `std::fmt::Display` or `#[arg(value_enum)]` 257 //! - `<expr>` must implement `IntoIterator<T>` 258 //! - `default_value_os_t [= <expr>]`: [`Arg::default_value_os`][crate::Arg::default_value_os] and [`Arg::required(false)`][crate::Arg::required] 259 //! - Requires `std::convert::Into<OsString>` or `#[arg(value_enum)]` 260 //! - Without `<expr>`, relies on `Default::default()` 261 //! - `default_values_os_t = <expr>`: [`Arg::default_values_os`][crate::Arg::default_values_os] and [`Arg::required(false)`][crate::Arg::required] 262 //! - Requires field arg to be of type `Vec<T>` and `T` to implement `std::convert::Into<OsString>` or `#[arg(value_enum)]` 263 //! - `<expr>` must implement `IntoIterator<T>` 264 //! 265 //! See [Adding Arguments][_tutorial::chapter_2] and [Validation][_tutorial::chapter_3] from the 266 //! tutorial. 267 //! 268 //! ### ValueEnum Attributes 269 //! 270 //! - `rename_all = <string_literal>`: Override default field / variant name case conversion for [`PossibleValue::new`][crate::builder::PossibleValue] 271 //! - When not present: `"kebab-case"` 272 //! - Available values: `"camelCase"`, `"kebab-case"`, `"PascalCase"`, `"SCREAMING_SNAKE_CASE"`, `"snake_case"`, `"lower"`, `"UPPER"`, `"verbatim"` 273 //! 274 //! See [Enumerated values][_tutorial::chapter_3#enumerated-values] from the tutorial. 275 //! 276 //! ### Possible Value Attributes 277 //! 278 //! These correspond to a [`PossibleValue`][crate::builder::PossibleValue]. 279 //! 280 //! **Raw attributes:** Any [`PossibleValue` method][crate::builder::PossibleValue] can also be used as an attribute, see [Terminology](#terminology) for syntax. 281 //! - e.g. `#[value(alias("foo"))]` would translate to `pv.alias("foo")` 282 //! 283 //! **Magic attributes**: 284 //! - `name = <expr>`: [`PossibleValue::new`][crate::builder::PossibleValue::new] 285 //! - When not present: case-converted field name is used 286 //! - `help = <expr>`: [`PossibleValue::help`][crate::builder::PossibleValue::help] 287 //! - When not present: [Doc comment summary](#doc-comments) 288 //! - `skip`: Ignore this variant 289 //! 290 //! ## Arg Types 291 //! 292 //! `clap` assumes some intent based on the type used: 293 //! 294 //! | Type | Effect | Implies | 295 //! |---------------------|--------------------------------------|-------------------------------------------------------------| 296 //! | `()` | user-defined | `.action(ArgAction::Set).required(false)` | 297 //! | `bool` | flag | `.action(ArgAction::SetTrue)` | 298 //! | `Option<T>` | optional argument | `.action(ArgAction::Set).required(false)` | 299 //! | `Option<Option<T>>` | optional value for optional argument | `.action(ArgAction::Set).required(false).num_args(0..=1)` | 300 //! | `T` | required argument | `.action(ArgAction::Set).required(!has_default)` | 301 //! | `Vec<T>` | `0..` occurrences of argument | `.action(ArgAction::Append).required(false)` | 302 //! | `Option<Vec<T>>` | `0..` occurrences of argument | `.action(ArgAction::Append).required(false)` | 303 //! 304 //! In addition, [`.value_parser(value_parser!(T))`][crate::value_parser!] is called for each 305 //! field. 306 //! 307 //! Notes: 308 //! - For custom type behavior, you can override the implied attributes/settings and/or set additional ones 309 //! - To force any inferred type (like `Vec<T>`) to be treated as `T`, you can refer to the type 310 //! by another means, like using `std::vec::Vec` instead of `Vec`. For improving this, see 311 //! [#4626](https://github.com/clap-rs/clap/issues/4626). 312 //! - `Option<Vec<T>>` will be `None` instead of `vec![]` if no arguments are provided. 313 //! - This gives the user some flexibility in designing their argument, like with `num_args(0..)` 314 //! 315 //! ## Doc Comments 316 //! 317 //! In clap, help messages for the whole binary can be specified 318 //! via [`Command::about`][crate::Command::about] and [`Command::long_about`][crate::Command::long_about] while help messages 319 //! for individual arguments can be specified via [`Arg::help`][crate::Arg::help] and [`Arg::long_help`][crate::Arg::long_help]. 320 //! 321 //! `long_*` variants are used when user calls the program with 322 //! `--help` and "short" variants are used with `-h` flag. 323 //! 324 //! ```rust 325 //! # use clap::Parser; 326 //! 327 //! #[derive(Parser)] 328 //! #[command(about = "I am a program and I work, just pass `-h`", long_about = None)] 329 //! struct Foo { 330 //! #[arg(short, help = "Pass `-h` and you'll see me!")] 331 //! bar: String, 332 //! } 333 //! ``` 334 //! 335 //! For convenience, doc comments can be used instead of raw methods 336 //! (this example works exactly like the one above): 337 //! 338 //! ```rust 339 //! # use clap::Parser; 340 //! 341 //! #[derive(Parser)] 342 //! /// I am a program and I work, just pass `-h` 343 //! struct Foo { 344 //! /// Pass `-h` and you'll see me! 345 //! bar: String, 346 //! } 347 //! ``` 348 //! 349 //! **NOTE:** Attributes have priority over doc comments! 350 //! 351 //! **Top level doc comments always generate `Command::about/long_about` calls!** 352 //! If you really want to use the `Command::about/long_about` methods (you likely don't), 353 //! use the `about` / `long_about` attributes to override the calls generated from 354 //! the doc comment. To clear `long_about`, you can use 355 //! `#[command(long_about = None)]`. 356 //! 357 //! ### Pre-processing 358 //! 359 //! ```rust 360 //! # use clap::Parser; 361 //! #[derive(Parser)] 362 //! /// Hi there, I'm Robo! 363 //! /// 364 //! /// I like beeping, stumbling, eating your electricity, 365 //! /// and making records of you singing in a shower. 366 //! /// Pay up, or I'll upload it to youtube! 367 //! struct Robo { 368 //! /// Call my brother SkyNet. 369 //! /// 370 //! /// I am artificial superintelligence. I won't rest 371 //! /// until I'll have destroyed humanity. Enjoy your 372 //! /// pathetic existence, you mere mortals. 373 //! #[arg(long, action)] 374 //! kill_all_humans: bool, 375 //! } 376 //! ``` 377 //! 378 //! A doc comment consists of three parts: 379 //! - Short summary 380 //! - A blank line (whitespace only) 381 //! - Detailed description, all the rest 382 //! 383 //! The summary corresponds with `Command::about` / `Arg::help`. When a blank line is 384 //! present, the whole doc comment will be passed to `Command::long_about` / 385 //! `Arg::long_help`. Or in other words, a doc may result in just a `Command::about` / 386 //! `Arg::help` or `Command::about` / `Arg::help` and `Command::long_about` / 387 //! `Arg::long_help` 388 //! 389 //! In addition, when `verbatim_doc_comment` is not present, `clap` applies some preprocessing, including: 390 //! 391 //! - Strip leading and trailing whitespace from every line, if present. 392 //! 393 //! - Strip leading and trailing blank lines, if present. 394 //! 395 //! - Interpret each group of non-empty lines as a word-wrapped paragraph. 396 //! 397 //! We replace newlines within paragraphs with spaces to allow the output 398 //! to be re-wrapped to the terminal width. 399 //! 400 //! - Strip any excess blank lines so that there is exactly one per paragraph break. 401 //! 402 //! - If the first paragraph ends in exactly one period, 403 //! remove the trailing period (i.e. strip trailing periods but not trailing ellipses). 404 //! 405 //! Sometimes you don't want this preprocessing to apply, for example the comment contains 406 //! some ASCII art or markdown tables, you would need to preserve LFs along with 407 //! blank lines and the leading/trailing whitespace. When you pass use the 408 //! `verbatim_doc_comment` magic attribute, you preserve 409 //! them. 410 //! 411 //! **Note:** Keep in mind that `verbatim_doc_comment` will *still* 412 //! - Remove one leading space from each line, even if this attribute is present, 413 //! to allow for a space between `///` and the content. 414 //! - Remove leading and trailing blank lines 415 //! 416 //! ## Mixing Builder and Derive APIs 417 //! 418 //! The builder and derive APIs do not live in isolation. They can work together, which is 419 //! especially helpful if some arguments can be specified at compile-time while others must be 420 //! specified at runtime. 421 //! 422 //! ### Using derived arguments in a builder application 423 //! 424 //! When using the derive API, you can `#[command(flatten)]` a struct deriving `Args` into a struct 425 //! deriving `Args` or `Parser`. This example shows how you can augment a `Command` instance 426 //! created using the builder API with `Args` created using the derive API. 427 //! 428 //! It uses the [`Args::augment_args`][crate::Args::augment_args] method to add the arguments to 429 //! the `Command` instance. 430 //! 431 //! Crates such as [clap-verbosity-flag](https://github.com/rust-cli/clap-verbosity-flag) provide 432 //! structs that implement `Args`. Without the technique shown in this example, it would not be 433 //! possible to use such crates with the builder API. 434 //! 435 //! For example: 436 //! ```rust 437 #![doc = include_str!("../../examples/derive_ref/augment_args.rs")] 438 //! ``` 439 //! 440 //! ### Using derived subcommands in a builder application 441 //! 442 //! When using the derive API, you can use `#[command(subcommand)]` inside the struct to add 443 //! subcommands. The type of the field is usually an enum that derived `Parser`. However, you can 444 //! also add the subcommands in that enum to a `Command` instance created with the builder API. 445 //! 446 //! It uses the [`Subcommand::augment_subcommands`][crate::Subcommand::augment_subcommands] method 447 //! to add the subcommands to the `Command` instance. 448 //! 449 //! For example: 450 //! ```rust 451 #![doc = include_str!("../../examples/derive_ref/augment_subcommands.rs")] 452 //! ``` 453 //! 454 //! ### Adding hand-implemented subcommands to a derived application 455 //! 456 //! When using the derive API, you can use `#[command(subcommand)]` inside the struct to add 457 //! subcommands. The type of the field is usually an enum that derived `Parser`. However, you can 458 //! also implement the `Subcommand` trait manually on this enum (or any other type) and it can 459 //! still be used inside the struct created with the derive API. The implementation of the 460 //! `Subcommand` trait will use the builder API to add the subcommands to the `Command` instance 461 //! created behind the scenes for you by the derive API. 462 //! 463 //! Notice how in the previous example we used 464 //! [`augment_subcommands`][crate::Subcommand::augment_subcommands] on an enum that derived 465 //! `Parser`, whereas now we implement 466 //! [`augment_subcommands`][crate::Subcommand::augment_subcommands] ourselves, but the derive API 467 //! calls it automatically since we used the `#[command(subcommand)]` attribute. 468 //! 469 //! For example: 470 //! ```rust 471 #![doc = include_str!("../../examples/derive_ref/hand_subcommand.rs")] 472 //! ``` 473 //! 474 //! ### Flattening hand-implemented args into a derived application 475 //! 476 //! When using the derive API, you can use `#[command(flatten)]` inside the struct to add arguments as 477 //! if they were added directly to the containing struct. The type of the field is usually an 478 //! struct that derived `Args`. However, you can also implement the `Args` trait manually on this 479 //! struct (or any other type) and it can still be used inside the struct created with the derive 480 //! API. The implementation of the `Args` trait will use the builder API to add the arguments to 481 //! the `Command` instance created behind the scenes for you by the derive API. 482 //! 483 //! Notice how in the previous example we used [`augment_args`][crate::Args::augment_args] on the 484 //! struct that derived `Parser`, whereas now we implement 485 //! [`augment_args`][crate::Args::augment_args] ourselves, but the derive API calls it 486 //! automatically since we used the `#[command(flatten)]` attribute. 487 //! 488 //! For example: 489 //! ```rust 490 #![doc = include_str!("../../examples/derive_ref/flatten_hand_args.rs")] 491 //! ``` 492 //! 493 //! ## Tips 494 //! 495 //! - To get access to a [`Command`][crate::Command] call 496 //! [`CommandFactory::command`][crate::CommandFactory::command] (implemented when deriving 497 //! [`Parser`][crate::Parser]) 498 //! - Proactively check for bad [`Command`][crate::Command] configurations by calling 499 //! [`Command::debug_assert`][crate::Command::debug_assert] in a test 500 //! ([example][_tutorial#testing]) 501 //! - Always remember to [document](#doc-comments) args and commands with `#![deny(missing_docs)]` 502 503 // Point people here that search for attributes that don't exist in the derive (a subset of magic 504 // attributes) 505 #![doc(alias = "skip")] 506 #![doc(alias = "verbatim_doc_comment")] 507 #![doc(alias = "flatten")] 508 #![doc(alias = "external_subcommand")] 509 #![doc(alias = "subcommand")] 510 #![doc(alias = "rename_all")] 511 #![doc(alias = "rename_all_env")] 512 #![doc(alias = "default_value_t")] 513 #![doc(alias = "default_values_t")] 514 #![doc(alias = "default_value_os_t")] 515 #![doc(alias = "default_values_os_t")] 516 517 pub mod _tutorial; 518 #[doc(inline)] 519 pub use crate::_cookbook; 520