Coverage Report

Created: 2025-02-21 07:11

/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>