use super::macros::impl_with_validator;
use crate::{InteractionEnvironment, InteractionError};
use l10n_embed::Localize;
pub struct Input<'environment> {
environment: &'environment InteractionEnvironment,
localized_prompt: String,
default: Option<String>,
validator: Option<Box<dyn Fn(&String) -> Result<(), String>>>,
}
impl_with_validator!(Input);
impl<'environment> Input<'environment> {
pub fn new<L: Localize>(environment: &'environment InteractionEnvironment, prompt: L) -> Self {
let mut localized_prompt = String::new();
prompt.localize(&environment.localization_context, &mut localized_prompt);
Self {
environment,
localized_prompt,
default: None,
validator: None,
}
}
pub fn with_default<L: Localize>(mut self, default: L) -> Self {
let mut localized_default = String::new();
default.localize(
&self.environment.localization_context,
&mut localized_default,
);
self.default = Some(localized_default);
self
}
pub fn interact(self) -> Result<Option<String>, InteractionError> {
match self.environment.interaction_context {
crate::InteractionContext::Terminal => {
let mut prompt =
dialoguer::Input::with_theme(&*super::THEME).with_prompt(self.localized_prompt);
if let Some(default) = self.default {
prompt = prompt.default(default);
}
if let Some(validator) = self.validator {
prompt = prompt.validate_with(validator);
}
Ok(Some(prompt.interact()?))
}
crate::InteractionContext::NonInteractive => Ok(None),
}
}
}