macro_rules! setter {
(
$(#[$outer:meta])*
$func:ident, $($name: ident).+, Option<$type: ty>
) => {
$(#[$outer])*
pub fn $func(mut self, val: $type) -> Self {
self.$($name).+ = Some(val);
self
}
};
(
$(#[$outer:meta])*
$func:ident, $($name: ident).+, $type: ty
) => {
$(#[$outer])*
pub fn $func(mut self, val: $type) -> Self {
self.$($name).+ = val;
self
}
};
}
macro_rules! setter_mut {
($func:ident, $name: ident, Option<$type: ty>) => {
#[allow(dead_code)]
#[allow(unused_doc_comments)]
pub fn $func(&mut self, val: $type) -> &mut Self {
self.$name = Some(val);
self
}
};
($func:ident, $name: ident, $type: ty) => {
#[allow(dead_code)]
#[allow(unused_doc_comments)]
pub fn $func(&mut self, val: $type) -> &mut Self {
self.$name = val;
self
}
};
}
macro_rules! recover_lock {
($e:expr) => {
match $e {
Ok(lock) => lock,
Err(poisoned) => {
log::warn!(target: "comms", "Lock has been POISONED and will be silently recovered");
poisoned.into_inner()
},
}
};
}
macro_rules! acquire_lock {
($e:expr, $m:ident) => {
recover_lock!($e.$m())
};
($e:expr) => {
recover_lock!($e.lock())
};
}
macro_rules! acquire_read_lock {
($e:expr) => {
acquire_lock!($e, read)
};
}
macro_rules! acquire_write_lock {
($e:expr) => {
acquire_lock!($e, write)
};
}
#[macro_export]
macro_rules! log_if_error {
(level:$level:ident, target:$target:expr, $expr:expr, $msg:expr, $($args:tt),* $(,)*) => {{
match $expr {
Ok(v) => Some(v),
Err(err) => {
log::$level!(target: $target, $msg, $($args,)* error = err);
None
}
}
}};
(target:$target:expr, $expr:expr, $msg:expr, $($args:tt),* $(,)*) => {{
log_if_error!(level:warn, target:$target, $expr, $msg, $($args),*)
}};
(level:$level:ident, $expr:expr, $msg:expr, $($args:tt),* $(,)*) => {{
log_if_error!(level:$level, target:"$crate", $expr, $msg, $($args),*)
}};
($expr:expr, $msg:expr, $($args:tt)* $(,)*) => {{
log_if_error!(level:warn, target:"$crate", $expr, $msg, $($args),*)
}};
}
#[macro_export]
macro_rules! log_if_error_fmt {
(level: $level:ident, target: $target:expr, $expr:expr, $($args:tt)+) => {{
match $expr {
Ok(v) => Some(v),
Err(_) => {
log::$level!(target: $target, $($args)+);
None
}
}
}};
(level:$level:ident, $expr:expr, $($args:tt)+) => {{
log_if_error_fmt!(level:$level, target: "$crate", $expr, $($args)+)
}};
(target: $target:expr, $expr:expr , $($args:tt)+) => {{
log_if_error_fmt!(level:error, target: $target, $expr, $($args)+)
}};
($msg:expr, $expr:expr, $($args:tt)+) => {{
log_if_error_fmt!(level:error, target: "$crate", $expr, $($args)+)
}};
}
macro_rules! cfg_test {
($($item:item)*) => {
$(
#[cfg(test)]
$item
)*
}
}
macro_rules! is_fn {
(
$(#[$outer:meta])*
$name: ident, $($enum_key:ident)::+
) => {
$(#[$outer])*
pub fn $name(&self) -> bool {
matches!(self, $($enum_key)::+)
}
};
(
$(#[$outer:meta])*
$name: ident, $($enum_key:ident)::+ ( $($p:tt),* )
) => {
pub fn $name(&self) -> bool {
matches!(self, $($enum_key)::+($($p),*))
}
};
}
#[macro_export]
macro_rules! outdir_include {
($name: expr) => {
include!(concat!(env!("OUT_DIR"), "/", $name));
};
}