#[macro_export]
macro_rules! connect {
($widget:expr, $event:ident($($args:pat),*), $other_component:expr, $msg:expr) => {
connect_stream!($widget, $event($($args),*), $other_component.stream(), $msg);
};
($relm:expr, $widget:expr, $event:ident($($args:pat),*), return $msg:expr) => {{
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();
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.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.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.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:ident) => {
connect_async!($object, $async_method(), $relm, $msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:ident) => {{
use ::futures::Sink;
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$object.$async_method($($args,)* None, move |result| {
if let Ok(result) = result {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
}
});
$relm.connect_exec_ignore_err(rx, $msg);
}};
($object:expr, $async_method:ident, $relm:expr, $msg:ident, $fail_msg:ident) => {
connect_async!($object, $async_method(), $relm, $msg, $fail_msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:ident, $fail_msg:ident) => {{
use ::futures::{Sink, Stream};
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$object.$async_method($($args,)* None, move |result| {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
});
let event_stream = $relm.stream().clone();
let fail_event_stream = $relm.stream().clone();
let future =
rx.for_each(move |result| {
match result {
Ok(value) => event_stream.emit($msg(value)),
Err(error) => fail_event_stream.emit($fail_msg(error)),
}
Ok(())
});
$relm.exec(future);
}};
}
#[macro_export]
macro_rules! connect_async_func {
($class:ident :: $async_function:ident, $relm:expr, $msg:ident) => {
connect_async!($async_func(), $relm, $msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:ident) => {{
use ::futures::Sink;
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$class::$async_func($($args,)* None, move |result| {
if let Ok(result) = result {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
}
});
$relm.connect_exec_ignore_err(rx, $msg);
}};
($class:ident :: $async_func:ident, $relm:expr, $msg:ident, $fail_msg:ident) => {
connect_async!($async_func(), $relm, $msg, $fail_msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:ident, $fail_msg:ident) => {{
use ::futures::{Sink, Stream};
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$class::$async_func($($args,)* None, move |result| {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
});
let event_stream = $relm.stream().clone();
let fail_event_stream = $relm.stream().clone();
let future =
rx.for_each(move |result| {
match result {
Ok(value) => event_stream.emit($msg(value)),
Err(error) => fail_event_stream.emit($fail_msg(error)),
}
Ok(())
});
$relm.exec(future);
}};
}
#[macro_export]
macro_rules! connect_async_full {
($object:expr, $async_method:ident, $relm:expr, $msg:ident) => {
connect_async_full!($object, $async_method(), $relm, $msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:ident) => {{
let cancellable = ::gio::Cancellable::new();
use ::futures::Sink;
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$object.$async_method($($args,)* Some(&cancellable), move |result| {
if let Ok(result) = result {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
}
});
$relm.connect_exec_ignore_err(rx, $msg);
cancellable
}};
($object:expr, $async_method:ident, $relm:expr, $msg:ident, $fail_msg:ident) => {
connect_async_full!($object, $async_method(), $relm, $msg, $fail_msg)
};
($object:expr, $async_method:ident ( $($args:expr),* ), $relm:expr, $msg:ident, $fail_msg:ident) => {{
let cancellable = ::gio::Cancellable::new();
use ::futures::{Sink, Stream};
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$object.$async_method($($args,)* Some(&cancellable), move |result| {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
});
let event_stream = $relm.stream().clone();
let fail_event_stream = $relm.stream().clone();
let future =
rx.for_each(move |result| {
match result {
Ok(value) => event_stream.emit($msg(value)),
Err(error) => fail_event_stream.emit($fail_msg(error)),
}
Ok(())
});
$relm.exec(future);
cancellable
}};
}
#[macro_export]
macro_rules! connect_async_func_full {
($class:ident :: $async_function:ident, $relm:expr, $msg:ident) => {
connect_async!($async_func(), $relm, $msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:ident) => {{
let cancellable = ::gio::Cancellable::new();
use ::futures::Sink;
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$class::$async_func($($args,)* Some(&cancellable), move |result| {
if let Ok(result) = result {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
}
});
$relm.connect_exec_ignore_err(rx, $msg);
cancellable
}};
($class:ident :: $async_func:ident, $relm:expr, $msg:ident, $fail_msg:ident) => {
connect_async!($async_func(), $relm, $msg, $fail_msg)
};
($class:ident :: $async_func:ident ( $($args:expr),* ), $relm:expr, $msg:ident, $fail_msg:ident) => {{
let cancellable = ::gio::Cancellable::new();
use ::futures::{Sink, Stream};
let (tx, rx) = ::futures::sync::mpsc::unbounded();
let tx = ::std::sync::Mutex::new(tx);
$class::$async_func($($args,)* Some(&cancellable), move |result| {
let mut tx = tx.lock().unwrap();
if let Ok(::futures::AsyncSink::Ready) = tx.start_send(result) {
tx.poll_complete().unwrap();
} else {
eprintln!("Unable to send message to sender");
}
});
let event_stream = $relm.stream().clone();
let fail_event_stream = $relm.stream().clone();
let future =
rx.for_each(move |result| {
match result {
Ok(value) => event_stream.emit($msg(value)),
Err(error) => fail_event_stream.emit($fail_msg(error)),
}
Ok(())
});
$relm.exec(future);
cancellable
}};
}