From 4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Sat, 31 Dec 2016 14:17:07 +0100 Subject: [PATCH] feat(simple-cargo-app): Implement crate_description!, crate_name! and app_from_crate! macros Closes #778 --- src/macros.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/src/macros.rs b/src/macros.rs index 3fc78e1a..2680f846 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -380,9 +380,9 @@ macro_rules! arg_enum { /// # extern crate clap; /// # use clap::App; /// # fn main() { -/// let m = App::new("app") -/// .version(crate_version!()) -/// .get_matches(); +/// let m = App::new("app") +/// .version(crate_version!()) +/// .get_matches(); /// # } /// ``` #[cfg(not(feature="no_cargo"))] @@ -448,6 +448,82 @@ macro_rules! crate_authors { }; } +/// Allows you to pull the description from your Cargo.toml at compile time. +/// +/// # Examples +/// +/// ```no_run +/// # #[macro_use] +/// # extern crate clap; +/// # use clap::App; +/// # fn main() { +/// let m = App::new("app") +/// .about(crate_description!()) +/// .get_matches(); +/// # } +/// ``` +#[cfg(not(feature="no_cargo"))] +#[macro_export] +macro_rules! crate_description { + () => { + env!("CARGO_PKG_DESCRIPTION") + }; +} + +/// Allows you to pull the name from your Cargo.toml at compile time. +/// +/// # Examples +/// +/// ```no_run +/// # #[macro_use] +/// # extern crate clap; +/// # use clap::App; +/// # fn main() { +/// let m = App::new(crate_name!()) +/// .get_matches(); +/// # } +/// ``` +#[cfg(not(feature="no_cargo"))] +#[macro_export] +macro_rules! crate_name { + () => { + env!("CARGO_PKG_NAME") + }; +} + +/// Allows you to build the `App` instance from your Cargo.toml at compile time. +/// +/// Equivalent to using the `crate_*!` macros with their respective fields. +/// +/// Provided separator is for the [macro.crate_authors.html](`crate_authors!`) macro, +/// refer to the documentation therefor. +/// +/// # Examples +/// +/// ```no_run +/// # #[macro_use] +/// # extern crate clap; +/// # fn main() { +/// let m = app_from_crate!().get_matches(); +/// # } +/// ``` +#[cfg(not(feature="no_cargo"))] +#[macro_export] +macro_rules! app_from_crate { + () => { + $crate::App::new(crate_name!()) + .version(crate_version!()) + .author(crate_authors!()) + .about(crate_description!()) + }; + ($sep:expr) => { + $crate::App::new(crate_name!()) + .version(crate_version!()) + .author(crate_authors!($sep)) + .about(crate_description!()) + }; +} + /// Build `App`, `Arg`s, `SubCommand`s and `Group`s with Usage-string like input /// but without the parsing. #[macro_export]