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
use std::fmt::Display;
pub fn multi_fuzzy_select_with_key<T>(
items: Vec<T>,
prompt: impl AsRef<str>,
is_selected: impl Fn(&T) -> bool,
) -> anyhow::Result<Vec<T>>
where
T: Display,
{
let already_selected = items
.iter()
.enumerate()
.filter(|(_, elem)| is_selected(elem))
.map(|(idx, _)| idx)
.collect::<Vec<_>>();
let selected_items = inquire::MultiSelect::new(prompt.as_ref(), items)
.with_default(&already_selected)
.prompt()?;
Ok(selected_items)
}
pub fn fuzzy_select_with_key<T>(items: Vec<T>, prompt: impl AsRef<str>) -> anyhow::Result<Option<T>>
where
T: Display,
{
fuzzy_select_with_key_with_default(items, prompt, None)
}
pub fn fuzzy_select_with_key_with_default<T>(
items: Vec<T>,
prompt: impl AsRef<str>,
default_index: Option<usize>,
) -> anyhow::Result<Option<T>>
where
T: Display,
{
if items.is_empty() {
return Ok(None);
}
let mut dialogue = inquire::Select::new(prompt.as_ref(), items);
if let Some(index) = default_index {
dialogue = dialogue.with_starting_cursor(index);
}
let selected_item = dialogue.prompt().map_err(anyhow::Error::from)?;
Ok(Some(selected_item))
}
pub fn confirm_with_prompt(prompt: &str) -> anyhow::Result<bool> {
inquire::Confirm::new(prompt)
.with_help_message("(y/n)?")
.prompt()
.map_err(anyhow::Error::from)
}