use clap::Parser;
use dialoguer::theme::ColorfulTheme;
use std::io::Result;
#[derive(Debug, Parser)]
pub struct Select {
#[clap(short, long)]
message: String,
#[clap(short, long)]
cancel: bool,
#[clap(short = 'd', long = "default", requires_all = &["cancel", "selected"])]
return_default: bool,
#[clap(short, long)]
index: bool,
#[clap(short, long)]
selected: Option<usize>,
items: Vec<String>,
}
impl Select {
pub fn run(&self) -> Result<()> {
let item_len = self.items.len();
if item_len == 0 {
return Ok(());
}
let theme = ColorfulTheme::default();
let mut input = dialoguer::Select::with_theme(&theme);
input
.with_prompt(&self.message)
.clear(true)
.items(&self.items);
let selected = self.selected.map(|i| i - 1);
if let Some(index) = selected {
input.default(index);
}
let ret = if self.cancel {
input.interact_opt()?
} else {
Some(input.interact()?)
};
let value = match ret {
Some(value) => value,
None if self.return_default && selected.is_some() => selected.unwrap(),
None => std::process::exit(1),
};
if self.index {
println!("{}", value);
} else {
println!("{}", self.items[value]);
}
Ok(())
}
}