use std::sync::Mutex;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MsgLevel {
Info = 0,
Warn = 1,
Error = 2,
}
pub trait MessageHandler: Send + Sync {
fn handle(&self, level: MsgLevel, code: u32, msg: &str);
}
struct StderrHandler;
impl MessageHandler for StderrHandler {
fn handle(&self, level: MsgLevel, code: u32, msg: &str) {
let tag = match level {
MsgLevel::Info => "INFO",
MsgLevel::Warn => "WARN",
MsgLevel::Error => "ERROR",
};
eprintln!("[openjph {}] (0x{:08x}) {}", tag, code, msg);
}
}
static HANDLER: Mutex<Option<Box<dyn MessageHandler>>> = Mutex::new(None);
pub fn dispatch_message(level: MsgLevel, code: u32, msg: &str) {
let guard = HANDLER.lock().unwrap();
match guard.as_ref() {
Some(h) => h.handle(level, code, msg),
None => {
StderrHandler.handle(level, code, msg);
}
}
}
pub fn set_message_handler(handler: Option<Box<dyn MessageHandler>>) {
let mut guard = HANDLER.lock().unwrap();
*guard = handler;
}
#[macro_export]
macro_rules! ojph_info {
($code:expr, $($arg:tt)*) => {
$crate::message::dispatch_message(
$crate::message::MsgLevel::Info,
$code,
&format!($($arg)*),
)
};
}
#[macro_export]
macro_rules! ojph_warn {
($code:expr, $($arg:tt)*) => {
$crate::message::dispatch_message(
$crate::message::MsgLevel::Warn,
$code,
&format!($($arg)*),
)
};
}
#[macro_export]
macro_rules! ojph_error {
($code:expr, $($arg:tt)*) => {{
let msg = format!($($arg)*);
$crate::message::dispatch_message(
$crate::message::MsgLevel::Error,
$code,
&msg,
);
$crate::error::OjphError::Codec { code: $code, message: msg }
}};
}