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