summaryrefslogtreecommitdiffstats
path: root/vendor/clap/src/output/usage.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/clap/src/output/usage.rs')
-rw-r--r--vendor/clap/src/output/usage.rs449
1 files changed, 0 insertions, 449 deletions
diff --git a/vendor/clap/src/output/usage.rs b/vendor/clap/src/output/usage.rs
deleted file mode 100644
index 6f7a2cad4..000000000
--- a/vendor/clap/src/output/usage.rs
+++ /dev/null
@@ -1,449 +0,0 @@
-use indexmap::IndexSet;
-
-// Internal
-use crate::builder::AppSettings as AS;
-use crate::builder::{Arg, ArgPredicate, Command};
-use crate::parser::ArgMatcher;
-use crate::util::ChildGraph;
-use crate::util::Id;
-use crate::INTERNAL_ERROR_MSG;
-
-pub(crate) struct Usage<'help, 'cmd> {
- cmd: &'cmd Command<'help>,
- required: Option<&'cmd ChildGraph<Id>>,
-}
-
-impl<'help, 'cmd> Usage<'help, 'cmd> {
- pub(crate) fn new(cmd: &'cmd Command<'help>) -> Self {
- Usage {
- cmd,
- required: None,
- }
- }
-
- pub(crate) fn required(mut self, required: &'cmd ChildGraph<Id>) -> Self {
- self.required = Some(required);
- self
- }
-
- // Creates a usage string for display. This happens just after all arguments were parsed, but before
- // any subcommands have been parsed (so as to give subcommands their own usage recursively)
- pub(crate) fn create_usage_with_title(&self, used: &[Id]) -> String {
- debug!("Usage::create_usage_with_title");
- let mut usage = String::with_capacity(75);
- usage.push_str("USAGE:\n ");
- usage.push_str(&*self.create_usage_no_title(used));
- usage
- }
-
- // Creates a usage string (*without title*) if one was not provided by the user manually.
- pub(crate) fn create_usage_no_title(&self, used: &[Id]) -> String {
- debug!("Usage::create_usage_no_title");
- if let Some(u) = self.cmd.get_override_usage() {
- String::from(&*u)
- } else if used.is_empty() {
- self.create_help_usage(true)
- } else {
- self.create_smart_usage(used)
- }
- }
-
- // Creates a usage string for display in help messages (i.e. not for errors)
- fn create_help_usage(&self, incl_reqs: bool) -> String {
- debug!("Usage::create_help_usage; incl_reqs={:?}", incl_reqs);
- let mut usage = String::with_capacity(75);
- let name = self
- .cmd
- .get_usage_name()
- .or_else(|| self.cmd.get_bin_name())
- .unwrap_or_else(|| self.cmd.get_name());
- usage.push_str(name);
- let req_string = if incl_reqs {
- self.get_required_usage_from(&[], None, false)
- .iter()
- .fold(String::new(), |a, s| a + " " + s)
- } else {
- String::new()
- };
-
- if self.needs_options_tag() {
- usage.push_str(" [OPTIONS]");
- }
-
- let allow_missing_positional = self.cmd.is_allow_missing_positional_set();
- if !allow_missing_positional {
- usage.push_str(&req_string);
- }
-
- let has_last = self.cmd.get_positionals().any(|p| p.is_last_set());
- // places a '--' in the usage string if there are args and options
- // supporting multiple values
- if self
- .cmd
- .get_non_positionals()
- .any(|o| o.is_multiple_values_set())
- && self.cmd.get_positionals().any(|p| !p.is_required_set())
- && !(self.cmd.has_visible_subcommands() || self.cmd.is_allow_external_subcommands_set())
- && !has_last
- {
- usage.push_str(" [--]");
- }
- let not_req_or_hidden =
- |p: &Arg| (!p.is_required_set() || p.is_last_set()) && !p.is_hide_set();
- if self.cmd.get_positionals().any(not_req_or_hidden) {
- if let Some(args_tag) = self.get_args_tag(incl_reqs) {
- usage.push_str(&*args_tag);
- } else {
- usage.push_str(" [ARGS]");
- }
- if has_last && incl_reqs {
- let pos = self
- .cmd
- .get_positionals()
- .find(|p| p.is_last_set())
- .expect(INTERNAL_ERROR_MSG);
- debug!("Usage::create_help_usage: '{}' has .last(true)", pos.name);
- let req = pos.is_required_set();
- if req && self.cmd.get_positionals().any(|p| !p.is_required_set()) {
- usage.push_str(" -- <");
- } else if req {
- usage.push_str(" [--] <");
- } else {
- usage.push_str(" [-- <");
- }
- usage.push_str(&*pos.name_no_brackets());
- usage.push('>');
- usage.push_str(pos.multiple_str());
- if !req {
- usage.push(']');
- }
- }
- }
-
- if allow_missing_positional {
- usage.push_str(&req_string);
- }
-
- // incl_reqs is only false when this function is called recursively
- if self.cmd.has_visible_subcommands() && incl_reqs
- || self.cmd.is_allow_external_subcommands_set()
- {
- let placeholder = self.cmd.get_subcommand_value_name().unwrap_or("SUBCOMMAND");
- #[allow(deprecated)]
- if self.cmd.is_subcommand_negates_reqs_set()
- || self.cmd.is_args_conflicts_with_subcommands_set()
- {
- usage.push_str("\n ");
- if !self.cmd.is_args_conflicts_with_subcommands_set() {
- usage.push_str(&*self.create_help_usage(false));
- } else {
- usage.push_str(&*name);
- }
- usage.push_str(" <");
- usage.push_str(placeholder);
- usage.push('>');
- } else if self.cmd.is_subcommand_required_set()
- || self.cmd.is_set(AS::SubcommandRequiredElseHelp)
- {
- usage.push_str(" <");
- usage.push_str(placeholder);
- usage.push('>');
- } else {
- usage.push_str(" [");
- usage.push_str(placeholder);
- usage.push(']');
- }
- }
- let usage = usage.trim().to_owned();
- debug!("Usage::create_help_usage: usage={}", usage);
- usage
- }
-
- // Creates a context aware usage string, or "smart usage" from currently used
- // args, and requirements
- fn create_smart_usage(&self, used: &[Id]) -> String {
- debug!("Usage::create_smart_usage");
- let mut usage = String::with_capacity(75);
-
- let r_string = self
- .get_required_usage_from(used, None, true)
- .iter()
- .fold(String::new(), |acc, s| acc + " " + s);
-
- usage.push_str(
- self.cmd
- .get_usage_name()
- .or_else(|| self.cmd.get_bin_name())
- .unwrap_or_else(|| self.cmd.get_name()),
- );
- usage.push_str(&*r_string);
- if self.cmd.is_subcommand_required_set() {
- usage.push_str(" <");
- usage.push_str(self.cmd.get_subcommand_value_name().unwrap_or("SUBCOMMAND"));
- usage.push('>');
- }
- usage.shrink_to_fit();
- usage
- }
-
- // Gets the `[ARGS]` tag for the usage string
- fn get_args_tag(&self, incl_reqs: bool) -> Option<String> {
- debug!("Usage::get_args_tag; incl_reqs = {:?}", incl_reqs);
- let mut count = 0;
- for pos in self
- .cmd
- .get_positionals()
- .filter(|pos| !pos.is_required_set())
- .filter(|pos| !pos.is_hide_set())
- .filter(|pos| !pos.is_last_set())
- {
- debug!("Usage::get_args_tag:iter:{}", pos.name);
- let required = self.cmd.groups_for_arg(&pos.id).any(|grp_s| {
- debug!("Usage::get_args_tag:iter:{:?}:iter:{:?}", pos.name, grp_s);
- // if it's part of a required group we don't want to count it
- self.cmd.get_groups().any(|g| g.required && (g.id == grp_s))
- });
- if !required {
- count += 1;
- debug!(
- "Usage::get_args_tag:iter: {} Args not required or hidden",
- count
- );
- }
- }
-
- if !self.cmd.is_dont_collapse_args_in_usage_set() && count > 1 {
- debug!("Usage::get_args_tag:iter: More than one, returning [ARGS]");
-
- // [ARGS]
- None
- } else if count == 1 && incl_reqs {
- let pos = self
- .cmd
- .get_positionals()
- .find(|pos| {
- !pos.is_required_set()
- && !pos.is_hide_set()
- && !pos.is_last_set()
- && !self.cmd.groups_for_arg(&pos.id).any(|grp_s| {
- debug!("Usage::get_args_tag:iter:{:?}:iter:{:?}", pos.name, grp_s);
- // if it's part of a required group we don't want to count it
- self.cmd.get_groups().any(|g| g.required && (g.id == grp_s))
- })
- })
- .expect(INTERNAL_ERROR_MSG);
-
- debug!(
- "Usage::get_args_tag:iter: Exactly one, returning '{}'",
- pos.name
- );
-
- Some(format!(
- " [{}]{}",
- pos.name_no_brackets(),
- pos.multiple_str()
- ))
- } else if self.cmd.is_dont_collapse_args_in_usage_set()
- && self.cmd.has_positionals()
- && incl_reqs
- {
- debug!("Usage::get_args_tag:iter: Don't collapse returning all");
- Some(
- self.cmd
- .get_positionals()
- .filter(|pos| !pos.is_required_set())
- .filter(|pos| !pos.is_hide_set())
- .filter(|pos| !pos.is_last_set())
- .map(|pos| format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str()))
- .collect::<Vec<_>>()
- .join(""),
- )
- } else if !incl_reqs {
- debug!("Usage::get_args_tag:iter: incl_reqs=false, building secondary usage string");
- let highest_req_pos = self
- .cmd
- .get_positionals()
- .filter_map(|pos| {
- if pos.is_required_set() && !pos.is_last_set() {
- Some(pos.index)
- } else {
- None
- }
- })
- .max()
- .unwrap_or_else(|| Some(self.cmd.get_positionals().count()));
- Some(
- self.cmd
- .get_positionals()
- .filter(|pos| pos.index <= highest_req_pos)
- .filter(|pos| !pos.is_required_set())
- .filter(|pos| !pos.is_hide_set())
- .filter(|pos| !pos.is_last_set())
- .map(|pos| format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str()))
- .collect::<Vec<_>>()
- .join(""),
- )
- } else {
- Some("".into())
- }
- }
-
- // Determines if we need the `[OPTIONS]` tag in the usage string
- fn needs_options_tag(&self) -> bool {
- debug!("Usage::needs_options_tag");
- 'outer: for f in self.cmd.get_non_positionals() {
- debug!("Usage::needs_options_tag:iter: f={}", f.name);
-
- // Don't print `[OPTIONS]` just for help or version
- if f.long == Some("help") || f.long == Some("version") {
- debug!("Usage::needs_options_tag:iter Option is built-in");
- continue;
- }
-
- if f.is_hide_set() {
- debug!("Usage::needs_options_tag:iter Option is hidden");
- continue;
- }
- if f.is_required_set() {
- debug!("Usage::needs_options_tag:iter Option is required");
- continue;
- }
- for grp_s in self.cmd.groups_for_arg(&f.id) {
- debug!("Usage::needs_options_tag:iter:iter: grp_s={:?}", grp_s);
- if self.cmd.get_groups().any(|g| g.id == grp_s && g.required) {
- debug!("Usage::needs_options_tag:iter:iter: Group is required");
- continue 'outer;
- }
- }
-
- debug!("Usage::needs_options_tag:iter: [OPTIONS] required");
- return true;
- }
-
- debug!("Usage::needs_options_tag: [OPTIONS] not required");
- false
- }
-
- // Returns the required args in usage string form by fully unrolling all groups
- // `incl_last`: should we include args that are Arg::Last? (i.e. `prog [foo] -- [last]). We
- // can't do that for required usages being built for subcommands because it would look like:
- // `prog [foo] -- [last] <subcommand>` which is totally wrong.
- pub(crate) fn get_required_usage_from(
- &self,
- incls: &[Id],
- matcher: Option<&ArgMatcher>,
- incl_last: bool,
- ) -> IndexSet<String> {
- debug!(
- "Usage::get_required_usage_from: incls={:?}, matcher={:?}, incl_last={:?}",
- incls,
- matcher.is_some(),
- incl_last
- );
- let mut ret_val = IndexSet::new();
-
- let mut unrolled_reqs = IndexSet::new();
-
- let required_owned;
- let required = if let Some(required) = self.required {
- required
- } else {
- required_owned = self.cmd.required_graph();
- &required_owned
- };
-
- for a in required.iter() {
- let is_relevant = |(val, req_arg): &(ArgPredicate<'_>, Id)| -> Option<Id> {
- let required = match val {
- ArgPredicate::Equals(_) => {
- if let Some(matcher) = matcher {
- matcher.check_explicit(a, *val)
- } else {
- false
- }
- }
- ArgPredicate::IsPresent => true,
- };
- required.then(|| req_arg.clone())
- };
-
- for aa in self.cmd.unroll_arg_requires(is_relevant, a) {
- // if we don't check for duplicates here this causes duplicate error messages
- // see https://github.com/clap-rs/clap/issues/2770
- unrolled_reqs.insert(aa);
- }
- // always include the required arg itself. it will not be enumerated
- // by unroll_requirements_for_arg.
- unrolled_reqs.insert(a.clone());
- }
-
- debug!(
- "Usage::get_required_usage_from: unrolled_reqs={:?}",
- unrolled_reqs
- );
-
- let mut required_groups_members = IndexSet::new();
- let mut required_opts = IndexSet::new();
- let mut required_groups = IndexSet::new();
- let mut required_positionals = Vec::new();
- for req in unrolled_reqs.iter().chain(incls.iter()) {
- if let Some(arg) = self.cmd.find(req) {
- let is_present = matcher
- .map(|m| m.check_explicit(req, ArgPredicate::IsPresent))
- .unwrap_or(false);
- debug!(
- "Usage::get_required_usage_from:iter:{:?} arg is_present={}",
- req, is_present
- );
- if !is_present {
- if arg.is_positional() {
- if incl_last || !arg.is_last_set() {
- required_positionals.push((arg.index.unwrap(), arg.to_string()));
- }
- } else {
- required_opts.insert(arg.to_string());
- }
- }
- } else {
- debug_assert!(self.cmd.find_group(req).is_some());
- let group_members = self.cmd.unroll_args_in_group(req);
- let is_present = matcher
- .map(|m| {
- group_members
- .iter()
- .any(|arg| m.check_explicit(arg, ArgPredicate::IsPresent))
- })
- .unwrap_or(false);
- debug!(
- "Usage::get_required_usage_from:iter:{:?} group is_present={}",
- req, is_present
- );
- if !is_present {
- let elem = self.cmd.format_group(req);
- required_groups.insert(elem);
- required_groups_members.extend(
- group_members
- .iter()
- .flat_map(|id| self.cmd.find(id))
- .map(|arg| arg.to_string()),
- );
- }
- }
- }
-
- required_opts.retain(|arg| !required_groups_members.contains(arg));
- ret_val.extend(required_opts);
-
- ret_val.extend(required_groups);
-
- required_positionals.sort_by_key(|(ind, _)| *ind); // sort by index
- for (_, p) in required_positionals {
- if !required_groups_members.contains(&p) {
- ret_val.insert(p);
- }
- }
-
- debug!("Usage::get_required_usage_from: ret_val={:?}", ret_val);
- ret_val
- }
-}