use std::sync::atomic::{AtomicBool, Ordering};
static QUIET: AtomicBool = AtomicBool::new(false);
static JSON_MODE: AtomicBool = AtomicBool::new(false);
pub const MACHINE_OUTPUT_SCHEMA_VERSION: u32 = 1;
#[doc(hidden)]
pub fn init(quiet: bool) {
QUIET.store(quiet, Ordering::Relaxed);
}
pub fn is_quiet() -> bool {
QUIET.load(Ordering::Relaxed)
}
pub fn is_json_mode() -> bool {
JSON_MODE.load(Ordering::Relaxed)
}
#[doc(hidden)]
pub fn set_json_mode(json: bool) {
JSON_MODE.store(json, Ordering::Relaxed);
if json {
QUIET.store(true, Ordering::Relaxed);
}
}
pub fn machine_json_envelope(
command: &str,
mode: &str,
result: &str,
exit_code: i32,
payload: serde_json::Value,
) -> serde_json::Value {
let mut out = serde_json::Map::new();
out.insert(
"schema_version".to_string(),
serde_json::Value::Number(serde_json::Number::from(MACHINE_OUTPUT_SCHEMA_VERSION)),
);
out.insert("command".to_string(), serde_json::Value::String(command.to_string()));
out.insert("mode".to_string(), serde_json::Value::String(mode.to_string()));
out.insert("result".to_string(), serde_json::Value::String(result.to_string()));
out.insert(
"exit_code".to_string(),
serde_json::Value::Number(serde_json::Number::from(exit_code)),
);
match payload {
serde_json::Value::Object(map) => {
for (key, value) in map {
if !out.contains_key(&key) {
out.insert(key, value);
}
}
}
other => {
out.insert("payload".to_string(), other);
}
}
serde_json::Value::Object(out)
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
eprintln!("error: {}", format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => {
eprintln!("warning: {}", format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! help {
($($arg:tt)*) => {
eprintln!("help: {}", format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! status {
($($arg:tt)*) => {
if !$crate::output::is_quiet() {
eprintln!($($arg)*)
}
};
}
#[macro_export]
macro_rules! note {
($($arg:tt)*) => {
if !$crate::output::is_quiet() {
eprintln!("note: {}", format_args!($($arg)*))
}
};
}
#[macro_export]
macro_rules! progress {
($($arg:tt)*) => {
$crate::status!($($arg)*)
};
}