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 localized_prompt = prompt.localize_for(&environment.locale);
Self {
environment,
localized_prompt,
default: None,
validator: None,
}
}
pub fn with_default<L: Localize>(mut self, default: L) -> Self {
let localized_text = default.localize_for(&self.environment.locale);
self.default = Some(localized_text);
self
}
pub fn interact(self) -> Result<Option<String>, InteractionError> {
match self.environment.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),
}
}
}