use std::sync::atomic::{AtomicBool, Ordering};
static MESSAGES: AtomicBool = AtomicBool::new(false);
static IGNORE_MESSAGES: AtomicBool = AtomicBool::new(false);
static ERRORED: AtomicBool = AtomicBool::new(false);
#[macro_export]
macro_rules! eprintln_locked {
($($tt:tt)*) => {{
{
use std::io::Write;
let stdout = std::io::stdout().lock();
let mut stderr = std::io::stderr().lock();
if let Err(err) = write!(stderr, "rg: ") {
if err.kind() == std::io::ErrorKind::BrokenPipe {
std::process::exit(0);
} else {
std::process::exit(2);
}
}
if let Err(err) = writeln!(stderr, $($tt)*) {
if err.kind() == std::io::ErrorKind::BrokenPipe {
std::process::exit(0);
} else {
std::process::exit(2);
}
}
drop(stdout);
}
}}
}
#[macro_export]
macro_rules! message {
($($tt:tt)*) => {
if crate::messages::messages() {
eprintln_locked!($($tt)*);
}
}
}
#[macro_export]
macro_rules! err_message {
($($tt:tt)*) => {
crate::messages::set_errored();
message!($($tt)*);
}
}
#[macro_export]
macro_rules! ignore_message {
($($tt:tt)*) => {
if crate::messages::messages() && crate::messages::ignore_messages() {
eprintln_locked!($($tt)*);
}
}
}
pub(crate) fn messages() -> bool {
MESSAGES.load(Ordering::Relaxed)
}
pub(crate) fn set_messages(yes: bool) {
MESSAGES.store(yes, Ordering::Relaxed)
}
pub(crate) fn ignore_messages() -> bool {
IGNORE_MESSAGES.load(Ordering::Relaxed)
}
pub(crate) fn set_ignore_messages(yes: bool) {
IGNORE_MESSAGES.store(yes, Ordering::Relaxed)
}
pub(crate) fn errored() -> bool {
ERRORED.load(Ordering::Relaxed)
}
pub(crate) fn set_errored() {
ERRORED.store(true, Ordering::Relaxed);
}