create_farm/utils/
prompts.rs1use anyhow::Result;
2
3use crate::template::Displayable;
4
5use super::theme::ColorfulTheme;
6
7pub(crate) fn select<'t, T: Displayable>(
8 prompt: &str,
9 items: &'t [T],
10 default: Option<usize>,
11) -> Result<Option<&'t T>> {
12 let theme = ColorfulTheme::default();
13 let mut builder = dialoguer::Select::with_theme(&theme)
14 .with_prompt(prompt)
15 .items(
16 &items
17 .iter()
18 .map(|i| i.display_text())
19 .collect::<Vec<&str>>(),
20 );
21 if let Some(default) = default {
22 builder = builder.default(default);
23 }
24 let selected = builder.interact()?;
25 Ok(items.get(selected))
26}
27
28pub(crate) fn input(prompt: &str, default: Option<&str>, allow_empty: bool) -> Result<String> {
29 let theme = ColorfulTheme::default();
30 let mut builder = dialoguer::Input::with_theme(&theme)
31 .with_prompt(prompt)
32 .allow_empty(allow_empty);
33 if let Some(default) = default {
34 builder = builder.default(default.to_string());
35 }
36 Ok(builder.interact_text()?)
37}
38
39pub(crate) fn confirm(prompt: &str, default: bool) -> Result<bool> {
40 let theme = ColorfulTheme::default();
41 let builder = dialoguer::Confirm::with_theme(&theme)
42 .with_prompt(prompt)
43 .default(default);
44 Ok(builder.interact()?)
45}