#[macro_export]
macro_rules! connect {
($widget:expr, $event:ident($($args:pat),*), $other_component:expr, $msg:expr) => {
$crate::connect_stream!($widget, $event($($args),*), $other_component.stream(), $msg);
};
($relm:expr, $widget:expr, $event:ident($($args:pat),*), return $msg:expr) => {{
$crate::connect_stream!(return $relm.stream(), $widget, $event($($args),*), $msg);
}};
($relm:expr, $widget:expr, $event:ident($($args:pat),*), $msg:expr) => {{
let stream = $relm.stream().clone();
let _ = $widget.$event(move |$($args),*| {
let msg: Option<_> = $crate::IntoOption::into_option($msg);
if let Some(msg) = msg {
stream.emit(msg);
}
});
}};
($src_component:ident @ $message:pat, $dst_component:expr, $msg:expr) => {
let stream = $src_component.stream().clone();
$crate::connect_stream!(stream@$message, $dst_component.stream(), $msg);
};
}
#[macro_export]
macro_rules! connect_stream {
(return $stream:expr, $widget:expr, $event:ident($($args:pat),*), $msg:expr) => {{
let stream = $stream.stream().clone();
let _ = $widget.$event(move |$($args),*| {
let (msg, return_value) = $crate::IntoPair::into_pair($msg);
let msg: Option<_> = $crate::IntoOption::into_option(msg);
if let Some(msg) = msg {
stream.emit(msg);
}
return_value
});
}};
($widget:expr, $event:ident($($args:pat),*), $other_stream:expr, $msg:expr) => {
let stream = $other_stream.stream().clone();
let _ = $widget.$event(move |$($args),*| {
let msg: Option<_> = $crate::IntoOption::into_option($msg);
if let Some(msg) = msg {
stream.emit(msg);
}
});
};
($src_stream:ident @ $message:pat, $dst_stream:expr, $msg:expr) => {
let stream = $dst_stream.stream().clone();
$src_stream.observe(move |msg| {
#[allow(unreachable_patterns)]
match msg {
&$message => {
let msg: Option<_> = $crate::IntoOption::into_option($msg);
if let Some(msg) = msg {
stream.emit(msg);
}
},
_ => (),
}
});
};
}
#[macro_export]
macro_rules! connect_async {
($object:expr, $async_method:ident, $relm:expr, $msg:expr) => {
connect_async!($object, $async_method(), $relm, $msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:expr) => {{
let stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$object.$async_method($($args,)* None::<&gio::Cancellable>, move |result| {
if let Ok(result) = result {
stream.into_inner().emit($msg(result));
}
});
}};
($object:expr, $async_method:ident, $relm:expr, $msg:expr, $fail_msg:expr) => {
connect_async!($object, $async_method(), $relm, $msg, $fail_msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:expr, $fail_msg:expr) => {{
let event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
let fail_event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$object.$async_method($($args,)* None::<&gio::Cancellable>, move |result| {
match result {
Ok(value) => event_stream.into_inner().emit($msg(value)),
Err(error) => fail_event_stream.into_inner().emit($fail_msg(error)),
}
});
}};
}
#[macro_export]
macro_rules! connect_async_func {
($class:ident :: $async_function:ident, $relm:expr, $msg:expr) => {
connect_async_func!($class::$async_func(), $relm, $msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:expr) => {{
let stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$class::$async_func($($args,)* None::<&gio::Cancellable>, move |result| {
if let Ok(result) = result {
stream.into_inner().emit($msg(result));
}
});
}};
($class:ident :: $async_func:ident, $relm:expr, $msg:expr, $fail_msg:expr) => {
connect_async_func!($class::$async_func(), $relm, $msg, $fail_msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:expr, $fail_msg:expr) => {{
let event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
let fail_event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$class::$async_func($($args,)* None::<&gio::Cancellable>, move |result| {
match result {
Ok(value) => event_stream.into_inner().emit($msg(value)),
Err(error) => fail_event_stream.into_inner().emit($fail_msg(error)),
}
});
}};
}
#[macro_export]
macro_rules! connect_async_full {
($object:expr, $async_method:ident, $relm:expr, $msg:expr) => {
connect_async_full!($object, $async_method(), $relm, $msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:expr) => {{
let cancellable = ::gio::Cancellable::new();
let stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$object.$async_method($($args,)* Some(&cancellable), move |result| {
if let Ok(result) = result {
stream.into_inner().emit($msg(result));
}
});
cancellable
}};
($object:expr, $async_method:ident, $relm:expr, $msg:expr, $fail_msg:expr) => {
connect_async_full!($object, $async_method(), $relm, $msg, $fail_msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:expr, $fail_msg:expr) => {{
let cancellable = ::gio::Cancellable::new();
let event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
let fail_event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$object.$async_method($($args,)* Some(&cancellable), move |result| {
match result {
Ok(value) => event_stream.into_inner().emit($msg(value)),
Err(error) => fail_event_stream.into_inner().emit($fail_msg(error)),
}
});
cancellable
}};
}
#[macro_export]
macro_rules! connect_async_func_full {
($class:ident :: $async_function:ident, $relm:expr, $msg:expr) => {
connect_async!($async_func(), $relm, $msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:expr) => {{
let cancellable = ::gio::Cancellable::new();
let stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$class::$async_func($($args,)* Some(&cancellable), move |result| {
if let Ok(result) = result {
stream.into_inner().emit($msg(result));
}
});
cancellable
}};
($class:ident :: $async_func:ident, $relm:expr, $msg:expr, $fail_msg:expr) => {
connect_async!($async_func(), $relm, $msg, $fail_msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:expr, $fail_msg:expr) => {{
let cancellable = ::gio::Cancellable::new();
let event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
let fail_event_stream = ::relm::vendor::fragile::Fragile::new($relm.stream().clone());
$class::$async_func($($args,)* Some(&cancellable), move |result| {
match result {
Ok(value) => event_stream.into_inner().emit($msg(value)),
Err(error) => fail_event_stream.into_inner().emit($fail_msg(error)),
}
});
cancellable
}};
}