aboutsummaryrefslogtreecommitdiff
path: root/clap/src/suggestions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'clap/src/suggestions.rs')
-rw-r--r--clap/src/suggestions.rs147
1 files changed, 0 insertions, 147 deletions
diff --git a/clap/src/suggestions.rs b/clap/src/suggestions.rs
deleted file mode 100644
index 06071d2..0000000
--- a/clap/src/suggestions.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-use app::App;
-// Third Party
-#[cfg(feature = "suggestions")]
-use strsim;
-
-// Internal
-use fmt::Format;
-
-/// Produces a string from a given list of possible values which is similar to
-/// the passed in value `v` with a certain confidence.
-/// Thus in a list of possible values like ["foo", "bar"], the value "fop" will yield
-/// `Some("foo")`, whereas "blark" would yield `None`.
-#[cfg(feature = "suggestions")]
-#[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean<'a, T: ?Sized, I>(v: &str, possible_values: I) -> Option<&'a str>
-where
- T: AsRef<str> + 'a,
- I: IntoIterator<Item = &'a T>,
-{
- let mut candidate: Option<(f64, &str)> = None;
- for pv in possible_values {
- let confidence = strsim::jaro_winkler(v, pv.as_ref());
- if confidence > 0.8 && (candidate.is_none() || (candidate.as_ref().unwrap().0 < confidence))
- {
- candidate = Some((confidence, pv.as_ref()));
- }
- }
- match candidate {
- None => None,
- Some((_, candidate)) => Some(candidate),
- }
-}
-
-#[cfg(not(feature = "suggestions"))]
-pub fn did_you_mean<'a, T: ?Sized, I>(_: &str, _: I) -> Option<&'a str>
-where
- T: AsRef<str> + 'a,
- I: IntoIterator<Item = &'a T>,
-{
- None
-}
-
-/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
-#[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean_flag_suffix<'z, T, I>(
- arg: &str,
- args_rest: &'z [&str],
- longs: I,
- subcommands: &'z [App],
-) -> (String, Option<&'z str>)
-where
- T: AsRef<str> + 'z,
- I: IntoIterator<Item = &'z T>,
-{
- if let Some(candidate) = did_you_mean(arg, longs) {
- let suffix = format!(
- "\n\tDid you mean {}{}?",
- Format::Good("--"),
- Format::Good(candidate)
- );
- return (suffix, Some(candidate));
- }
-
- subcommands
- .into_iter()
- .filter_map(|subcommand| {
- let opts = subcommand
- .p
- .flags
- .iter()
- .filter_map(|f| f.s.long)
- .chain(subcommand.p.opts.iter().filter_map(|o| o.s.long));
-
- let candidate = match did_you_mean(arg, opts) {
- Some(candidate) => candidate,
- None => return None
- };
- let score = match args_rest.iter().position(|x| *x == subcommand.get_name()) {
- Some(score) => score,
- None => return None
- };
-
- let suffix = format!(
- "\n\tDid you mean to put '{}{}' after the subcommand '{}'?",
- Format::Good("--"),
- Format::Good(candidate),
- Format::Good(subcommand.get_name())
- );
-
- Some((score, (suffix, Some(candidate))))
- })
- .min_by_key(|&(score, _)| score)
- .map(|(_, suggestion)| suggestion)
- .unwrap_or_else(|| (String::new(), None))
-}
-
-/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
-pub fn did_you_mean_value_suffix<'z, T, I>(arg: &str, values: I) -> (String, Option<&'z str>)
-where
- T: AsRef<str> + 'z,
- I: IntoIterator<Item = &'z T>,
-{
- match did_you_mean(arg, values) {
- Some(candidate) => {
- let suffix = format!("\n\tDid you mean '{}'?", Format::Good(candidate));
- (suffix, Some(candidate))
- }
- None => (String::new(), None),
- }
-}
-
-#[cfg(all(test, features = "suggestions"))]
-mod test {
- use super::*;
-
- #[test]
- fn possible_values_match() {
- let p_vals = ["test", "possible", "values"];
- assert_eq!(did_you_mean("tst", p_vals.iter()), Some("test"));
- }
-
- #[test]
- fn possible_values_nomatch() {
- let p_vals = ["test", "possible", "values"];
- assert!(did_you_mean("hahaahahah", p_vals.iter()).is_none());
- }
-
- #[test]
- fn suffix_long() {
- let p_vals = ["test", "possible", "values"];
- let suffix = "\n\tDid you mean \'--test\'?";
- assert_eq!(
- did_you_mean_flag_suffix("tst", p_vals.iter(), []),
- (suffix, Some("test"))
- );
- }
-
- #[test]
- fn suffix_enum() {
- let p_vals = ["test", "possible", "values"];
- let suffix = "\n\tDid you mean \'test\'?";
- assert_eq!(
- did_you_mean_value_suffix("tst", p_vals.iter()),
- (suffix, Some("test"))
- );
- }
-}