/rust/registry/src/index.crates.io-6f17d22bba15001f/async-graphql-7.0.15/src/validation/suggestion.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use std::{collections::HashMap, fmt::Write}; |
2 | | |
3 | 0 | fn levenshtein_distance(s1: &str, s2: &str) -> usize { |
4 | 0 | let mut column: Vec<_> = (0..=s1.len()).collect(); |
5 | 0 | for (x, rx) in s2.bytes().enumerate() { |
6 | 0 | column[0] = x + 1; |
7 | 0 | let mut lastdiag = x; |
8 | 0 | for (y, ry) in s1.bytes().enumerate() { |
9 | 0 | let olddiag = column[y + 1]; |
10 | 0 | if rx != ry { |
11 | 0 | lastdiag += 1; |
12 | 0 | } |
13 | 0 | column[y + 1] = (column[y + 1] + 1).min((column[y] + 1).min(lastdiag)); |
14 | 0 | lastdiag = olddiag; |
15 | | } |
16 | | } |
17 | 0 | column[s1.len()] |
18 | 0 | } |
19 | | |
20 | 0 | pub fn make_suggestion<I, A>(prefix: &str, options: I, input: &str) -> Option<String> |
21 | 0 | where |
22 | 0 | I: IntoIterator<Item = A>, |
23 | 0 | A: AsRef<str>, |
24 | 0 | { |
25 | 0 | let mut selected = Vec::new(); |
26 | 0 | let mut distances = HashMap::new(); |
27 | | |
28 | 0 | for opt in options { |
29 | 0 | let opt = opt.as_ref().to_string(); |
30 | 0 | let distance = levenshtein_distance(input, &opt); |
31 | 0 | let threshold = (input.len() / 2).max((opt.len() / 2).max(1)); |
32 | 0 | if distance < threshold { |
33 | 0 | selected.push(opt.clone()); |
34 | 0 | distances.insert(opt, distance); |
35 | 0 | } |
36 | | } |
37 | | |
38 | 0 | if selected.is_empty() { |
39 | 0 | return None; |
40 | 0 | } |
41 | 0 | selected.sort_by(|a, b| distances[a].cmp(&distances[b])); Unexecuted instantiation: async_graphql::validation::suggestion::make_suggestion::<core::iter::adapters::map::Map<core::iter::adapters::flatten::Flatten<core::iter::adapters::map::Map<core::option::Iter<&indexmap::map::IndexMap<alloc::string::String, async_graphql::registry::MetaField>>, <async_graphql::validation::rules::fields_on_correct_type::FieldsOnCorrectType as async_graphql::validation::visitor::Visitor>::enter_field::{closure#2}>>, <alloc::string::String>::as_str>, &str>::{closure#0} Unexecuted instantiation: async_graphql::validation::suggestion::make_suggestion::<core::iter::adapters::flatten::Flatten<core::iter::adapters::map::Map<core::option::Iter<(&indexmap::map::IndexMap<alloc::string::String, async_graphql::registry::MetaInputValue>, async_graphql::validation::rules::known_argument_names::ArgsType)>, <async_graphql::validation::rules::known_argument_names::KnownArgumentNames>::get_suggestion::{closure#0}>>, &str>::{closure#0} |
42 | 0 |
|
43 | 0 | let mut suggestion = |
44 | 0 | String::with_capacity(prefix.len() + selected.iter().map(|s| s.len() + 5).sum::<usize>()); Unexecuted instantiation: async_graphql::validation::suggestion::make_suggestion::<core::iter::adapters::map::Map<core::iter::adapters::flatten::Flatten<core::iter::adapters::map::Map<core::option::Iter<&indexmap::map::IndexMap<alloc::string::String, async_graphql::registry::MetaField>>, <async_graphql::validation::rules::fields_on_correct_type::FieldsOnCorrectType as async_graphql::validation::visitor::Visitor>::enter_field::{closure#2}>>, <alloc::string::String>::as_str>, &str>::{closure#1} Unexecuted instantiation: async_graphql::validation::suggestion::make_suggestion::<core::iter::adapters::flatten::Flatten<core::iter::adapters::map::Map<core::option::Iter<(&indexmap::map::IndexMap<alloc::string::String, async_graphql::registry::MetaInputValue>, async_graphql::validation::rules::known_argument_names::ArgsType)>, <async_graphql::validation::rules::known_argument_names::KnownArgumentNames>::get_suggestion::{closure#0}>>, &str>::{closure#1} |
45 | 0 | suggestion.push_str(prefix); |
46 | 0 | suggestion.push(' '); |
47 | | |
48 | 0 | for (i, s) in selected.iter().enumerate() { |
49 | 0 | if i != 0 { |
50 | 0 | suggestion.push_str(", "); |
51 | 0 | } |
52 | 0 | write!(suggestion, "\"{}\"", s).unwrap(); |
53 | | } |
54 | | |
55 | 0 | suggestion.push('?'); |
56 | 0 |
|
57 | 0 | Some(suggestion) |
58 | 0 | } Unexecuted instantiation: async_graphql::validation::suggestion::make_suggestion::<core::iter::adapters::map::Map<core::iter::adapters::flatten::Flatten<core::iter::adapters::map::Map<core::option::Iter<&indexmap::map::IndexMap<alloc::string::String, async_graphql::registry::MetaField>>, <async_graphql::validation::rules::fields_on_correct_type::FieldsOnCorrectType as async_graphql::validation::visitor::Visitor>::enter_field::{closure#2}>>, <alloc::string::String>::as_str>, &str> Unexecuted instantiation: async_graphql::validation::suggestion::make_suggestion::<core::iter::adapters::flatten::Flatten<core::iter::adapters::map::Map<core::option::Iter<(&indexmap::map::IndexMap<alloc::string::String, async_graphql::registry::MetaInputValue>, async_graphql::validation::rules::known_argument_names::ArgsType)>, <async_graphql::validation::rules::known_argument_names::KnownArgumentNames>::get_suggestion::{closure#0}>>, &str> |