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