actions-templates 0.1.0

Actions templates
Documentation
#[cfg(feature = "dialoguer")]
use super::DialoguerValue;
use super::{select::ItemOption, CommonFields};
#[cfg(feature = "dialoguer")]
use dialoguer::theme::ColorfulTheme;
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MultiSelect {
    #[serde(flatten)]
    pub common: CommonFields,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub default: Option<Vec<usize>>,
    pub options: Vec<ItemOption>,
}

#[cfg(feature = "dialoguer")]
impl DialoguerValue for MultiSelect {
    type Value = Value;

    fn dialoguer_value(&self) -> anyhow::Result<Self::Value> {
        let selected = if self.default.is_none() {
            dialoguer::MultiSelect::with_theme(&ColorfulTheme::default())
                .with_prompt(&self.common.prompt)
                .items(&self.options)
                .interact()?
        } else {
            let len = self.options.len();
            let mut defaults = vec![false; len];
            for i in self.default.as_ref().unwrap() {
                defaults[*i] = true;
            }
            dialoguer::MultiSelect::with_theme(&ColorfulTheme::default())
                .with_prompt(&self.common.prompt)
                .items(&self.options)
                .defaults(&defaults)
                .interact()?
        };
        Ok(selected
            .iter()
            .map(|item| self.options[*item].value.clone())
            .collect())
    }
}