use console::Style;
use dialoguer::{theme::ColorfulTheme, Confirm, Input, MultiSelect, Select};
fn create_enhanced_theme() -> ColorfulTheme {
ColorfulTheme {
active_item_style: Style::new().cyan().bold(),
active_item_prefix: console::style("❯".to_string()).cyan().bold(),
inactive_item_prefix: console::style(" ".to_string()),
..Default::default()
}
}
#[allow(dead_code)] pub fn confirm(prompt: &str, default: bool) -> anyhow::Result<bool> {
let theme = create_enhanced_theme();
Confirm::with_theme(&theme)
.with_prompt(prompt)
.default(default)
.interact()
.map_err(|e| anyhow::anyhow!("Failed to get user confirmation: {}", e))
}
#[allow(dead_code)]
pub fn select<T: ToString>(prompt: &str, items: &[T]) -> anyhow::Result<usize> {
let theme = create_enhanced_theme();
Select::with_theme(&theme)
.with_prompt(prompt)
.items(items)
.interact()
.map_err(|e| anyhow::anyhow!("Failed to get user selection: {}", e))
}
#[allow(dead_code)] pub fn select_with_default<T: ToString>(prompt: &str, items: &[T], default: usize) -> anyhow::Result<usize> {
let theme = create_enhanced_theme();
Select::with_theme(&theme)
.with_prompt(prompt)
.items(items)
.default(default)
.interact()
.map_err(|e| anyhow::anyhow!("Failed to get user selection: {}", e))
}
#[allow(dead_code)] pub fn multiselect<T: ToString>(prompt: &str, items: &[T]) -> anyhow::Result<Vec<usize>> {
let theme = create_enhanced_theme();
MultiSelect::with_theme(&theme)
.with_prompt(prompt)
.items(items)
.interact()
.map_err(|e| anyhow::anyhow!("Failed to get user selections: {}", e))
}
#[allow(dead_code)] pub fn multiselect_with_defaults<T: ToString>(
prompt: &str,
items: &[T],
defaults: &[bool],
) -> anyhow::Result<Vec<usize>> {
let theme = create_enhanced_theme();
MultiSelect::with_theme(&theme)
.with_prompt(prompt)
.items(items)
.defaults(defaults)
.interact()
.map_err(|e| anyhow::anyhow!("Failed to get user selections: {}", e))
}
#[allow(dead_code)] pub fn input(prompt: &str) -> anyhow::Result<String> {
let theme = create_enhanced_theme();
Input::<String>::with_theme(&theme)
.with_prompt(prompt)
.interact_text()
.map_err(|e| anyhow::anyhow!("Failed to get user input: {}", e))
}
#[allow(dead_code)]
pub fn input_with_default(prompt: &str, default: &str) -> anyhow::Result<String> {
let theme = create_enhanced_theme();
Input::with_theme(&theme)
.with_prompt(prompt)
.default(default.to_string())
.interact_text()
.map_err(|e| anyhow::anyhow!("Failed to get user input: {}", e))
}
#[allow(dead_code)]
pub fn input_with_validation<F>(prompt: &str, validator: F) -> anyhow::Result<String>
where
F: Fn(&String) -> Result<(), String> + 'static,
{
let theme = create_enhanced_theme();
Input::with_theme(&theme)
.with_prompt(prompt)
.validate_with(validator)
.interact_text()
.map_err(|e| anyhow::anyhow!("Failed to get user input: {}", e))
}