use std::{
fmt::{Arguments, Debug},
sync::OnceLock,
};
mod cli_prompter;
pub use cli_prompter::*;
static PROMPTER: OnceLock<&'static dyn Prompter> = OnceLock::new();
pub fn set_prompter(prompter: &'static dyn Prompter) -> Result<(), &'static dyn Prompter> {
PROMPTER.set(prompter)
}
pub fn get_prompter() -> Option<&'static dyn Prompter> {
PROMPTER.get().copied()
}
pub trait Prompter: Sync + Debug {
fn okay(&self, msg: Arguments);
fn ask(&self, msg: Arguments, default: bool) -> Option<bool>;
}
#[macro_export]
macro_rules! okay {
($($arg:tt)*) => {{
if let Some(prompter) = $crate::prompts::get_prompter() {
prompter.okay(format_args!($($arg)*));
}
}};
}
#[macro_export]
macro_rules! ask {
($default:expr, $($arg:tt)*) => {{
if let Some(prompter) = $crate::prompts::get_prompter() {
prompter.ask(format_args!($($arg)*), $default)
} else {
None
}
}};
}