#[macro_export]
macro_rules! utpm_bail {
($variant:ident) => {
return Err($crate::utils::state::UtpmError::$variant)
};
($variant:ident, $($arg:expr),+) => {
return Err($crate::utils::state::UtpmError::$variant($($arg),+))
};
}
#[macro_export]
macro_rules! utpm_log {
($(@g)? $lvl:ident, $data:expr $(, $($args:expr => $val:expr),*)?) => {{
match $crate::utils::output::get_output_format() {
#[cfg(feature = "output_json")]
$crate::OutputFormat::Json => tracing::$lvl!($($($args = $val),*,)? "{}", serde_json::to_string(&$data).unwrap()),
#[cfg(feature = "output_yaml")]
$crate::OutputFormat::Yaml => tracing::$lvl!($($($args = $val),*,)? "{}", serde_yaml::to_string(&$data).unwrap()),
$crate::OutputFormat::Toml => tracing::$lvl!($($($args = $val),*,)? "{}", toml::to_string(&$data).unwrap()),
$crate::OutputFormat::Text => tracing::$lvl!($($($args = $val),*,)? "{}", $data),
#[cfg(feature = "output_hjson")]
$crate::OutputFormat::Hjson => tracing::$lvl!($($($args = $val),*,)? "{}", serde_hjson::to_string(&$data).unwrap()),
}
}};
($(@g)? $lvl:ident, $data:expr,? $($args:expr => $val:expr),*) => {{
match $crate::utils::output::get_output_format() {
#[cfg(feature = "output_json")]
$crate::OutputFormat::Json => tracing::$lvl!($($args = $val),* data = &$data),
#[cfg(feature = "output_yaml")]
$crate::OutputFormat::Yaml => tracing::$lvl!($($args = $val),* "{}", serde_yaml::to_string(&$data)?),
$crate::OutputFormat::Toml => tracing::$lvl!($($args = $val),* "{}", toml::to_string(&$data)?),
$crate::OutputFormat::Text => tracing::$lvl!($($args = $val),* "{}", $data),
#[cfg(feature = "output_hjson")]
$crate::OutputFormat::Hjson => tracing::$lvl!($($args = $val),* "{}", serde_hjson::ser::to_string(&$data)?),
}
}};
($lvl:ident, $($args:expr => $val:expr),+) => {{
tracing::$lvl!($($args = $val),+)
}};
($lvl:ident, $fmt:expr, $($args:tt)*) => {
$crate::utpm_log!(@g $lvl, format!($fmt, $($args)*),?)
};
($lvl:ident, $fmt:expr) => {
$crate::utpm_log!(@g $lvl, format!($fmt),?)
};
(@f $lvl:ident, $data:expr) => {
if $crate::utils::output::get_output_format() == $crate::utils::output::OutputFormat::Text {
tracing::$lvl!("{}", format!($data))
} else {
$crate::utpm_log!($lvl, $data)
}
};
($fmt:expr, $($args:tt)+) => {
$crate::utpm_log!(info, $fmt, $($args)+)
};
($data:expr) => {
$crate::utpm_log!(info, "{}", $data)
};
}
#[macro_export]
macro_rules! path {
($base:expr, $($segment:expr),+) => {{
let mut base: ::std::path::PathBuf = $base.into();
$(
base.push($segment);
)*
base
}}
}
#[cfg(test)]
mod tests {
use std::path::{Path, PathBuf};
#[test]
fn path() {
let p = path!("a", "b", "c");
#[cfg(unix)]
assert_eq!(p, Path::new("a/b/c"));
#[cfg(windows)]
assert_eq!(p, Path::new("a\\b\\c"));
let p = path!("a", "b", Path::new("c"));
#[cfg(unix)]
assert_eq!(p, Path::new("a/b/c"));
#[cfg(windows)]
assert_eq!(p, Path::new("a\\b\\c"));
let pb = PathBuf::from("a");
let p = path!(&pb, "b", Path::new("c"));
#[cfg(unix)]
assert_eq!(p, Path::new("a/b/c"));
#[cfg(windows)]
assert_eq!(p, Path::new("a\\b\\c"));
drop(pb);
let pb = PathBuf::from("a");
let p = path!(pb, "b", Path::new("c"));
#[cfg(unix)]
assert_eq!(p, Path::new("a/b/c"));
#[cfg(windows)]
assert_eq!(p, Path::new("a\\b\\c"));
}
}