use crate::{
Error, Result,
execute::task::{Task, ToTask},
};
use regex::Regex;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, path::Path};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord)]
pub struct Variable {
variable: String,
default: String,
message: String,
pattern: Option<String>,
pattern_error: Option<String>,
}
impl Variable {
pub fn execute(&self, global: &mut HashMap<String, String>) -> Result<()> {
let mut inquire_prompt = inquire::Text::new(&self.message)
.with_default(&self.default)
.with_placeholder(&self.default);
if let Some(pattern) = self.pattern.as_ref() {
let pattern = Regex::new(pattern).expect("Failed to parse pattern");
let error_message = self.pattern_error.as_ref();
inquire_prompt = inquire_prompt.with_validator(move |input: &str| {
if pattern.is_match(input) {
Ok(inquire::validator::Validation::Valid)
} else {
Ok(inquire::validator::Validation::Invalid(
error_message
.map(Into::into)
.unwrap_or(inquire::validator::ErrorMessage::Default),
))
}
});
}
inquire_prompt
.prompt()
.map_err(Error::CantParseUserPrompt)
.map(|s| {
global
.insert(self.variable.clone(), s)
.map_or_else(|| (), |_| ())
})
}
}
impl ToTask for Variable {
fn to_task(self, _: &Path) -> Task {
Task::Variable(Variable {
message: self.message,
default: self.default,
variable: self.variable,
pattern: self.pattern,
pattern_error: self.pattern_error,
})
}
}