1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use {
crate::{
app::AppContext,
pattern::*,
verb::*,
},
};
pub struct MatchingVerbRow<'v> {
name: Option<String>,
shortcut: Option<String>,
pub verb: &'v Verb,
}
impl MatchingVerbRow<'_> {
pub fn name(&self) -> &str {
self.name
.as_deref()
.unwrap_or_else(|| match self.verb.names.get(0) {
Some(s) => &s.as_str(),
_ => " ",
})
}
pub fn shortcut(&self) -> &str {
self.shortcut
.as_deref()
.unwrap_or_else(|| match self.verb.names.get(1) {
Some(s) => &s.as_str(),
_ => " ",
})
}
}
pub fn matching_verb_rows<'v>(
pat: &Pattern,
con: &'v AppContext,
) -> Vec<MatchingVerbRow<'v>> {
let mut rows = Vec::new();
for verb in &con.verb_store.verbs {
if !verb.show_in_doc {
continue;
}
let mut name = None;
let mut shortcut = None;
if pat.is_some() {
let mut ok = false;
name = verb.names.get(0).and_then(|s| {
pat.search_string(s).map(|nm| {
ok = true;
nm.wrap(s, "**", "**")
})
});
shortcut = verb.names.get(1).and_then(|s| {
pat.search_string(s).map(|nm| {
ok = true;
nm.wrap(s, "**", "**")
})
});
if !ok {
continue;
}
}
rows.push(MatchingVerbRow {
name,
shortcut,
verb,
});
}
rows
}