fix!: Remove App alias for Command

This commit is contained in:
Ed Page 2022-07-21 15:08:37 -05:00
parent b94d5fcec0
commit 6e1e0f9fa2
9 changed files with 88 additions and 99 deletions

View file

@ -1,4 +1,4 @@
See the documentation for [`Command::multicall`][crate::App::multicall] for rationale. See the documentation for [`Command::multicall`][crate::Command::multicall] for rationale.
This example omits every command except true and false, This example omits every command except true and false,
which are the most trivial to implement, which are the most trivial to implement,

View file

@ -1,4 +1,4 @@
See the documentation for [`Command::multicall`][crate::App::multicall] for rationale. See the documentation for [`Command::multicall`][crate::Command::multicall] for rationale.
This example omits the implementation of displaying address config This example omits the implementation of displaying address config

View file

@ -199,7 +199,7 @@
//! //!
//! clap reports most development errors as `debug_assert!`s. Rather than checking every //! clap reports most development errors as `debug_assert!`s. Rather than checking every
//! subcommand, you should have a test that calls //! subcommand, you should have a test that calls
//! [`Command::debug_assert`][crate::App::debug_assert]: //! [`Command::debug_assert`][crate::Command::debug_assert]:
//! ```rust,no_run //! ```rust,no_run
#![doc = include_str!("../../examples/tutorial_derive/05_01_assert.rs")] #![doc = include_str!("../../examples/tutorial_derive/05_01_assert.rs")]
//! ``` //! ```

View file

@ -137,25 +137,25 @@
//! - e.g. `#[clap(arg_required_else_help(true))]` would translate to `cmd.arg_required_else_help(true)` //! - e.g. `#[clap(arg_required_else_help(true))]` would translate to `cmd.arg_required_else_help(true)`
//! //!
//! **Magic attributes:** //! **Magic attributes:**
//! - `name = <expr>`: [`Command::name`][crate::App::name] //! - `name = <expr>`: [`Command::name`][crate::Command::name]
//! - When not present: [crate `name`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field) (if on [`Parser`][crate::Parser] container), variant name (if on [`Subcommand`][crate::Subcommand] variant) //! - When not present: [crate `name`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field) (if on [`Parser`][crate::Parser] container), variant name (if on [`Subcommand`][crate::Subcommand] variant)
//! - `version [= <expr>]`: [`Command::version`][crate::App::version] //! - `version [= <expr>]`: [`Command::version`][crate::Command::version]
//! - When not present: no version set //! - When not present: no version set
//! - Without `<expr>`: defaults to [crate `version`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-version-field) //! - Without `<expr>`: defaults to [crate `version`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-version-field)
//! - `author [= <expr>]`: [`Command::author`][crate::App::author] //! - `author [= <expr>]`: [`Command::author`][crate::Command::author]
//! - When not present: no author set //! - When not present: no author set
//! - Without `<expr>`: defaults to [crate `authors`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-authors-field) //! - Without `<expr>`: defaults to [crate `authors`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-authors-field)
//! - `about [= <expr>]`: [`Command::about`][crate::App::about] //! - `about [= <expr>]`: [`Command::about`][crate::Command::about]
//! - When not present: [Doc comment summary](#doc-comments) //! - When not present: [Doc comment summary](#doc-comments)
//! - Without `<expr>`: [crate `description`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-description-field) ([`Parser`][crate::Parser] container) //! - Without `<expr>`: [crate `description`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-description-field) ([`Parser`][crate::Parser] container)
//! - **TIP:** When a doc comment is also present, you most likely want to add //! - **TIP:** When a doc comment is also present, you most likely want to add
//! `#[clap(long_about = None)]` to clear the doc comment so only [`about`][crate::App::about] //! `#[clap(long_about = None)]` to clear the doc comment so only [`about`][crate::Command::about]
//! gets shown with both `-h` and `--help`. //! gets shown with both `-h` and `--help`.
//! - `long_about = <expr>`: [`Command::long_about`][crate::App::long_about] //! - `long_about = <expr>`: [`Command::long_about`][crate::Command::long_about]
//! - When not present: [Doc comment](#doc-comments) if there is a blank line, else nothing //! - When not present: [Doc comment](#doc-comments) if there is a blank line, else nothing
//! - `verbatim_doc_comment`: Minimizes pre-processing when converting doc comments to [`about`][crate::App::about] / [`long_about`][crate::App::long_about] //! - `verbatim_doc_comment`: Minimizes pre-processing when converting doc comments to [`about`][crate::Command::about] / [`long_about`][crate::Command::long_about]
//! - `next_display_order`: [`Command::next_display_order`][crate::App::next_display_order] //! - `next_display_order`: [`Command::next_display_order`][crate::Command::next_display_order]
//! - `next_help_heading`: [`Command::next_help_heading`][crate::App::next_help_heading] //! - `next_help_heading`: [`Command::next_help_heading`][crate::Command::next_help_heading]
//! - When `flatten`ing [`Args`][crate::Args], this is scoped to just the args in this struct and any struct `flatten`ed into it //! - When `flatten`ing [`Args`][crate::Args], this is scoped to just the args in this struct and any struct `flatten`ed into it
//! - `rename_all = <string_literal>`: Override default field / variant name case conversion for [`Command::name`][crate::Command::name] / [`Arg::id`][crate::Arg::id] //! - `rename_all = <string_literal>`: Override default field / variant name case conversion for [`Command::name`][crate::Command::name] / [`Arg::id`][crate::Arg::id]
//! - When not present: `"kebab-case"` //! - When not present: `"kebab-case"`
@ -170,7 +170,7 @@
//! [`Subcommand`][crate::Subcommand]) //! [`Subcommand`][crate::Subcommand])
//! - `subcommand`: Nest subcommands under the current set of subcommands (must implement //! - `subcommand`: Nest subcommands under the current set of subcommands (must implement
//! [`Subcommand`][crate::Subcommand]) //! [`Subcommand`][crate::Subcommand])
//! - `external_subcommand`: [`Command::allow_external_subcommand(true)`][crate::App::allow_external_subcommands] //! - `external_subcommand`: [`Command::allow_external_subcommand(true)`][crate::Command::allow_external_subcommands]
//! - Variant must be either `Variant(Vec<String>)` or `Variant(Vec<OsString>)` //! - Variant must be either `Variant(Vec<String>)` or `Variant(Vec<OsString>)`
//! //!
//! ### Arg Attributes //! ### Arg Attributes
@ -305,7 +305,7 @@
//! ## Doc Comments //! ## Doc Comments
//! //!
//! In clap, help messages for the whole binary can be specified //! In clap, help messages for the whole binary can be specified
//! via [`Command::about`][crate::App::about] and [`Command::long_about`][crate::App::long_about] while help messages //! via [`Command::about`][crate::Command::about] and [`Command::long_about`][crate::Command::long_about] while help messages
//! for individual arguments can be specified via [`Arg::help`][crate::Arg::help] and [`Arg::long_help`][crate::Arg::long_help]. //! for individual arguments can be specified via [`Arg::help`][crate::Arg::help] and [`Arg::long_help`][crate::Arg::long_help].
//! //!
//! `long_*` variants are used when user calls the program with //! `long_*` variants are used when user calls the program with
@ -488,7 +488,7 @@
//! [`CommandFactory::command`][crate::CommandFactory::command] (implemented when deriving //! [`CommandFactory::command`][crate::CommandFactory::command] (implemented when deriving
//! [`Parser`][crate::Parser]) //! [`Parser`][crate::Parser])
//! - Proactively check for bad [`Command`][crate::Command] configurations by calling //! - Proactively check for bad [`Command`][crate::Command] configurations by calling
//! [`Command::debug_assert`][crate::App::debug_assert] in a test //! [`Command::debug_assert`][crate::Command::debug_assert] in a test
//! ([example](../tutorial_derive/05_01_assert.rs)) //! ([example](../tutorial_derive/05_01_assert.rs))
pub mod _tutorial; pub mod _tutorial;

View file

@ -198,7 +198,7 @@
//! //!
//! clap reports most development errors as `debug_assert!`s. Rather than checking every //! clap reports most development errors as `debug_assert!`s. Rather than checking every
//! subcommand, you should have a test that calls //! subcommand, you should have a test that calls
//! [`Command::debug_assert`][crate::App::debug_assert]: //! [`Command::debug_assert`][crate::Command::debug_assert]:
//! ```rust,no_run //! ```rust,no_run
#![doc = include_str!("../examples/tutorial_builder/05_01_assert.rs")] #![doc = include_str!("../examples/tutorial_builder/05_01_assert.rs")]
//! ``` //! ```

View file

@ -196,9 +196,9 @@ pub enum ArgAction {
/// ); /// );
/// ``` /// ```
Count, Count,
/// When encountered, display [`Command::print_help`][super::App::print_help] /// When encountered, display [`Command::print_help`][super::Command::print_help]
/// ///
/// Depending on the flag, [`Command::print_long_help`][super::App::print_long_help] may be shown /// Depending on the flag, [`Command::print_long_help`][super::Command::print_long_help] may be shown
/// ///
/// # Examples /// # Examples
/// ///
@ -221,9 +221,9 @@ pub enum ArgAction {
/// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp); /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);
/// ``` /// ```
Help, Help,
/// When encountered, display [`Command::version`][super::App::version] /// When encountered, display [`Command::version`][super::Command::version]
/// ///
/// Depending on the flag, [`Command::long_version`][super::App::long_version] may be shown /// Depending on the flag, [`Command::long_version`][super::Command::long_version] may be shown
/// ///
/// # Examples /// # Examples
/// ///

View file

@ -39,11 +39,11 @@ use crate::builder::debug_asserts::assert_app;
/// [`CommandFactory::command`][crate::CommandFactory::command] to access the /// [`CommandFactory::command`][crate::CommandFactory::command] to access the
/// `Command`. /// `Command`.
/// ///
/// - [Basic API][crate::App#basic-api] /// - [Basic API][crate::Command#basic-api]
/// - [Application-wide Settings][crate::App#application-wide-settings] /// - [Application-wide Settings][crate::Command#application-wide-settings]
/// - [Command-specific Settings][crate::App#command-specific-settings] /// - [Command-specific Settings][crate::Command#command-specific-settings]
/// - [Subcommand-specific Settings][crate::App#subcommand-specific-settings] /// - [Subcommand-specific Settings][crate::Command#subcommand-specific-settings]
/// - [Reflection][crate::App#reflection] /// - [Reflection][crate::Command#reflection]
/// ///
/// # Examples /// # Examples
/// ///
@ -62,16 +62,9 @@ use crate::builder::debug_asserts::assert_app;
/// ///
/// // Your program logic starts here... /// // Your program logic starts here...
/// ``` /// ```
/// [`App::get_matches`]: Command::get_matches() /// [`Command::get_matches`]: Command::get_matches()
pub type Command<'help> = App<'help>;
/// Deprecated, replaced with [`Command`]
#[cfg_attr(
feature = "deprecated",
deprecated(since = "3.1.0", note = "Replaced with `Command`")
)]
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct App<'help> { pub struct Command<'help> {
id: Id, id: Id,
name: String, name: String,
long_flag: Option<&'help str>, long_flag: Option<&'help str>,
@ -100,7 +93,7 @@ pub struct App<'help> {
settings: AppFlags, settings: AppFlags,
g_settings: AppFlags, g_settings: AppFlags,
args: MKeyMap<'help>, args: MKeyMap<'help>,
subcommands: Vec<App<'help>>, subcommands: Vec<Command<'help>>,
replacers: HashMap<&'help str, &'help [&'help str]>, replacers: HashMap<&'help str, &'help [&'help str]>,
groups: Vec<ArgGroup<'help>>, groups: Vec<ArgGroup<'help>>,
current_help_heading: Option<&'help str>, current_help_heading: Option<&'help str>,
@ -110,7 +103,7 @@ pub struct App<'help> {
} }
/// # Basic API /// # Basic API
impl<'help> App<'help> { impl<'help> Command<'help> {
/// Creates a new instance of an `Command`. /// Creates a new instance of an `Command`.
/// ///
/// It is common, but not required, to use binary name as the `name`. This /// It is common, but not required, to use binary name as the `name`. This
@ -131,8 +124,8 @@ impl<'help> App<'help> {
/// ///
/// If we don't do this rustc will unnecessarily generate multiple versions /// If we don't do this rustc will unnecessarily generate multiple versions
/// of this code. /// of this code.
fn new_inner<'help>(name: String) -> App<'help> { fn new_inner<'help>(name: String) -> Command<'help> {
App { Command {
id: Id::from(&*name), id: Id::from(&*name),
name, name,
..Default::default() ..Default::default()
@ -296,7 +289,7 @@ impl<'help> App<'help> {
#[must_use] #[must_use]
pub fn mut_subcommand<'a, T, F>(mut self, subcmd_id: T, f: F) -> Self pub fn mut_subcommand<'a, T, F>(mut self, subcmd_id: T, f: F) -> Self
where where
F: FnOnce(App<'help>) -> App<'help>, F: FnOnce(Self) -> Self,
T: Into<&'a str>, T: Into<&'a str>,
{ {
let subcmd_id: &str = subcmd_id.into(); let subcmd_id: &str = subcmd_id.into();
@ -307,7 +300,7 @@ impl<'help> App<'help> {
let subcmd = if let Some(idx) = pos { let subcmd = if let Some(idx) = pos {
self.subcommands.remove(idx) self.subcommands.remove(idx)
} else { } else {
App::new(subcmd_id) Self::new(subcmd_id)
}; };
self.subcommands.push(f(subcmd)); self.subcommands.push(f(subcmd));
@ -408,7 +401,7 @@ impl<'help> App<'help> {
/// ``` /// ```
#[inline] #[inline]
#[must_use] #[must_use]
pub fn subcommand<S: Into<App<'help>>>(mut self, subcmd: S) -> Self { pub fn subcommand<S: Into<Self>>(mut self, subcmd: S) -> Self {
self.subcommands.push(subcmd.into()); self.subcommands.push(subcmd.into());
self self
} }
@ -431,7 +424,7 @@ impl<'help> App<'help> {
pub fn subcommands<I, T>(mut self, subcmds: I) -> Self pub fn subcommands<I, T>(mut self, subcmds: I) -> Self
where where
I: IntoIterator<Item = T>, I: IntoIterator<Item = T>,
T: Into<App<'help>>, T: Into<Self>,
{ {
for subcmd in subcmds.into_iter() { for subcmd in subcmds.into_iter() {
self.subcommands.push(subcmd.into()); self.subcommands.push(subcmd.into());
@ -502,7 +495,7 @@ impl<'help> App<'help> {
/// .get_matches(); /// .get_matches();
/// ``` /// ```
/// [`env::args_os`]: std::env::args_os() /// [`env::args_os`]: std::env::args_os()
/// [`App::try_get_matches_from_mut`]: Command::try_get_matches_from_mut() /// [`Command::try_get_matches_from_mut`]: Command::try_get_matches_from_mut()
#[inline] #[inline]
pub fn get_matches(self) -> ArgMatches { pub fn get_matches(self) -> ArgMatches {
self.get_matches_from(&mut env::args_os()) self.get_matches_from(&mut env::args_os())
@ -510,7 +503,7 @@ impl<'help> App<'help> {
/// Parse [`env::args_os`], exiting on failure. /// Parse [`env::args_os`], exiting on failure.
/// ///
/// Like [`App::get_matches`] but doesn't consume the `Command`. /// Like [`Command::get_matches`] but doesn't consume the `Command`.
/// ///
/// # Panics /// # Panics
/// ///
@ -526,7 +519,7 @@ impl<'help> App<'help> {
/// let matches = cmd.get_matches_mut(); /// let matches = cmd.get_matches_mut();
/// ``` /// ```
/// [`env::args_os`]: std::env::args_os() /// [`env::args_os`]: std::env::args_os()
/// [`App::get_matches`]: Command::get_matches() /// [`Command::get_matches`]: Command::get_matches()
pub fn get_matches_mut(&mut self) -> ArgMatches { pub fn get_matches_mut(&mut self) -> ArgMatches {
self.try_get_matches_from_mut(&mut env::args_os()) self.try_get_matches_from_mut(&mut env::args_os())
.unwrap_or_else(|e| e.exit()) .unwrap_or_else(|e| e.exit())
@ -585,7 +578,7 @@ impl<'help> App<'help> {
/// // Args and options go here... /// // Args and options go here...
/// .get_matches_from(arg_vec); /// .get_matches_from(arg_vec);
/// ``` /// ```
/// [`App::get_matches`]: Command::get_matches() /// [`Command::get_matches`]: Command::get_matches()
/// [`clap::Result`]: Result /// [`clap::Result`]: Result
/// [`Vec`]: std::vec::Vec /// [`Vec`]: std::vec::Vec
pub fn get_matches_from<I, T>(mut self, itr: I) -> ArgMatches pub fn get_matches_from<I, T>(mut self, itr: I) -> ArgMatches
@ -624,8 +617,8 @@ impl<'help> App<'help> {
/// .try_get_matches_from(arg_vec) /// .try_get_matches_from(arg_vec)
/// .unwrap_or_else(|e| e.exit()); /// .unwrap_or_else(|e| e.exit());
/// ``` /// ```
/// [`App::get_matches_from`]: Command::get_matches_from() /// [`Command::get_matches_from`]: Command::get_matches_from()
/// [`App::try_get_matches`]: Command::try_get_matches() /// [`Command::try_get_matches`]: Command::try_get_matches()
/// [`Error::exit`]: crate::Error::exit() /// [`Error::exit`]: crate::Error::exit()
/// [`std::process::exit`]: std::process::exit() /// [`std::process::exit`]: std::process::exit()
/// [`clap::Error`]: crate::Error /// [`clap::Error`]: crate::Error
@ -644,7 +637,7 @@ impl<'help> App<'help> {
/// Parse the specified arguments, returning a [`clap::Result`] on failure. /// Parse the specified arguments, returning a [`clap::Result`] on failure.
/// ///
/// Like [`App::try_get_matches_from`] but doesn't consume the `Command`. /// Like [`Command::try_get_matches_from`] but doesn't consume the `Command`.
/// ///
/// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are
/// used. It will return a [`clap::Error`], where the [`kind`] is a [`ErrorKind::DisplayHelp`] /// used. It will return a [`clap::Error`], where the [`kind`] is a [`ErrorKind::DisplayHelp`]
@ -669,7 +662,7 @@ impl<'help> App<'help> {
/// let matches = cmd.try_get_matches_from_mut(arg_vec) /// let matches = cmd.try_get_matches_from_mut(arg_vec)
/// .unwrap_or_else(|e| e.exit()); /// .unwrap_or_else(|e| e.exit());
/// ``` /// ```
/// [`App::try_get_matches_from`]: Command::try_get_matches_from() /// [`Command::try_get_matches_from`]: Command::try_get_matches_from()
/// [`clap::Result`]: Result /// [`clap::Result`]: Result
/// [`clap::Error`]: crate::Error /// [`clap::Error`]: crate::Error
/// [`kind`]: crate::Error /// [`kind`]: crate::Error
@ -892,11 +885,11 @@ impl<'help> App<'help> {
/// ///
/// These settings will apply to the top-level command and all subcommands, by default. Some /// These settings will apply to the top-level command and all subcommands, by default. Some
/// settings can be overridden in subcommands. /// settings can be overridden in subcommands.
impl<'help> App<'help> { impl<'help> Command<'help> {
/// Specifies that the parser should not assume the first argument passed is the binary name. /// Specifies that the parser should not assume the first argument passed is the binary name.
/// ///
/// This is normally the case when using a "daemon" style mode. For shells / REPLs, see /// This is normally the case when using a "daemon" style mode. For shells / REPLs, see
/// [`Command::multicall`][App::multicall]. /// [`Command::multicall`][Command::multicall].
/// ///
/// # Examples /// # Examples
/// ///
@ -1371,7 +1364,7 @@ impl<'help> App<'help> {
/// # Command-specific Settings /// # Command-specific Settings
/// ///
/// These apply only to the current command and are not inherited by subcommands. /// These apply only to the current command and are not inherited by subcommands.
impl<'help> App<'help> { impl<'help> Command<'help> {
/// (Re)Sets the program's name. /// (Re)Sets the program's name.
/// ///
/// See [`Command::new`] for more details. /// See [`Command::new`] for more details.
@ -1494,7 +1487,7 @@ impl<'help> App<'help> {
/// a few lines of text, but that's ok!") /// a few lines of text, but that's ok!")
/// # ; /// # ;
/// ``` /// ```
/// [`App::about`]: Command::about() /// [`Command::about`]: Command::about()
#[must_use] #[must_use]
pub fn long_about<O: Into<Option<&'help str>>>(mut self, long_about: O) -> Self { pub fn long_about<O: Into<Option<&'help str>>>(mut self, long_about: O) -> Self {
self.long_about = long_about.into(); self.long_about = long_about.into();
@ -1720,8 +1713,8 @@ impl<'help> App<'help> {
/// * `{options}` - Help for options. /// * `{options}` - Help for options.
/// * `{positionals}` - Help for positional arguments. /// * `{positionals}` - Help for positional arguments.
/// * `{subcommands}` - Help for subcommands. /// * `{subcommands}` - Help for subcommands.
/// * `{after-help}` - Help from [`App::after_help`] or [`Command::after_long_help`]. /// * `{after-help}` - Help from [`Command::after_help`] or [`Command::after_long_help`].
/// * `{before-help}` - Help from [`App::before_help`] or [`Command::before_long_help`]. /// * `{before-help}` - Help from [`Command::before_help`] or [`Command::before_long_help`].
/// ///
/// # Examples /// # Examples
/// ///
@ -1732,12 +1725,12 @@ impl<'help> App<'help> {
/// .help_template("{bin} ({version}) - {usage}") /// .help_template("{bin} ({version}) - {usage}")
/// # ; /// # ;
/// ``` /// ```
/// [`App::about`]: Command::about() /// [`Command::about`]: Command::about()
/// [`App::long_about`]: Command::long_about() /// [`Command::long_about`]: Command::long_about()
/// [`App::after_help`]: Command::after_help() /// [`Command::after_help`]: Command::after_help()
/// [`App::after_long_help`]: Command::after_long_help() /// [`Command::after_long_help`]: Command::after_long_help()
/// [`App::before_help`]: Command::before_help() /// [`Command::before_help`]: Command::before_help()
/// [`App::before_long_help`]: Command::before_long_help() /// [`Command::before_long_help`]: Command::before_long_help()
#[must_use] #[must_use]
pub fn help_template<S: Into<&'help str>>(mut self, s: S) -> Self { pub fn help_template<S: Into<&'help str>>(mut self, s: S) -> Self {
self.template = Some(s.into()); self.template = Some(s.into());
@ -1858,7 +1851,7 @@ impl<'help> App<'help> {
/// ///
/// For subcommands, see [`Command::subcommand_help_heading`] /// For subcommands, see [`Command::subcommand_help_heading`]
/// ///
/// [`App::arg`]: Command::arg() /// [`Command::arg`]: Command::arg()
/// [`Arg::help_heading`]: crate::Arg::help_heading() /// [`Arg::help_heading`]: crate::Arg::help_heading()
#[inline] #[inline]
#[must_use] #[must_use]
@ -1986,7 +1979,7 @@ impl<'help> App<'help> {
/// assert_eq!(m.get_one::<String>("format").unwrap(), "json"); /// assert_eq!(m.get_one::<String>("format").unwrap(), "json");
/// ``` /// ```
/// ///
/// [`App::replace`]: Command::replace() /// [`Command::replace`]: Command::replace()
#[inline] #[inline]
#[cfg(feature = "unstable-replace")] #[cfg(feature = "unstable-replace")]
#[must_use] #[must_use]
@ -2227,7 +2220,7 @@ impl<'help> App<'help> {
} }
/// # Subcommand-specific Settings /// # Subcommand-specific Settings
impl<'help> App<'help> { impl<'help> Command<'help> {
/// Sets the short version of the subcommand flag without the preceding `-`. /// Sets the short version of the subcommand flag without the preceding `-`.
/// ///
/// Allows the subcommand to be used as if it were an [`Arg::short`]. /// Allows the subcommand to be used as if it were an [`Arg::short`].
@ -2328,7 +2321,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "do-stuff"]); /// .get_matches_from(vec!["myprog", "do-stuff"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::visible_alias`]: Command::visible_alias() /// [`Command::visible_alias`]: Command::visible_alias()
#[must_use] #[must_use]
pub fn alias<S: Into<&'help str>>(mut self, name: S) -> Self { pub fn alias<S: Into<&'help str>>(mut self, name: S) -> Self {
self.aliases.push((name.into(), false)); self.aliases.push((name.into(), false));
@ -2407,7 +2400,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "do-tests"]); /// .get_matches_from(vec!["myprog", "do-tests"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::visible_aliases`]: Command::visible_aliases() /// [`Command::visible_aliases`]: Command::visible_aliases()
#[must_use] #[must_use]
pub fn aliases(mut self, names: &[&'help str]) -> Self { pub fn aliases(mut self, names: &[&'help str]) -> Self {
self.aliases.extend(names.iter().map(|n| (*n, false))); self.aliases.extend(names.iter().map(|n| (*n, false)));
@ -2495,7 +2488,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "do-stuff"]); /// .get_matches_from(vec!["myprog", "do-stuff"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::alias`]: Command::alias() /// [`Command::alias`]: Command::alias()
#[must_use] #[must_use]
pub fn visible_alias<S: Into<&'help str>>(mut self, name: S) -> Self { pub fn visible_alias<S: Into<&'help str>>(mut self, name: S) -> Self {
self.aliases.push((name.into(), true)); self.aliases.push((name.into(), true));
@ -2520,7 +2513,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "-d"]); /// .get_matches_from(vec!["myprog", "-d"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::short_flag_alias`]: Command::short_flag_alias() /// [`Command::short_flag_alias`]: Command::short_flag_alias()
#[must_use] #[must_use]
pub fn visible_short_flag_alias(mut self, name: char) -> Self { pub fn visible_short_flag_alias(mut self, name: char) -> Self {
assert!(name != '-', "short alias name cannot be `-`"); assert!(name != '-', "short alias name cannot be `-`");
@ -2546,7 +2539,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "--testing"]); /// .get_matches_from(vec!["myprog", "--testing"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::long_flag_alias`]: Command::long_flag_alias() /// [`Command::long_flag_alias`]: Command::long_flag_alias()
#[must_use] #[must_use]
pub fn visible_long_flag_alias(mut self, name: &'help str) -> Self { pub fn visible_long_flag_alias(mut self, name: &'help str) -> Self {
self.long_flag_aliases.push((name, true)); self.long_flag_aliases.push((name, true));
@ -2579,7 +2572,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "do-stuff"]); /// .get_matches_from(vec!["myprog", "do-stuff"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::alias`]: Command::alias() /// [`Command::alias`]: Command::alias()
#[must_use] #[must_use]
pub fn visible_aliases(mut self, names: &[&'help str]) -> Self { pub fn visible_aliases(mut self, names: &[&'help str]) -> Self {
self.aliases.extend(names.iter().map(|n| (*n, true))); self.aliases.extend(names.iter().map(|n| (*n, true)));
@ -2600,7 +2593,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "-t"]); /// .get_matches_from(vec!["myprog", "-t"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::short_flag_aliases`]: Command::short_flag_aliases() /// [`Command::short_flag_aliases`]: Command::short_flag_aliases()
#[must_use] #[must_use]
pub fn visible_short_flag_aliases(mut self, names: &[char]) -> Self { pub fn visible_short_flag_aliases(mut self, names: &[char]) -> Self {
for s in names { for s in names {
@ -2624,7 +2617,7 @@ impl<'help> App<'help> {
/// .get_matches_from(vec!["myprog", "--testing"]); /// .get_matches_from(vec!["myprog", "--testing"]);
/// assert_eq!(m.subcommand_name(), Some("test")); /// assert_eq!(m.subcommand_name(), Some("test"));
/// ``` /// ```
/// [`App::long_flag_aliases`]: Command::long_flag_aliases() /// [`Command::long_flag_aliases`]: Command::long_flag_aliases()
#[must_use] #[must_use]
pub fn visible_long_flag_aliases(mut self, names: &[&'help str]) -> Self { pub fn visible_long_flag_aliases(mut self, names: &[&'help str]) -> Self {
for s in names { for s in names {
@ -2991,7 +2984,7 @@ impl<'help> App<'help> {
/// ///
/// Setting `multicall` will cause /// Setting `multicall` will cause
/// - `argv[0]` to be stripped to the base name and parsed as the first argument, as if /// - `argv[0]` to be stripped to the base name and parsed as the first argument, as if
/// [`Command::no_binary_name`][App::no_binary_name] was set. /// [`Command::no_binary_name`][Command::no_binary_name] was set.
/// - Help and errors to report subcommands as if they were the top-level command /// - Help and errors to report subcommands as if they were the top-level command
/// ///
/// When the subcommand is not present, there are several strategies you may employ, depending /// When the subcommand is not present, there are several strategies you may employ, depending
@ -2999,13 +2992,13 @@ impl<'help> App<'help> {
/// - Let the error percolate up normally /// - Let the error percolate up normally
/// - Print a specialized error message using the /// - Print a specialized error message using the
/// [`Error::context`][crate::Error::context] /// [`Error::context`][crate::Error::context]
/// - Print the [help][App::write_help] but this might be ambiguous /// - Print the [help][Command::write_help] but this might be ambiguous
/// - Disable `multicall` and re-parse it /// - Disable `multicall` and re-parse it
/// - Disable `multicall` and re-parse it with a specific subcommand /// - Disable `multicall` and re-parse it with a specific subcommand
/// ///
/// When detecting the error condition, the [`ErrorKind`] isn't sufficient as a sub-subcommand /// When detecting the error condition, the [`ErrorKind`] isn't sufficient as a sub-subcommand
/// might report the same error. Enable /// might report the same error. Enable
/// [`allow_external_subcommands`][App::allow_external_subcommands] if you want to specifically /// [`allow_external_subcommands`][Command::allow_external_subcommands] if you want to specifically
/// get the unrecognized binary name. /// get the unrecognized binary name.
/// ///
/// **NOTE:** Multicall can't be used with [`no_binary_name`] since they interpret /// **NOTE:** Multicall can't be used with [`no_binary_name`] since they interpret
@ -3088,8 +3081,8 @@ impl<'help> App<'help> {
/// ``` /// ```
/// ///
/// [`no_binary_name`]: crate::Command::no_binary_name /// [`no_binary_name`]: crate::Command::no_binary_name
/// [`App::subcommand_value_name`]: crate::Command::subcommand_value_name /// [`Command::subcommand_value_name`]: crate::Command::subcommand_value_name
/// [`App::subcommand_help_heading`]: crate::Command::subcommand_help_heading /// [`Command::subcommand_help_heading`]: crate::Command::subcommand_help_heading
#[inline] #[inline]
pub fn multicall(self, yes: bool) -> Self { pub fn multicall(self, yes: bool) -> Self {
if yes { if yes {
@ -3239,7 +3232,7 @@ impl<'help> App<'help> {
} }
/// # Reflection /// # Reflection
impl<'help> App<'help> { impl<'help> Command<'help> {
#[inline] #[inline]
pub(crate) fn get_usage_name(&self) -> Option<&str> { pub(crate) fn get_usage_name(&self) -> Option<&str> {
self.usage_name.as_deref() self.usage_name.as_deref()
@ -3300,7 +3293,7 @@ impl<'help> App<'help> {
/// Get the help message specified via [`Command::about`]. /// Get the help message specified via [`Command::about`].
/// ///
/// [`App::about`]: Command::about() /// [`Command::about`]: Command::about()
#[inline] #[inline]
pub fn get_about(&self) -> Option<&'help str> { pub fn get_about(&self) -> Option<&'help str> {
self.about self.about
@ -3308,7 +3301,7 @@ impl<'help> App<'help> {
/// Get the help message specified via [`Command::long_about`]. /// Get the help message specified via [`Command::long_about`].
/// ///
/// [`App::long_about`]: Command::long_about() /// [`Command::long_about`]: Command::long_about()
#[inline] #[inline]
pub fn get_long_about(&self) -> Option<&'help str> { pub fn get_long_about(&self) -> Option<&'help str> {
self.long_about self.long_about
@ -3316,7 +3309,7 @@ impl<'help> App<'help> {
/// Get the custom section heading specified via [`Command::next_help_heading`]. /// Get the custom section heading specified via [`Command::next_help_heading`].
/// ///
/// [`App::help_heading`]: Command::help_heading() /// [`Command::help_heading`]: Command::help_heading()
#[inline] #[inline]
pub fn get_next_help_heading(&self) -> Option<&'help str> { pub fn get_next_help_heading(&self) -> Option<&'help str> {
self.current_help_heading self.current_help_heading
@ -3399,13 +3392,13 @@ impl<'help> App<'help> {
/// Iterate through the set of subcommands, getting a reference to each. /// Iterate through the set of subcommands, getting a reference to each.
#[inline] #[inline]
pub fn get_subcommands(&self) -> impl Iterator<Item = &App<'help>> { pub fn get_subcommands(&self) -> impl Iterator<Item = &Command<'help>> {
self.subcommands.iter() self.subcommands.iter()
} }
/// Iterate through the set of subcommands, getting a mutable reference to each. /// Iterate through the set of subcommands, getting a mutable reference to each.
#[inline] #[inline]
pub fn get_subcommands_mut(&mut self) -> impl Iterator<Item = &mut App<'help>> { pub fn get_subcommands_mut(&mut self) -> impl Iterator<Item = &mut Command<'help>> {
self.subcommands.iter_mut() self.subcommands.iter_mut()
} }
@ -3455,7 +3448,7 @@ impl<'help> App<'help> {
/// ///
/// This does not recurse through subcommands of subcommands. /// This does not recurse through subcommands of subcommands.
#[inline] #[inline]
pub fn find_subcommand<T>(&self, name: &T) -> Option<&App<'help>> pub fn find_subcommand<T>(&self, name: &T) -> Option<&Command<'help>>
where where
T: PartialEq<str> + ?Sized, T: PartialEq<str> + ?Sized,
{ {
@ -3467,7 +3460,7 @@ impl<'help> App<'help> {
/// ///
/// This does not recurse through subcommands of subcommands. /// This does not recurse through subcommands of subcommands.
#[inline] #[inline]
pub fn find_subcommand_mut<T>(&mut self, name: &T) -> Option<&mut App<'help>> pub fn find_subcommand_mut<T>(&mut self, name: &T) -> Option<&mut Command<'help>>
where where
T: PartialEq<str> + ?Sized, T: PartialEq<str> + ?Sized,
{ {
@ -3538,7 +3531,7 @@ impl<'help> App<'help> {
// ### Panics // ### Panics
// //
// If the given arg contains a conflict with an argument that is unknown to // If the given arg contains a conflict with an argument that is unknown to
// this `App`. // this `Command`.
fn get_global_arg_conflicts_with(&self, arg: &Arg) -> Vec<&Arg<'help>> // FIXME: This could probably have been an iterator fn get_global_arg_conflicts_with(&self, arg: &Arg) -> Vec<&Arg<'help>> // FIXME: This could probably have been an iterator
{ {
arg.blacklist arg.blacklist
@ -3573,7 +3566,7 @@ impl<'help> App<'help> {
// Subcommand_1.1 (doesn't contain Arg) // Subcommand_1.1 (doesn't contain Arg)
// Subcommand_1.1.1 (contains Arg) // Subcommand_1.1.1 (contains Arg)
// //
fn get_subcommands_containing(&self, arg: &Arg) -> Vec<&App<'help>> { fn get_subcommands_containing(&self, arg: &Arg) -> Vec<&Self> {
let mut vec = std::vec::Vec::new(); let mut vec = std::vec::Vec::new();
for idx in 0..self.subcommands.len() { for idx in 0..self.subcommands.len() {
if self.subcommands[idx].args.args().any(|ar| ar.id == arg.id) { if self.subcommands[idx].args.args().any(|ar| ar.id == arg.id) {
@ -3740,7 +3733,7 @@ impl<'help> App<'help> {
} }
// Internally used only // Internally used only
impl<'help> App<'help> { impl<'help> Command<'help> {
pub(crate) fn get_id(&self) -> Id { pub(crate) fn get_id(&self) -> Id {
self.id.clone() self.id.clone()
} }
@ -4370,7 +4363,7 @@ To change `help`s short, call `cmd.arg(Arg::new(\"help\")...)`.",
&& !self.subcommands.iter().any(|s| s.id == Id::help_hash()) && !self.subcommands.iter().any(|s| s.id == Id::help_hash())
{ {
debug!("Command::_check_help_and_version: Building help subcommand"); debug!("Command::_check_help_and_version: Building help subcommand");
let mut help_subcmd = App::new("help") let mut help_subcmd = Command::new("help")
.about("Print this message or the help of the given subcommand(s)") .about("Print this message or the help of the given subcommand(s)")
.arg( .arg(
Arg::new("subcommand") Arg::new("subcommand")
@ -4461,7 +4454,7 @@ pub(crate) trait Captures<'a> {}
impl<'a, T> Captures<'a> for T {} impl<'a, T> Captures<'a> for T {}
// Internal Query Methods // Internal Query Methods
impl<'help> App<'help> { impl<'help> Command<'help> {
/// Iterate through the *flags* & *options* arguments. /// Iterate through the *flags* & *options* arguments.
pub(crate) fn get_non_positionals(&self) -> impl Iterator<Item = &Arg<'help>> { pub(crate) fn get_non_positionals(&self) -> impl Iterator<Item = &Arg<'help>> {
self.get_arguments().filter(|a| !a.is_positional()) self.get_arguments().filter(|a| !a.is_positional())
@ -4487,7 +4480,7 @@ impl<'help> App<'help> {
pub(crate) fn contains_short(&self, s: char) -> bool { pub(crate) fn contains_short(&self, s: char) -> bool {
assert!( assert!(
self.is_set(AppSettings::Built), self.is_set(AppSettings::Built),
"If App::_build hasn't been called, manually search through Arg shorts" "If Command::_build hasn't been called, manually search through Arg shorts"
); );
self.args.contains(s) self.args.contains(s)
@ -4724,7 +4717,7 @@ impl<'help> App<'help> {
} }
} }
impl<'help> Default for App<'help> { impl<'help> Default for Command<'help> {
fn default() -> Self { fn default() -> Self {
Self { Self {
id: Default::default(), id: Default::default(),
@ -4766,7 +4759,7 @@ impl<'help> Default for App<'help> {
} }
} }
impl<'help> Index<&'_ Id> for App<'help> { impl<'help> Index<&'_ Id> for Command<'help> {
type Output = Arg<'help>; type Output = Arg<'help>;
fn index(&self, key: &Id) -> &Self::Output { fn index(&self, key: &Id) -> &Self::Output {
@ -4774,7 +4767,7 @@ impl<'help> Index<&'_ Id> for App<'help> {
} }
} }
impl fmt::Display for App<'_> { impl fmt::Display for Command<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.name) write!(f, "{}", self.name)
} }

View file

@ -43,9 +43,6 @@ pub use value_parser::NonEmptyStringValueParser;
pub use value_parser::OsStringValueParser; pub use value_parser::OsStringValueParser;
pub use value_parser::PathBufValueParser; pub use value_parser::PathBufValueParser;
#[allow(deprecated)]
pub use command::App;
pub(crate) use action::CountType; pub(crate) use action::CountType;
pub(crate) use arg::display_arg_val; pub(crate) use arg::display_arg_val;
pub(crate) use arg_predicate::ArgPredicate; pub(crate) use arg_predicate::ArgPredicate;

View file

@ -109,7 +109,6 @@ pub(crate) use crate::util::color::ColorChoice;
pub use crate::derive::{Args, CommandFactory, FromArgMatches, Parser, Subcommand, ValueEnum}; pub use crate::derive::{Args, CommandFactory, FromArgMatches, Parser, Subcommand, ValueEnum};
#[allow(deprecated)] #[allow(deprecated)]
pub use crate::builder::App;
pub use crate::builder::{AppFlags, AppSettings, ArgFlags, ArgSettings, PossibleValue, ValueHint}; pub use crate::builder::{AppFlags, AppSettings, ArgFlags, ArgSettings, PossibleValue, ValueHint};
pub use crate::error::{ErrorKind, Result}; pub use crate::error::{ErrorKind, Result};
#[allow(deprecated)] #[allow(deprecated)]