use std::sync::atomic::{AtomicBool, Ordering};
static QUIET: AtomicBool = AtomicBool::new(false);
pub fn init() {
if std::env::var("AID_QUIET").is_ok_and(|v| v == "1" || v == "true") {
QUIET.store(true, Ordering::Relaxed);
}
}
pub fn set_quiet(quiet: bool) {
QUIET.store(quiet, Ordering::Relaxed);
}
#[allow(dead_code)] pub fn is_quiet() -> bool {
QUIET.load(Ordering::Relaxed)
}
#[macro_export]
macro_rules! aid_info {
($($arg:tt)*) => {
if !$crate::output::is_quiet() {
eprintln!($($arg)*);
}
};
}
#[macro_export]
macro_rules! aid_hint {
($($arg:tt)*) => {
if !$crate::output::is_quiet() {
eprintln!($($arg)*);
}
};
}
#[macro_export]
macro_rules! aid_warn {
($($arg:tt)*) => {{
eprintln!($($arg)*);
}};
}
#[macro_export]
macro_rules! aid_error {
($($arg:tt)*) => {{
eprintln!($($arg)*);
}};
}
#[macro_export]
macro_rules! aid_progress {
($($arg:tt)*) => {{
println!($($arg)*);
use std::io::Write;
let _ = std::io::stdout().flush();
}};
}
#[cfg(test)]
mod tests {
use super::*;
use std::process::Command;
#[test]
fn quiet_mode_defaults_off() {
assert!(!is_quiet());
}
#[test]
fn set_quiet_toggles_mode() {
set_quiet(true);
assert!(is_quiet());
set_quiet(false);
assert!(!is_quiet());
}
#[test]
fn aid_progress_prints_to_stdout_even_in_quiet_mode() {
const CHILD_ENV: &str = "AID_PROGRESS_TEST_CHILD";
if std::env::var_os(CHILD_ENV).is_some() {
set_quiet(true);
aid_progress!("[batch] t-123 dispatched (codex: task)");
set_quiet(false);
return;
}
let output = Command::new(std::env::current_exe().unwrap())
.args([
"--exact",
"output::tests::aid_progress_prints_to_stdout_even_in_quiet_mode",
"--nocapture",
])
.env(CHILD_ENV, "1")
.output()
.unwrap();
assert!(output.status.success());
let stdout = String::from_utf8(output.stdout).unwrap();
assert!(stdout.contains("[batch] t-123 dispatched (codex: task)\n"));
}
}