use super::theme::ColoredTheme;
use dialoguer::Checkboxes;
use std::{io::Result, iter::repeat};
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
pub struct MultiSelect {
#[structopt(short, long)]
message: String,
#[structopt(short, long)]
paged: bool,
#[structopt(long)]
no_inline: bool,
#[structopt(short, long)]
selected: Vec<usize>,
items: Vec<String>,
}
impl MultiSelect {
pub fn run(&self) -> Result<()> {
let item_len = self.items.len();
if item_len == 0 {
return Ok(());
}
let theme = ColoredTheme::default().inline_selections(!self.no_inline);
let mut input = Checkboxes::with_theme(&theme);
let mut defaults = vec![];
defaults.extend(repeat(false).take(item_len));
for i in &self.selected {
if *i > item_len {
continue;
}
defaults[i - 1] = true;
}
input
.with_prompt(&self.message)
.paged(self.paged)
.clear(true)
.items(&self.items)
.defaults(&defaults);
let value = input.interact()?;
for i in value {
println!("{}", self.items[i]);
}
Ok(())
}
}