#[macro_export]
macro_rules! cb {
($owner:expr, |$arg_name:ident| async $method:ident ( $($args:tt)* )) => {
{
let weak_owner = std::rc::Rc::downgrade(&$owner);
$crate::Callback::new_async(move |$arg_name| {
let weak_owner = weak_owner.clone();
async move {
if let Some(obj) = weak_owner.upgrade() {
obj.$method($($args)*).await;
}
}
})
}
};
($owner:expr, async $method:ident ( $($args:tt)* )) => {
{
let weak_owner = std::rc::Rc::downgrade(&$owner);
$crate::Callback::new_async(move |arg| {
let weak_owner = weak_owner.clone();
async move {
if let Some(obj) = weak_owner.upgrade() {
let arg = arg;
obj.$method($($args)*).await;
}
}
})
}
};
($owner:expr, async $method:ident) => {
{
let weak_owner = std::rc::Rc::downgrade(&$owner);
$crate::Callback::new_async(move |_| {
let weak_owner = weak_owner.clone();
async move {
if let Some(obj) = weak_owner.upgrade() {
obj.$method().await;
}
}
})
}
};
($owner:expr, |$arg_name:ident| $method:ident ( $($args:tt)* )) => {
{
let weak_owner = std::rc::Rc::downgrade(&$owner);
$crate::Callback::new_sync(move |$arg_name| {
if let Some(obj) = weak_owner.upgrade() {
obj.$method($($args)*)
}
})
}
};
($owner:expr, $method:ident ( $($args:tt)* )) => {
{
let weak_owner = std::rc::Rc::downgrade(&$owner);
$crate::Callback::new_sync(move |arg| {
if let Some(obj) = weak_owner.upgrade() {
let arg = arg;
obj.$method($($args)*)
}
})
}
};
($owner:expr, $method:ident) => {
{
let weak_owner = std::rc::Rc::downgrade(&$owner);
$crate::Callback::new_sync(move |_| {
if let Some(obj) = weak_owner.upgrade() {
obj.$method()
}
})
}
};
}