#[macro_export]
macro_rules! fatal {
($($arg:tt)*) => {{
let msg = format_args!($($arg)*);
log::error!("Critical error: {}", msg);
#[cfg(debug_assertions)]
{
log::debug!("Backtrace: {:?}", std::backtrace::Backtrace::capture());
}
std::process::exit(1);
}};
}
#[macro_export]
macro_rules! translate {
($target:expr, $value:expr, $map:expr, $(($method:ident, $ty:ty)),* $(,)?) => {{
use $crate::code_handler::until::DataPack;
let target = $target;
$(
let target = if let Some(v) = $value.get_mut(stringify!($method)) {
let data = serde_json::from_value::<DataPack<$ty>>(v.take())
.map_err(|e| ::anyhow::anyhow!("Failed to deserialize field '{}': {}", stringify!($method), e))?;
target.$method(data.unwrap($map)
.map_err(|e| ::anyhow::anyhow!("Failed to unwrap DataPack for field '{}': {}", stringify!($method), e))?)
} else {
target
};
)*
anyhow::Ok(target)
}};
}
#[macro_export]
macro_rules! translate_enum {
($target:expr, $value:expr, $map:expr, $(
($method:ident, { $($str_val:literal => $variant:expr),* $(,)? })
),* $(,)?) => {{
use $crate::code_handler::until::DataPack;
let target = $target;
$(
let target = if let Some(v) = $value.get_mut(stringify!($method)) {
let data = serde_json::from_value::<DataPack<String>>(v.take())
.map_err(|e| ::anyhow::anyhow!("Failed to deserialize field '{}': {}", stringify!($method), e))?;
let s = data.unwrap($map)
.map_err(|e| ::anyhow::anyhow!("Failed to unwrap DataPack for field '{}': {}", stringify!($method), e))?;
match s.as_str() {
$($str_val => target.$method($variant),)*
unexpected => {
return Err(::anyhow::anyhow!(
"\"{}\" is not a valid value for `{}`",
unexpected,
stringify!($method),
))
}
}
} else {
target
};
)*
anyhow::Ok(target)
}};
}