From ba494bce133a5cd489f06926eaea22ec58525365 Mon Sep 17 00:00:00 2001 From: Farid Huliiev Date: Thu, 1 May 2025 16:12:36 +0200 Subject: [PATCH] feat: suggest similarly named features --- src/cargo/ops/cargo_add/mod.rs | 18 ++++++++++++++++-- .../stderr.term.svg | 10 ++++++---- .../feature_suggestion_single/stderr.term.svg | 8 +++----- .../stderr.term.svg | 12 ++++-------- .../stderr.term.svg | 4 ++-- .../cargo_add/features_unknown/stderr.term.svg | 8 +++----- 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index b60d3fb12..1853b9943 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -29,6 +29,7 @@ use crate::core::Summary; use crate::core::Workspace; use crate::sources::source::QueryKind; use crate::util::cache_lock::CacheLockMode; +use crate::util::edit_distance; use crate::util::style; use crate::util::toml::lookup_path_base; use crate::util::toml_mut::dependency::Dependency; @@ -167,7 +168,20 @@ pub fn add(workspace: &Workspace<'_>, options: &AddOptions<'_>) -> CargoResult<( if activated.is_empty() && deactivated.is_empty() { write!(message, "\n\nno features available for crate {}", dep.name)?; } else { - if !deactivated.is_empty() { + let mut suggested = false; + for unknown_feature in &unknown_features { + let suggestion = edit_distance::closest_msg( + unknown_feature, + deactivated.iter().chain(activated.iter()), + |dep| *dep, + "feature", + ); + if !suggestion.is_empty() { + write!(message, "{suggestion}")?; + suggested = true; + } + } + if !deactivated.is_empty() && !suggested { if deactivated.len() <= MAX_FEATURE_PRINTS { write!( message, @@ -191,7 +205,7 @@ pub fn add(workspace: &Workspace<'_>, options: &AddOptions<'_>) -> CargoResult<( )?; } } - if !activated.is_empty() { + if !activated.is_empty() && !suggested { if deactivated.len() + activated.len() <= MAX_FEATURE_PRINTS { writeln!( message, diff --git a/tests/testsuite/cargo_add/feature_suggestion_multiple/stderr.term.svg b/tests/testsuite/cargo_add/feature_suggestion_multiple/stderr.term.svg index e474c8b77..94d4738d6 100644 --- a/tests/testsuite/cargo_add/feature_suggestion_multiple/stderr.term.svg +++ b/tests/testsuite/cargo_add/feature_suggestion_multiple/stderr.term.svg @@ -1,4 +1,4 @@ - +