#[macro_export]
macro_rules! watch_all {
($self:expr, $($source:ident),+ $(,)?) => {
{
use ::futures::StreamExt;
let cloned = $self.clone();
let streams: Vec<::futures::stream::BoxStream<'_, ()>> = vec![
$($self.$source.watch().map(|_| ()).boxed(),)+
];
::futures::stream::select_all(streams).map(move |_| cloned.clone())
}
};
}
#[macro_export]
macro_rules! unwrap_dbus {
($result:expr) => {
$result.unwrap_or_else(|err| {
::tracing::debug!("cannot fetch property: {}", err);
Default::default()
})
};
($result:expr, $path:expr) => {
$result.unwrap_or_else(|err| {
::tracing::debug!("cannot fetch property for {:?}: {}", $path, err);
Default::default()
})
};
}
#[macro_export]
macro_rules! unwrap_dbus_or {
($result:expr, $default:expr) => {
$result.unwrap_or_else(|err| {
::tracing::debug!("cannot fetch property: {}", err);
$default
})
};
($result:expr, $path:expr, $default:expr) => {
$result.unwrap_or_else(|err| {
::tracing::debug!("cannot fetch property for {:?}: {}", $path, err);
$default
})
};
}
#[macro_export]
macro_rules! remove_and_cancel {
($property:expr, $target_path:expr) => {{
let mut items = $property.get();
items.retain(|item| {
if item.object_path != $target_path {
return true;
}
if let Some(token) = item.cancellation_token.as_ref() {
token.cancel();
}
false
});
$property.set(items);
}};
}