#[doc(hidden)]
#[macro_export]
macro_rules! try_observers {
($self:ident, $flag:ident, $method:ident ( $($arg:expr),* )) => {{
use $crate::Interests;
if !$self.global_mask.intersects(Interests::$flag) {
Ok(())
} else {
($self.observers.iter().zip($self.observer_masks.iter()))
.try_for_each(|(obs, &mask)| {
if mask.intersects(Interests::$flag) {
obs.borrow_mut().$method($($arg),*)
} else {
Ok(())
}
})
}
}};
}
#[macro_export]
macro_rules! property {
($ent:expr, $ty:ty, $fmt:literal, $($arg:tt)*) => {
{
let x: $ty = $ent.get_property_by_name(&format!($fmt, $($arg)*))?.try_into()?;
x
}
};
($ent:expr, $ty:ty, $fmt:literal) => {
{
let x: $ty = $ent.get_property_by_name(&format!($fmt))?.try_into()?;
x
}
};
($ent:expr, $fmt:expr, $($arg:tt)*) => {
$ent.get_property_by_name(&format!($fmt, $($arg)*))?.try_into()?
};
($ent:expr, $fmt:expr) => {{
$ent.get_property_by_name(&format!($fmt))?.try_into()?
}};
}
#[macro_export]
macro_rules! try_property {
($ent:expr, $ty:ty, $fmt:expr, $($arg:tt)*) => {
{
let x: Option<$ty> = $ent
.get_property_by_name(&format!($fmt, $($arg)*))
.ok()
.and_then(|x| {
x.try_into().ok()
});
x
}
};
($ent:expr, $ty:ty, $fmt:expr) => {
{
let x: Option<$ty> = $ent
.get_property_by_name(&format!($fmt))
.ok()
.and_then(|x| {
x.try_into().ok()
});
x
}
};
($ent:expr, $fmt:expr, $($arg:tt)*) => {
$ent
.get_property_by_name(&format!($fmt, $($arg)*))
.ok()
.and_then(|x| {
x.try_into().ok()
})
};
($ent:expr, $fmt:expr) => {{
$ent
.get_property_by_name(&format!($fmt))
.ok()
.and_then(|x| {
x.try_into().ok()
})
}};
}