use anyhow::Result; use dialoguer::Select; use dialoguer::{theme::ColorfulTheme, Input}; use std::fmt::Debug; use std::str::FromStr; pub fn input(theme: &ColorfulTheme, prompt: &str, empty: bool, default: Option) -> Result where T: Clone + FromStr + ToString, ::Err: Debug + ToString, { let mut input = Input::::with_theme(theme); input.with_prompt(prompt).allow_empty(empty); if let Some(default) = default { input.default(default); } Ok(input.interact_text()?) } pub fn input_list( theme: &ColorfulTheme, prompt: &str, empty: bool, default: Option, map_fn: F, ) -> Result> where F: FnMut(&str) -> T, { Ok(input(theme, prompt, empty, default)? .split(';') .filter(|v| !v.is_empty()) .map(map_fn) .collect()) } pub fn select( theme: &ColorfulTheme, prompt: &str, default: usize, items: &[String], ) -> Result { Ok(Select::with_theme(theme) .with_prompt(prompt) .default(default) .items(items) .interact()?) }