xref: /third_party/rust/crates/clap/src/macros.rs (revision 19625d8c)
119625d8cSopenharmony_ci/// Allows you to pull the version from your Cargo.toml at compile time as
219625d8cSopenharmony_ci/// `MAJOR.MINOR.PATCH_PKGVERSION_PRE`
319625d8cSopenharmony_ci///
419625d8cSopenharmony_ci/// # Examples
519625d8cSopenharmony_ci///
619625d8cSopenharmony_ci/// ```no_run
719625d8cSopenharmony_ci/// # #[macro_use]
819625d8cSopenharmony_ci/// # extern crate clap;
919625d8cSopenharmony_ci/// # use clap::Command;
1019625d8cSopenharmony_ci/// # fn main() {
1119625d8cSopenharmony_ci/// let m = Command::new("cmd")
1219625d8cSopenharmony_ci///             .version(crate_version!())
1319625d8cSopenharmony_ci///             .get_matches();
1419625d8cSopenharmony_ci/// # }
1519625d8cSopenharmony_ci/// ```
1619625d8cSopenharmony_ci#[cfg(feature = "cargo")]
1719625d8cSopenharmony_ci#[macro_export]
1819625d8cSopenharmony_cimacro_rules! crate_version {
1919625d8cSopenharmony_ci    () => {
2019625d8cSopenharmony_ci        env!("CARGO_PKG_VERSION")
2119625d8cSopenharmony_ci    };
2219625d8cSopenharmony_ci}
2319625d8cSopenharmony_ci
2419625d8cSopenharmony_ci/// Allows you to pull the authors for the command from your Cargo.toml at
2519625d8cSopenharmony_ci/// compile time in the form:
2619625d8cSopenharmony_ci/// `"author1 lastname <author1@example.com>:author2 lastname <author2@example.com>"`
2719625d8cSopenharmony_ci///
2819625d8cSopenharmony_ci/// You can replace the colons with a custom separator by supplying a
2919625d8cSopenharmony_ci/// replacement string, so, for example,
3019625d8cSopenharmony_ci/// `crate_authors!(",\n")` would become
3119625d8cSopenharmony_ci/// `"author1 lastname <author1@example.com>,\nauthor2 lastname <author2@example.com>,\nauthor3 lastname <author3@example.com>"`
3219625d8cSopenharmony_ci///
3319625d8cSopenharmony_ci/// # Examples
3419625d8cSopenharmony_ci///
3519625d8cSopenharmony_ci/// ```no_run
3619625d8cSopenharmony_ci/// # #[macro_use]
3719625d8cSopenharmony_ci/// # extern crate clap;
3819625d8cSopenharmony_ci/// # use clap::Command;
3919625d8cSopenharmony_ci/// # fn main() {
4019625d8cSopenharmony_ci/// let m = Command::new("cmd")
4119625d8cSopenharmony_ci///             .author(crate_authors!("\n"))
4219625d8cSopenharmony_ci///             .get_matches();
4319625d8cSopenharmony_ci/// # }
4419625d8cSopenharmony_ci/// ```
4519625d8cSopenharmony_ci#[cfg(feature = "cargo")]
4619625d8cSopenharmony_ci#[macro_export]
4719625d8cSopenharmony_cimacro_rules! crate_authors {
4819625d8cSopenharmony_ci    ($sep:expr) => {{
4919625d8cSopenharmony_ci        static authors: &str = env!("CARGO_PKG_AUTHORS");
5019625d8cSopenharmony_ci        if authors.contains(':') {
5119625d8cSopenharmony_ci            static CACHED: clap::__macro_refs::once_cell::sync::Lazy<String> =
5219625d8cSopenharmony_ci                clap::__macro_refs::once_cell::sync::Lazy::new(|| authors.replace(':', $sep));
5319625d8cSopenharmony_ci            let s: &'static str = &*CACHED;
5419625d8cSopenharmony_ci            s
5519625d8cSopenharmony_ci        } else {
5619625d8cSopenharmony_ci            authors
5719625d8cSopenharmony_ci        }
5819625d8cSopenharmony_ci    }};
5919625d8cSopenharmony_ci    () => {
6019625d8cSopenharmony_ci        env!("CARGO_PKG_AUTHORS")
6119625d8cSopenharmony_ci    };
6219625d8cSopenharmony_ci}
6319625d8cSopenharmony_ci
6419625d8cSopenharmony_ci/// Allows you to pull the description from your Cargo.toml at compile time.
6519625d8cSopenharmony_ci///
6619625d8cSopenharmony_ci/// # Examples
6719625d8cSopenharmony_ci///
6819625d8cSopenharmony_ci/// ```no_run
6919625d8cSopenharmony_ci/// # #[macro_use]
7019625d8cSopenharmony_ci/// # extern crate clap;
7119625d8cSopenharmony_ci/// # use clap::Command;
7219625d8cSopenharmony_ci/// # fn main() {
7319625d8cSopenharmony_ci/// let m = Command::new("cmd")
7419625d8cSopenharmony_ci///             .about(crate_description!())
7519625d8cSopenharmony_ci///             .get_matches();
7619625d8cSopenharmony_ci/// # }
7719625d8cSopenharmony_ci/// ```
7819625d8cSopenharmony_ci#[cfg(feature = "cargo")]
7919625d8cSopenharmony_ci#[macro_export]
8019625d8cSopenharmony_cimacro_rules! crate_description {
8119625d8cSopenharmony_ci    () => {
8219625d8cSopenharmony_ci        env!("CARGO_PKG_DESCRIPTION")
8319625d8cSopenharmony_ci    };
8419625d8cSopenharmony_ci}
8519625d8cSopenharmony_ci
8619625d8cSopenharmony_ci/// Allows you to pull the name from your Cargo.toml at compile time.
8719625d8cSopenharmony_ci///
8819625d8cSopenharmony_ci/// **NOTE:** This macro extracts the name from an environment variable `CARGO_PKG_NAME`.
8919625d8cSopenharmony_ci/// When the crate name is set to something different from the package name,
9019625d8cSopenharmony_ci/// use environment variables `CARGO_CRATE_NAME` or `CARGO_BIN_NAME`.
9119625d8cSopenharmony_ci/// See [the Cargo Book](https://doc.rust-lang.org/cargo/reference/environment-variables.html)
9219625d8cSopenharmony_ci/// for more information.
9319625d8cSopenharmony_ci///
9419625d8cSopenharmony_ci/// # Examples
9519625d8cSopenharmony_ci///
9619625d8cSopenharmony_ci/// ```no_run
9719625d8cSopenharmony_ci/// # #[macro_use]
9819625d8cSopenharmony_ci/// # extern crate clap;
9919625d8cSopenharmony_ci/// # use clap::Command;
10019625d8cSopenharmony_ci/// # fn main() {
10119625d8cSopenharmony_ci/// let m = Command::new(crate_name!())
10219625d8cSopenharmony_ci///             .get_matches();
10319625d8cSopenharmony_ci/// # }
10419625d8cSopenharmony_ci/// ```
10519625d8cSopenharmony_ci#[cfg(feature = "cargo")]
10619625d8cSopenharmony_ci#[macro_export]
10719625d8cSopenharmony_cimacro_rules! crate_name {
10819625d8cSopenharmony_ci    () => {
10919625d8cSopenharmony_ci        env!("CARGO_PKG_NAME")
11019625d8cSopenharmony_ci    };
11119625d8cSopenharmony_ci}
11219625d8cSopenharmony_ci
11319625d8cSopenharmony_ci/// Allows you to build the `Command` instance from your Cargo.toml at compile time.
11419625d8cSopenharmony_ci///
11519625d8cSopenharmony_ci/// **NOTE:** Changing the values in your `Cargo.toml` does not trigger a re-build automatically,
11619625d8cSopenharmony_ci/// and therefore won't change the generated output until you recompile.
11719625d8cSopenharmony_ci///
11819625d8cSopenharmony_ci/// In some cases you can "trick" the compiler into triggering a rebuild when your
11919625d8cSopenharmony_ci/// `Cargo.toml` is changed by including this in your `src/main.rs` file
12019625d8cSopenharmony_ci/// `include_str!("../Cargo.toml");`
12119625d8cSopenharmony_ci///
12219625d8cSopenharmony_ci/// # Examples
12319625d8cSopenharmony_ci///
12419625d8cSopenharmony_ci/// ```no_run
12519625d8cSopenharmony_ci/// # #[macro_use]
12619625d8cSopenharmony_ci/// # extern crate clap;
12719625d8cSopenharmony_ci/// # fn main() {
12819625d8cSopenharmony_ci/// let m = command!().get_matches();
12919625d8cSopenharmony_ci/// # }
13019625d8cSopenharmony_ci/// ```
13119625d8cSopenharmony_ci#[cfg(feature = "cargo")]
13219625d8cSopenharmony_ci#[macro_export]
13319625d8cSopenharmony_cimacro_rules! command {
13419625d8cSopenharmony_ci    () => {{
13519625d8cSopenharmony_ci        $crate::command!($crate::crate_name!())
13619625d8cSopenharmony_ci    }};
13719625d8cSopenharmony_ci    ($name:expr) => {{
13819625d8cSopenharmony_ci        let mut cmd = $crate::Command::new($name).version($crate::crate_version!());
13919625d8cSopenharmony_ci
14019625d8cSopenharmony_ci        let author = $crate::crate_authors!();
14119625d8cSopenharmony_ci        if !author.is_empty() {
14219625d8cSopenharmony_ci            cmd = cmd.author(author)
14319625d8cSopenharmony_ci        }
14419625d8cSopenharmony_ci
14519625d8cSopenharmony_ci        let about = $crate::crate_description!();
14619625d8cSopenharmony_ci        if !about.is_empty() {
14719625d8cSopenharmony_ci            cmd = cmd.about(about)
14819625d8cSopenharmony_ci        }
14919625d8cSopenharmony_ci
15019625d8cSopenharmony_ci        cmd
15119625d8cSopenharmony_ci    }};
15219625d8cSopenharmony_ci}
15319625d8cSopenharmony_ci
15419625d8cSopenharmony_ci/// Requires `cargo` feature flag to be enabled.
15519625d8cSopenharmony_ci#[cfg(not(feature = "cargo"))]
15619625d8cSopenharmony_ci#[macro_export]
15719625d8cSopenharmony_cimacro_rules! command {
15819625d8cSopenharmony_ci    () => {{
15919625d8cSopenharmony_ci        compile_error!("`cargo` feature flag is required");
16019625d8cSopenharmony_ci    }};
16119625d8cSopenharmony_ci    ($name:expr) => {{
16219625d8cSopenharmony_ci        compile_error!("`cargo` feature flag is required");
16319625d8cSopenharmony_ci    }};
16419625d8cSopenharmony_ci}
16519625d8cSopenharmony_ci
16619625d8cSopenharmony_ci#[doc(hidden)]
16719625d8cSopenharmony_ci#[macro_export]
16819625d8cSopenharmony_cimacro_rules! arg_impl {
16919625d8cSopenharmony_ci    ( @string $val:ident ) => {
17019625d8cSopenharmony_ci        stringify!($val)
17119625d8cSopenharmony_ci    };
17219625d8cSopenharmony_ci    ( @string $val:literal ) => {{
17319625d8cSopenharmony_ci        let ident_or_string_literal: &str = $val;
17419625d8cSopenharmony_ci        ident_or_string_literal
17519625d8cSopenharmony_ci    }};
17619625d8cSopenharmony_ci    ( @string $val:tt ) => {
17719625d8cSopenharmony_ci        ::std::compile_error!("Only identifiers or string literals supported");
17819625d8cSopenharmony_ci    };
17919625d8cSopenharmony_ci    ( @string ) => {
18019625d8cSopenharmony_ci        None
18119625d8cSopenharmony_ci    };
18219625d8cSopenharmony_ci
18319625d8cSopenharmony_ci    ( @char $val:ident ) => {{
18419625d8cSopenharmony_ci        let ident_or_char_literal = stringify!($val);
18519625d8cSopenharmony_ci        debug_assert_eq!(
18619625d8cSopenharmony_ci            ident_or_char_literal.len(),
18719625d8cSopenharmony_ci            1,
18819625d8cSopenharmony_ci            "Single-letter identifier expected, got {}",
18919625d8cSopenharmony_ci            ident_or_char_literal
19019625d8cSopenharmony_ci        );
19119625d8cSopenharmony_ci        ident_or_char_literal.chars().next().unwrap()
19219625d8cSopenharmony_ci    }};
19319625d8cSopenharmony_ci    ( @char $val:literal ) => {{
19419625d8cSopenharmony_ci        let ident_or_char_literal: char = $val;
19519625d8cSopenharmony_ci        ident_or_char_literal
19619625d8cSopenharmony_ci    }};
19719625d8cSopenharmony_ci    ( @char ) => {{
19819625d8cSopenharmony_ci        None
19919625d8cSopenharmony_ci    }};
20019625d8cSopenharmony_ci
20119625d8cSopenharmony_ci    (
20219625d8cSopenharmony_ci        @arg
20319625d8cSopenharmony_ci        ($arg:expr)
20419625d8cSopenharmony_ci        --$long:ident
20519625d8cSopenharmony_ci        $($tail:tt)*
20619625d8cSopenharmony_ci    ) => {{
20719625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Flags should precede values");
20819625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
20919625d8cSopenharmony_ci
21019625d8cSopenharmony_ci        let mut arg = $arg;
21119625d8cSopenharmony_ci        let long = $crate::arg_impl! { @string $long };
21219625d8cSopenharmony_ci        if arg.get_id() == "" {
21319625d8cSopenharmony_ci            arg = arg.id(long);
21419625d8cSopenharmony_ci        }
21519625d8cSopenharmony_ci        let action = $crate::ArgAction::SetTrue;
21619625d8cSopenharmony_ci        let arg = arg
21719625d8cSopenharmony_ci            .long(long)
21819625d8cSopenharmony_ci            .action(action);
21919625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
22019625d8cSopenharmony_ci            @arg (arg) $($tail)*
22119625d8cSopenharmony_ci        };
22219625d8cSopenharmony_ci        arg
22319625d8cSopenharmony_ci    }};
22419625d8cSopenharmony_ci    (
22519625d8cSopenharmony_ci        @arg
22619625d8cSopenharmony_ci        ($arg:expr)
22719625d8cSopenharmony_ci        --$long:literal
22819625d8cSopenharmony_ci        $($tail:tt)*
22919625d8cSopenharmony_ci    ) => {{
23019625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Flags should precede values");
23119625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
23219625d8cSopenharmony_ci
23319625d8cSopenharmony_ci        let mut arg = $arg;
23419625d8cSopenharmony_ci        let long = $crate::arg_impl! { @string $long };
23519625d8cSopenharmony_ci        if arg.get_id() == "" {
23619625d8cSopenharmony_ci            arg = arg.id(long);
23719625d8cSopenharmony_ci        }
23819625d8cSopenharmony_ci        let action = $crate::ArgAction::SetTrue;
23919625d8cSopenharmony_ci        let arg = arg
24019625d8cSopenharmony_ci            .long(long)
24119625d8cSopenharmony_ci            .action(action);
24219625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
24319625d8cSopenharmony_ci            @arg (arg) $($tail)*
24419625d8cSopenharmony_ci        };
24519625d8cSopenharmony_ci        arg
24619625d8cSopenharmony_ci    }};
24719625d8cSopenharmony_ci    (
24819625d8cSopenharmony_ci        @arg
24919625d8cSopenharmony_ci        ($arg:expr)
25019625d8cSopenharmony_ci        -$short:ident
25119625d8cSopenharmony_ci        $($tail:tt)*
25219625d8cSopenharmony_ci    ) => {{
25319625d8cSopenharmony_ci        debug_assert_eq!($arg.get_long(), None, "Short flags should precede long flags");
25419625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Flags should precede values");
25519625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
25619625d8cSopenharmony_ci
25719625d8cSopenharmony_ci        let action = $crate::ArgAction::SetTrue;
25819625d8cSopenharmony_ci        let arg = $arg
25919625d8cSopenharmony_ci            .short($crate::arg_impl! { @char $short })
26019625d8cSopenharmony_ci            .action(action);
26119625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
26219625d8cSopenharmony_ci            @arg (arg) $($tail)*
26319625d8cSopenharmony_ci        };
26419625d8cSopenharmony_ci        arg
26519625d8cSopenharmony_ci    }};
26619625d8cSopenharmony_ci    (
26719625d8cSopenharmony_ci        @arg
26819625d8cSopenharmony_ci        ($arg:expr)
26919625d8cSopenharmony_ci        -$short:literal
27019625d8cSopenharmony_ci        $($tail:tt)*
27119625d8cSopenharmony_ci    ) => {{
27219625d8cSopenharmony_ci        debug_assert_eq!($arg.get_long(), None, "Short flags should precede long flags");
27319625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Flags should precede values");
27419625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
27519625d8cSopenharmony_ci
27619625d8cSopenharmony_ci        let action = $crate::ArgAction::SetTrue;
27719625d8cSopenharmony_ci        let arg = $arg
27819625d8cSopenharmony_ci            .short($crate::arg_impl! { @char $short })
27919625d8cSopenharmony_ci            .action(action);
28019625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
28119625d8cSopenharmony_ci            @arg (arg) $($tail)*
28219625d8cSopenharmony_ci        };
28319625d8cSopenharmony_ci        arg
28419625d8cSopenharmony_ci    }};
28519625d8cSopenharmony_ci    (
28619625d8cSopenharmony_ci        @arg
28719625d8cSopenharmony_ci        ($arg:expr)
28819625d8cSopenharmony_ci        <$value_name:ident>
28919625d8cSopenharmony_ci        $($tail:tt)*
29019625d8cSopenharmony_ci    ) => {{
29119625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
29219625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Multiple values not yet supported");
29319625d8cSopenharmony_ci
29419625d8cSopenharmony_ci        let mut arg = $arg;
29519625d8cSopenharmony_ci
29619625d8cSopenharmony_ci        if arg.get_long().is_none() && arg.get_short().is_none() {
29719625d8cSopenharmony_ci            arg = arg.required(true);
29819625d8cSopenharmony_ci        }
29919625d8cSopenharmony_ci
30019625d8cSopenharmony_ci        let value_name = $crate::arg_impl! { @string $value_name };
30119625d8cSopenharmony_ci        if arg.get_id() == "" {
30219625d8cSopenharmony_ci            arg = arg.id(value_name);
30319625d8cSopenharmony_ci        }
30419625d8cSopenharmony_ci        let arg = arg
30519625d8cSopenharmony_ci            .value_name(value_name)
30619625d8cSopenharmony_ci            .action($crate::ArgAction::Set);
30719625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
30819625d8cSopenharmony_ci            @arg (arg) $($tail)*
30919625d8cSopenharmony_ci        };
31019625d8cSopenharmony_ci        arg
31119625d8cSopenharmony_ci    }};
31219625d8cSopenharmony_ci    (
31319625d8cSopenharmony_ci        @arg
31419625d8cSopenharmony_ci        ($arg:expr)
31519625d8cSopenharmony_ci        <$value_name:literal>
31619625d8cSopenharmony_ci        $($tail:tt)*
31719625d8cSopenharmony_ci    ) => {{
31819625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
31919625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Multiple values not yet supported");
32019625d8cSopenharmony_ci
32119625d8cSopenharmony_ci        let mut arg = $arg;
32219625d8cSopenharmony_ci
32319625d8cSopenharmony_ci        if arg.get_long().is_none() && arg.get_short().is_none() {
32419625d8cSopenharmony_ci            arg = arg.required(true);
32519625d8cSopenharmony_ci        }
32619625d8cSopenharmony_ci
32719625d8cSopenharmony_ci        let value_name = $crate::arg_impl! { @string $value_name };
32819625d8cSopenharmony_ci        if arg.get_id() == "" {
32919625d8cSopenharmony_ci            arg = arg.id(value_name);
33019625d8cSopenharmony_ci        }
33119625d8cSopenharmony_ci        let arg = arg
33219625d8cSopenharmony_ci            .value_name(value_name)
33319625d8cSopenharmony_ci            .action($crate::ArgAction::Set);
33419625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
33519625d8cSopenharmony_ci            @arg (arg) $($tail)*
33619625d8cSopenharmony_ci        };
33719625d8cSopenharmony_ci        arg
33819625d8cSopenharmony_ci    }};
33919625d8cSopenharmony_ci    (
34019625d8cSopenharmony_ci        @arg
34119625d8cSopenharmony_ci        ($arg:expr)
34219625d8cSopenharmony_ci        [$value_name:ident]
34319625d8cSopenharmony_ci        $($tail:tt)*
34419625d8cSopenharmony_ci    ) => {{
34519625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
34619625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Multiple values not yet supported");
34719625d8cSopenharmony_ci
34819625d8cSopenharmony_ci        let mut arg = $arg;
34919625d8cSopenharmony_ci
35019625d8cSopenharmony_ci        if arg.get_long().is_none() && arg.get_short().is_none() {
35119625d8cSopenharmony_ci            arg = arg.required(false);
35219625d8cSopenharmony_ci        } else {
35319625d8cSopenharmony_ci            arg = arg.num_args(0..=1);
35419625d8cSopenharmony_ci        }
35519625d8cSopenharmony_ci
35619625d8cSopenharmony_ci        let value_name = $crate::arg_impl! { @string $value_name };
35719625d8cSopenharmony_ci        if arg.get_id() == "" {
35819625d8cSopenharmony_ci            arg = arg.id(value_name);
35919625d8cSopenharmony_ci        }
36019625d8cSopenharmony_ci        let arg = arg
36119625d8cSopenharmony_ci            .value_name(value_name)
36219625d8cSopenharmony_ci            .action($crate::ArgAction::Set);
36319625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
36419625d8cSopenharmony_ci            @arg (arg) $($tail)*
36519625d8cSopenharmony_ci        };
36619625d8cSopenharmony_ci        arg
36719625d8cSopenharmony_ci    }};
36819625d8cSopenharmony_ci    (
36919625d8cSopenharmony_ci        @arg
37019625d8cSopenharmony_ci        ($arg:expr)
37119625d8cSopenharmony_ci        [$value_name:literal]
37219625d8cSopenharmony_ci        $($tail:tt)*
37319625d8cSopenharmony_ci    ) => {{
37419625d8cSopenharmony_ci        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), "Flags should precede `...`");
37519625d8cSopenharmony_ci        debug_assert_eq!($arg.get_value_names(), None, "Multiple values not yet supported");
37619625d8cSopenharmony_ci
37719625d8cSopenharmony_ci        let mut arg = $arg;
37819625d8cSopenharmony_ci
37919625d8cSopenharmony_ci        if arg.get_long().is_none() && arg.get_short().is_none() {
38019625d8cSopenharmony_ci            arg = arg.required(false);
38119625d8cSopenharmony_ci        } else {
38219625d8cSopenharmony_ci            arg = arg.num_args(0..=1);
38319625d8cSopenharmony_ci        }
38419625d8cSopenharmony_ci
38519625d8cSopenharmony_ci        let value_name = $crate::arg_impl! { @string $value_name };
38619625d8cSopenharmony_ci        if arg.get_id() == "" {
38719625d8cSopenharmony_ci            arg = arg.id(value_name);
38819625d8cSopenharmony_ci        }
38919625d8cSopenharmony_ci        let arg = arg
39019625d8cSopenharmony_ci            .value_name(value_name)
39119625d8cSopenharmony_ci            .action($crate::ArgAction::Set);
39219625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
39319625d8cSopenharmony_ci            @arg (arg) $($tail)*
39419625d8cSopenharmony_ci        };
39519625d8cSopenharmony_ci        arg
39619625d8cSopenharmony_ci    }};
39719625d8cSopenharmony_ci    (
39819625d8cSopenharmony_ci        @arg
39919625d8cSopenharmony_ci        ($arg:expr)
40019625d8cSopenharmony_ci        ...
40119625d8cSopenharmony_ci        $($tail:tt)*
40219625d8cSopenharmony_ci    ) => {{
40319625d8cSopenharmony_ci        let arg = match $arg.get_action() {
40419625d8cSopenharmony_ci            $crate::ArgAction::Set => {
40519625d8cSopenharmony_ci                if $arg.get_long().is_none() && $arg.get_short().is_none() {
40619625d8cSopenharmony_ci                    $arg.num_args(1..)
40719625d8cSopenharmony_ci                        // Allow collecting arguments interleaved with flags
40819625d8cSopenharmony_ci                        .action($crate::ArgAction::Append)
40919625d8cSopenharmony_ci                } else {
41019625d8cSopenharmony_ci                    $arg.action($crate::ArgAction::Append)
41119625d8cSopenharmony_ci                }
41219625d8cSopenharmony_ci            },
41319625d8cSopenharmony_ci            $crate::ArgAction::SetTrue | $crate::ArgAction::Help | $crate::ArgAction::Version => {
41419625d8cSopenharmony_ci                $arg.action($crate::ArgAction::Count)
41519625d8cSopenharmony_ci            }
41619625d8cSopenharmony_ci            action => {
41719625d8cSopenharmony_ci                panic!("Unexpected action {:?}", action)
41819625d8cSopenharmony_ci            }
41919625d8cSopenharmony_ci        };
42019625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
42119625d8cSopenharmony_ci            @arg (arg) $($tail)*
42219625d8cSopenharmony_ci        };
42319625d8cSopenharmony_ci        arg
42419625d8cSopenharmony_ci    }};
42519625d8cSopenharmony_ci    (
42619625d8cSopenharmony_ci        @arg
42719625d8cSopenharmony_ci        ($arg:expr)
42819625d8cSopenharmony_ci        $help:literal
42919625d8cSopenharmony_ci    ) => {{
43019625d8cSopenharmony_ci        $arg.help($help)
43119625d8cSopenharmony_ci    }};
43219625d8cSopenharmony_ci    (
43319625d8cSopenharmony_ci        @arg
43419625d8cSopenharmony_ci        ($arg:expr)
43519625d8cSopenharmony_ci    ) => {{
43619625d8cSopenharmony_ci        $arg
43719625d8cSopenharmony_ci    }};
43819625d8cSopenharmony_ci}
43919625d8cSopenharmony_ci
44019625d8cSopenharmony_ci/// Create an [`Arg`] from a usage string.
44119625d8cSopenharmony_ci///
44219625d8cSopenharmony_ci/// Allows creation of basic settings for the [`Arg`].
44319625d8cSopenharmony_ci///
44419625d8cSopenharmony_ci/// **NOTE**: Not all settings may be set using the usage string method. Some properties are
44519625d8cSopenharmony_ci/// only available via the builder pattern.
44619625d8cSopenharmony_ci///
44719625d8cSopenharmony_ci/// # Syntax
44819625d8cSopenharmony_ci///
44919625d8cSopenharmony_ci/// Usage strings typically following the form:
45019625d8cSopenharmony_ci///
45119625d8cSopenharmony_ci/// ```notrust
45219625d8cSopenharmony_ci/// [explicit name] [short] [long] [value names] [...] [help string]
45319625d8cSopenharmony_ci/// ```
45419625d8cSopenharmony_ci///
45519625d8cSopenharmony_ci/// ### Explicit Name
45619625d8cSopenharmony_ci///
45719625d8cSopenharmony_ci/// The name may be either a bare-word or a string, followed by a `:`, like `name:` or
45819625d8cSopenharmony_ci/// `"name":`.
45919625d8cSopenharmony_ci///
46019625d8cSopenharmony_ci/// *Note:* This is an optional field, if it's omitted the argument will use one of the additional
46119625d8cSopenharmony_ci/// fields as the name using the following priority order:
46219625d8cSopenharmony_ci///
46319625d8cSopenharmony_ci///  1. Explicit Name
46419625d8cSopenharmony_ci///  2. Long
46519625d8cSopenharmony_ci///  3. Value Name
46619625d8cSopenharmony_ci///
46719625d8cSopenharmony_ci/// See [`Arg::id`][crate::Arg::id].
46819625d8cSopenharmony_ci///
46919625d8cSopenharmony_ci/// ### Short
47019625d8cSopenharmony_ci///
47119625d8cSopenharmony_ci/// A short flag is a `-` followed by either a bare-character or quoted character, like `-f` or
47219625d8cSopenharmony_ci/// `-'f'`.
47319625d8cSopenharmony_ci///
47419625d8cSopenharmony_ci/// See [`Arg::short`][crate::Arg::short].
47519625d8cSopenharmony_ci///
47619625d8cSopenharmony_ci/// ### Long
47719625d8cSopenharmony_ci///
47819625d8cSopenharmony_ci/// A long flag is a `--` followed by either a bare-word or a string, like `--foo` or
47919625d8cSopenharmony_ci/// `--"foo"`.
48019625d8cSopenharmony_ci///
48119625d8cSopenharmony_ci/// **NOTE:** Dashes in the long name (e.g. `--foo-bar`) is not supported and quoting is required
48219625d8cSopenharmony_ci/// (e.g. `--"foo-bar"`).
48319625d8cSopenharmony_ci///
48419625d8cSopenharmony_ci/// See [`Arg::long`][crate::Arg::long].
48519625d8cSopenharmony_ci///
48619625d8cSopenharmony_ci/// ### Values (Value Notation)
48719625d8cSopenharmony_ci///
48819625d8cSopenharmony_ci/// This is set by placing bare-word between:
48919625d8cSopenharmony_ci/// - `[]` like `[FOO]`
49019625d8cSopenharmony_ci///   - Positional argument: optional
49119625d8cSopenharmony_ci///   - Named argument: optional value
49219625d8cSopenharmony_ci/// - `<>` like `<FOO>`: required
49319625d8cSopenharmony_ci///
49419625d8cSopenharmony_ci/// See [`Arg::value_name`][crate::Arg::value_name].
49519625d8cSopenharmony_ci///
49619625d8cSopenharmony_ci/// ### `...`
49719625d8cSopenharmony_ci///
49819625d8cSopenharmony_ci/// `...` (three consecutive dots/periods) specifies that this argument may occur multiple
49919625d8cSopenharmony_ci/// times (not to be confused with multiple values per occurrence).
50019625d8cSopenharmony_ci///
50119625d8cSopenharmony_ci/// See [`ArgAction::Count`][crate::ArgAction::Count] and [`ArgAction::Append`][crate::ArgAction::Append].
50219625d8cSopenharmony_ci///
50319625d8cSopenharmony_ci/// ### Help String
50419625d8cSopenharmony_ci///
50519625d8cSopenharmony_ci/// The help string is denoted between a pair of double quotes `""` and may contain any
50619625d8cSopenharmony_ci/// characters.
50719625d8cSopenharmony_ci///
50819625d8cSopenharmony_ci/// # Examples
50919625d8cSopenharmony_ci///
51019625d8cSopenharmony_ci/// ```rust
51119625d8cSopenharmony_ci/// # use clap::{Command, Arg, arg};
51219625d8cSopenharmony_ci/// let cmd = Command::new("prog")
51319625d8cSopenharmony_ci///     .args(&[
51419625d8cSopenharmony_ci///         arg!(--config <FILE> "a required file for the configuration and no short"),
51519625d8cSopenharmony_ci///         arg!(-d --debug ... "turns on debugging information and allows multiples"),
51619625d8cSopenharmony_ci///         arg!([input] "an optional input file to use")
51719625d8cSopenharmony_ci///     ]);
51819625d8cSopenharmony_ci///
51919625d8cSopenharmony_ci/// let m = cmd.try_get_matches_from(["prog", "--config", "file.toml"]).unwrap();
52019625d8cSopenharmony_ci/// assert_eq!(m.get_one::<String>("config").unwrap(), "file.toml");
52119625d8cSopenharmony_ci/// assert_eq!(*m.get_one::<u8>("debug").unwrap(), 0);
52219625d8cSopenharmony_ci/// assert_eq!(m.get_one::<String>("input"), None);
52319625d8cSopenharmony_ci/// ```
52419625d8cSopenharmony_ci/// [`Arg`]: crate::Arg
52519625d8cSopenharmony_ci#[macro_export]
52619625d8cSopenharmony_cimacro_rules! arg {
52719625d8cSopenharmony_ci    ( $name:ident: $($tail:tt)+ ) => {{
52819625d8cSopenharmony_ci        let arg = $crate::Arg::new($crate::arg_impl! { @string $name });
52919625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
53019625d8cSopenharmony_ci            @arg (arg) $($tail)+
53119625d8cSopenharmony_ci        };
53219625d8cSopenharmony_ci        arg
53319625d8cSopenharmony_ci    }};
53419625d8cSopenharmony_ci    ( $($tail:tt)+ ) => {{
53519625d8cSopenharmony_ci        let arg = $crate::Arg::default();
53619625d8cSopenharmony_ci        let arg = $crate::arg_impl! {
53719625d8cSopenharmony_ci            @arg (arg) $($tail)+
53819625d8cSopenharmony_ci        };
53919625d8cSopenharmony_ci        debug_assert_ne!(arg.get_id(), "", "Without a value or long flag, the `name:` prefix is required");
54019625d8cSopenharmony_ci        arg
54119625d8cSopenharmony_ci    }};
54219625d8cSopenharmony_ci}
54319625d8cSopenharmony_ci
54419625d8cSopenharmony_cimacro_rules! impl_settings {
54519625d8cSopenharmony_ci    ($settings:ident, $flags:ident,
54619625d8cSopenharmony_ci        $(
54719625d8cSopenharmony_ci            $(#[$inner:ident $($args:tt)*])*
54819625d8cSopenharmony_ci            $setting:ident => $flag:path
54919625d8cSopenharmony_ci        ),+
55019625d8cSopenharmony_ci    ) => {
55119625d8cSopenharmony_ci        impl $flags {
55219625d8cSopenharmony_ci            #[allow(dead_code)]
55319625d8cSopenharmony_ci            pub(crate) fn empty() -> Self {
55419625d8cSopenharmony_ci                $flags(Flags::empty())
55519625d8cSopenharmony_ci            }
55619625d8cSopenharmony_ci
55719625d8cSopenharmony_ci            #[allow(dead_code)]
55819625d8cSopenharmony_ci            pub(crate) fn insert(&mut self, rhs: Self) {
55919625d8cSopenharmony_ci                self.0.insert(rhs.0);
56019625d8cSopenharmony_ci            }
56119625d8cSopenharmony_ci
56219625d8cSopenharmony_ci            #[allow(dead_code)]
56319625d8cSopenharmony_ci            pub(crate) fn remove(&mut self, rhs: Self) {
56419625d8cSopenharmony_ci                self.0.remove(rhs.0);
56519625d8cSopenharmony_ci            }
56619625d8cSopenharmony_ci
56719625d8cSopenharmony_ci            #[allow(dead_code)]
56819625d8cSopenharmony_ci            pub(crate) fn set(&mut self, s: $settings) {
56919625d8cSopenharmony_ci                match s {
57019625d8cSopenharmony_ci                    $(
57119625d8cSopenharmony_ci                        $(#[$inner $($args)*])*
57219625d8cSopenharmony_ci                        $settings::$setting => self.0.insert($flag),
57319625d8cSopenharmony_ci                    )*
57419625d8cSopenharmony_ci                }
57519625d8cSopenharmony_ci            }
57619625d8cSopenharmony_ci
57719625d8cSopenharmony_ci            #[allow(dead_code)]
57819625d8cSopenharmony_ci            pub(crate) fn unset(&mut self, s: $settings) {
57919625d8cSopenharmony_ci                match s {
58019625d8cSopenharmony_ci                    $(
58119625d8cSopenharmony_ci                        $(#[$inner $($args)*])*
58219625d8cSopenharmony_ci                        $settings::$setting => self.0.remove($flag),
58319625d8cSopenharmony_ci                    )*
58419625d8cSopenharmony_ci                }
58519625d8cSopenharmony_ci            }
58619625d8cSopenharmony_ci
58719625d8cSopenharmony_ci            #[allow(dead_code)]
58819625d8cSopenharmony_ci            pub(crate) fn is_set(&self, s: $settings) -> bool {
58919625d8cSopenharmony_ci                match s {
59019625d8cSopenharmony_ci                    $(
59119625d8cSopenharmony_ci                        $(#[$inner $($args)*])*
59219625d8cSopenharmony_ci                        $settings::$setting => self.0.contains($flag),
59319625d8cSopenharmony_ci                    )*
59419625d8cSopenharmony_ci                }
59519625d8cSopenharmony_ci            }
59619625d8cSopenharmony_ci        }
59719625d8cSopenharmony_ci
59819625d8cSopenharmony_ci        impl BitOr for $flags {
59919625d8cSopenharmony_ci            type Output = Self;
60019625d8cSopenharmony_ci
60119625d8cSopenharmony_ci            fn bitor(mut self, rhs: Self) -> Self::Output {
60219625d8cSopenharmony_ci                self.0.insert(rhs.0);
60319625d8cSopenharmony_ci                self
60419625d8cSopenharmony_ci            }
60519625d8cSopenharmony_ci        }
60619625d8cSopenharmony_ci
60719625d8cSopenharmony_ci        impl From<$settings> for $flags {
60819625d8cSopenharmony_ci            fn from(setting: $settings) -> Self {
60919625d8cSopenharmony_ci                let mut flags = $flags::empty();
61019625d8cSopenharmony_ci                flags.set(setting);
61119625d8cSopenharmony_ci                flags
61219625d8cSopenharmony_ci            }
61319625d8cSopenharmony_ci        }
61419625d8cSopenharmony_ci
61519625d8cSopenharmony_ci        impl BitOr<$settings> for $flags {
61619625d8cSopenharmony_ci            type Output = Self;
61719625d8cSopenharmony_ci
61819625d8cSopenharmony_ci            fn bitor(mut self, rhs: $settings) -> Self::Output {
61919625d8cSopenharmony_ci                self.set(rhs);
62019625d8cSopenharmony_ci                self
62119625d8cSopenharmony_ci            }
62219625d8cSopenharmony_ci        }
62319625d8cSopenharmony_ci
62419625d8cSopenharmony_ci        impl BitOr for $settings {
62519625d8cSopenharmony_ci            type Output = $flags;
62619625d8cSopenharmony_ci
62719625d8cSopenharmony_ci            fn bitor(self, rhs: Self) -> Self::Output {
62819625d8cSopenharmony_ci                let mut flags = $flags::empty();
62919625d8cSopenharmony_ci                flags.set(self);
63019625d8cSopenharmony_ci                flags.set(rhs);
63119625d8cSopenharmony_ci                flags
63219625d8cSopenharmony_ci            }
63319625d8cSopenharmony_ci        }
63419625d8cSopenharmony_ci    }
63519625d8cSopenharmony_ci}
63619625d8cSopenharmony_ci
63719625d8cSopenharmony_ci#[cfg(feature = "debug")]
63819625d8cSopenharmony_cimacro_rules! debug {
63919625d8cSopenharmony_ci    ($($arg:tt)*) => ({
64019625d8cSopenharmony_ci        let prefix = format!("[{:>w$}] \t", module_path!(), w = 28);
64119625d8cSopenharmony_ci        let body = format!($($arg)*);
64219625d8cSopenharmony_ci        let mut styled = $crate::builder::StyledStr::new();
64319625d8cSopenharmony_ci        styled.hint(prefix);
64419625d8cSopenharmony_ci        styled.hint(body);
64519625d8cSopenharmony_ci        styled.none("\n");
64619625d8cSopenharmony_ci        let color = $crate::output::fmt::Colorizer::new($crate::output::fmt::Stream::Stderr, $crate::ColorChoice::Auto).with_content(styled);
64719625d8cSopenharmony_ci        let _ = color.print();
64819625d8cSopenharmony_ci    })
64919625d8cSopenharmony_ci}
65019625d8cSopenharmony_ci
65119625d8cSopenharmony_ci#[cfg(not(feature = "debug"))]
65219625d8cSopenharmony_cimacro_rules! debug {
65319625d8cSopenharmony_ci    ($($arg:tt)*) => {};
65419625d8cSopenharmony_ci}
65519625d8cSopenharmony_ci
65619625d8cSopenharmony_cimacro_rules! ok {
65719625d8cSopenharmony_ci    ($expr:expr) => {
65819625d8cSopenharmony_ci        match $expr {
65919625d8cSopenharmony_ci            Ok(val) => val,
66019625d8cSopenharmony_ci            Err(err) => {
66119625d8cSopenharmony_ci                return Err(err);
66219625d8cSopenharmony_ci            }
66319625d8cSopenharmony_ci        }
66419625d8cSopenharmony_ci    };
66519625d8cSopenharmony_ci}
66619625d8cSopenharmony_ci
66719625d8cSopenharmony_cimacro_rules! some {
66819625d8cSopenharmony_ci    ($expr:expr) => {
66919625d8cSopenharmony_ci        match $expr {
67019625d8cSopenharmony_ci            Some(val) => val,
67119625d8cSopenharmony_ci            None => {
67219625d8cSopenharmony_ci                return None;
67319625d8cSopenharmony_ci            }
67419625d8cSopenharmony_ci        }
67519625d8cSopenharmony_ci    };
67619625d8cSopenharmony_ci}
677