Skip to content

Commit

Permalink
Automatically read license field from Cargo.toml
Browse files Browse the repository at this point in the history
  • Loading branch information
robinmoussu committed Dec 8, 2020
1 parent 5847303 commit 6898fbd
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/01a_quick_example.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ fn main() {
.version("1.0")
.author("Kevin K. <kbknapp@gmail.com>")
.about("Does awesome things")
.license("MIT OR Apache-2.0")
.arg("-c, --config=[FILE] 'Sets a custom config file'")
.arg("<output> 'Sets an optional output file'")
.arg("-d..., --debug... 'Turn debugging information on'")
Expand Down
1 change: 1 addition & 0 deletions examples/01b_quick_example.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ fn main() {
.version("1.0")
.author("Kevin K. <kbknapp@gmail.com>")
.about("Does awesome things")
.license("MIT OR Apache-2.0")
.arg(
Arg::new("config")
.short('c')
Expand Down
1 change: 1 addition & 0 deletions examples/01c_quick_example.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ fn main() {
(version: "1.0")
(author: "Kevin K. <kbknapp@gmail.com>")
(about: "Does awesome things")
(license: "MIT OR Apache-2.0")
(@arg CONFIG: -c --config +takes_value "Sets a custom config file")
(@arg INPUT: +required "Sets the input file to use")
(@arg debug: -d ... "Sets the level of debugging information")
Expand Down
1 change: 1 addition & 0 deletions examples/02_apps.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ fn main() {
.version("1.0")
.author("Kevin K. <kbknapp@gmail.com>")
.about("Does awesome things")
.license("MIT OR Apache-2.0")
.get_matches();

// This example doesn't do much, but it *does* give automatic -h, --help, -V, and --version functionality ;)
Expand Down
1 change: 1 addition & 0 deletions examples/04_using_matches.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ fn main() {
// argument.
let matches = App::new("MyApp")
.about("Parses an input file to do awesome things")
.license("MIT OR Apache-2.0")
.version("1.0")
.author("Kevin K. <kbknapp@gmail.com>")
.arg(
Expand Down
1 change: 1 addition & 0 deletions examples/08_subcommands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ fn main() {
App::new("add") // The name we call argument with
.about("Adds files to myapp") // The message displayed in "myapp -h"
// or "myapp help"
.license("MIT OR Apache-2.0")
.version("0.1") // Subcommands can have independent version
.author("Kevin K.") // And authors
.arg(
Expand Down
1 change: 1 addition & 0 deletions examples/18_builder_macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ fn main() {
(@setting SubcommandRequiredElseHelp)
(version: "1.0")
(author: "Alice")
(license: "MIT OR Apache-2.0")
(about: "Does awesome things")
(@arg config: -c --config <conf> #{1, 2} {file_exists} "Sets a custom config file")
(@arg proxyHostname: --("proxy-hostname") +takes_value "Sets the hostname of the proxy to use")
Expand Down
1 change: 1 addition & 0 deletions examples/20_subcommands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ fn main() {
.subcommand(
App::new("clone")
.about("clones repos")
.license("MIT OR Apache-2.0")
.arg(Arg::new("repo").about("The repo to clone").required(true)),
)
.subcommand(
Expand Down
1 change: 1 addition & 0 deletions examples/21_aliases.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ fn main() {
App::new("ls")
.aliases(&["list", "dir"])
.about("Adds files to myapp")
.license("MIT OR Apache-2.0")
.version("0.1")
.author("Kevin K.")
.arg(
Expand Down
22 changes: 22 additions & 0 deletions src/build/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ pub struct App<'help> {
pub(crate) author: Option<&'help str>,
pub(crate) version: Option<&'help str>,
pub(crate) long_version: Option<&'help str>,
pub(crate) license: Option<&'help str>,
pub(crate) about: Option<&'help str>,
pub(crate) long_about: Option<&'help str>,
pub(crate) help_about: Option<&'help str>,
Expand Down Expand Up @@ -788,6 +789,27 @@ impl<'help> App<'help> {
self
}

/// Sets a string of the license to be displayed when displaying help information.
///
/// **Pro-tip:** Use `clap`s convenience macro [`crate_license!`] to automatically set your
/// application's license to the same thing as your crate at compile time. See the
/// [`examples/`] directory for more information
///
/// # Examples
///
/// ```no_run
/// # use clap::{App, Arg};
/// App::new("myprog")
/// .license("MIT OR Apache-2.0")
/// # ;
/// ```
/// [`crate_license!`]: ./macro.crate_license!.html
/// [`examples/`]: https://github.com/clap-rs/clap/tree/master/examples
pub fn license<S: Into<&'help str>>(mut self, license: S) -> Self {
self.license = Some(license.into());
self
}

/// Overrides the `clap` generated usage string.
///
/// This will be displayed to the user when errors are found in argument parsing.
Expand Down
33 changes: 33 additions & 0 deletions src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,37 @@ macro_rules! load_yaml {
};
}

/// Allows you to pull the licence from your Cargo.toml at compile time. If the `license` field is
/// empty, then the `licence-field` is read. If both fields are empty, then an empty string is
/// returned.
///
/// # Examples
///
/// ```no_run
/// # #[macro_use]
/// # extern crate clap;
/// # use clap::App;
/// # fn main() {
/// let m = App::new("app")
/// .version(crate_license!())
/// .get_matches();
/// # }
/// ```
#[cfg(feature = "cargo")]
#[macro_export]
macro_rules! crate_license {
() => {{
let mut license = env!("CARGO_PKG_LICENSE");
if license.is_empty() {
license = env!("CARGO_PKG_LICENSE_FILE");
}
if license.is_empty() {
license = "";
}
license
}};
}

/// Allows you to pull the version from your Cargo.toml at compile time as
/// `MAJOR.MINOR.PATCH_PKGVERSION_PRE`
///
Expand Down Expand Up @@ -166,12 +197,14 @@ macro_rules! app_from_crate {
.version($crate::crate_version!())
.author($crate::crate_authors!())
.about($crate::crate_description!())
.license($crate::crate_license!())
};
($sep:expr) => {
$crate::App::new($crate::crate_name!())
.version($crate::crate_version!())
.author($crate::crate_authors!($sep))
.about($crate::crate_description!())
.license($crate::crate_license!())
};
}

Expand Down

0 comments on commit 6898fbd

Please sign in to comment.