|
@@ -0,0 +1,44 @@
|
|
|
+macro_rules! implement_sender {
|
|
|
+ (name => $name:ident,
|
|
|
+ wrap => $wrap_type:ident,
|
|
|
+ with => $with_type:ident,
|
|
|
+ variant => $variant:ident) => {
|
|
|
+ pub struct $name {
|
|
|
+ wrapped_sender: ::std::sync::mpsc::Sender<$with_type>,
|
|
|
+ }
|
|
|
+
|
|
|
+ impl $name {
|
|
|
+ pub fn create(sender: ::std::sync::mpsc::Sender<$with_type>) -> $name {
|
|
|
+ $name {
|
|
|
+ wrapped_sender: sender
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pub fn send(&self, t: $wrap_type) -> Result<(), ::std::sync::mpsc::SendError<$wrap_type>> {
|
|
|
+ let wrapped = self.wrap(t);
|
|
|
+ let result = self.wrapped_sender.send(wrapped);
|
|
|
+ result.map_err(|senderror| {
|
|
|
+ let ::std::sync::mpsc::SendError(z) = senderror;
|
|
|
+ ::std::sync::mpsc::SendError(self.unwrap(z))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ fn wrap(&self, d: $wrap_type) -> $with_type {
|
|
|
+ $with_type::$variant(d)
|
|
|
+ }
|
|
|
+ fn unwrap(&self, msg: $with_type) -> $wrap_type {
|
|
|
+ let d = match msg {
|
|
|
+ $with_type::$variant(d) => d,
|
|
|
+ _ => unreachable!()
|
|
|
+ };
|
|
|
+ d
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ impl Clone for $name {
|
|
|
+ fn clone(&self) -> $name {
|
|
|
+ $name {
|
|
|
+ wrapped_sender: self.wrapped_sender.clone()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|