create_farm/utils/
prompts.rs

1use 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}