Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatically read license field from Cargo.toml #2144

Merged
merged 1 commit into from
Dec 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
pksunkara marked this conversation as resolved.
Show resolved Hide resolved
///
/// # 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