mod editor;
mod progress;
mod prompt;
use icu_locale::Locale;
use indicatif::MultiProgress;
use l10n_embed::Localize;
use thiserror::Error;
pub use editor::Editor;
pub use progress::ProgressBar;
pub use prompt::{Confirm, Input, Password, Select};
enum InteractionContext {
Terminal,
NonInteractive,
}
#[derive(Debug, Error)]
pub enum InteractionError {
#[error(transparent)]
IO(std::io::Error),
}
impl From<std::io::Error> for InteractionError {
fn from(value: std::io::Error) -> Self {
InteractionError::IO(value)
}
}
impl From<dialoguer::Error> for InteractionError {
fn from(value: dialoguer::Error) -> Self {
match value {
dialoguer::Error::IO(error) => Self::IO(error),
}
}
}
pub struct InteractionEnvironment {
context: InteractionContext,
locale: Locale,
progress_bars: MultiProgress,
}
impl InteractionEnvironment {
#[must_use]
pub fn new(locale: Locale, interactive: bool) -> Self {
Self {
context: match interactive {
true => InteractionContext::Terminal,
false => InteractionContext::NonInteractive,
},
locale,
progress_bars: MultiProgress::new(),
}
}
pub fn emit_message<L: Localize>(&self, message: L) -> Result<(), InteractionError> {
self.progress_bars
.println(message.localize_for(&self.locale))?;
Ok(())
}
}