use std::sync::Mutex;
const MAX_HELD_TERMINAL_WARNINGS: usize = 32;
static HELD_TERMINAL_WARNINGS: Mutex<Option<Vec<String>>> = Mutex::new(None);
pub(crate) fn emit_terminal_warning(message: String) {
let mut held = HELD_TERMINAL_WARNINGS
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner());
match held.as_mut() {
Some(warnings) => {
if warnings.len() < MAX_HELD_TERMINAL_WARNINGS && !warnings.contains(&message) {
warnings.push(message);
}
}
None => eprintln!("{message}"),
}
}
pub(crate) fn hold_terminal_warnings() {
let mut held = HELD_TERMINAL_WARNINGS
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner());
held.get_or_insert_with(Vec::new);
}
pub(crate) fn release_terminal_warnings() {
let warnings = HELD_TERMINAL_WARNINGS
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner())
.take()
.unwrap_or_default();
for message in warnings {
eprintln!("{message}");
}
}