mirror of
https://github.com/librespot-org/librespot.git
synced 2024-12-18 17:11:53 +00:00
Add macro to be able to create wrapped senders to send multiple message types to one channel
This commit is contained in:
parent
e547a0c3da
commit
37916330b4
3 changed files with 49 additions and 1 deletions
|
@ -8,6 +8,9 @@
|
||||||
#![cfg_attr(feature="clippy", feature(plugin))]
|
#![cfg_attr(feature="clippy", feature(plugin))]
|
||||||
#![cfg_attr(feature="clippy", plugin(clippy))]
|
#![cfg_attr(feature="clippy", plugin(clippy))]
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
pub mod util;
|
||||||
|
|
||||||
#[macro_use] extern crate lazy_static;
|
#[macro_use] extern crate lazy_static;
|
||||||
#[macro_use] extern crate log;
|
#[macro_use] extern crate log;
|
||||||
|
|
||||||
|
@ -58,7 +61,6 @@ pub mod link;
|
||||||
pub mod metadata;
|
pub mod metadata;
|
||||||
pub mod player;
|
pub mod player;
|
||||||
pub mod stream;
|
pub mod stream;
|
||||||
pub mod util;
|
|
||||||
pub mod version;
|
pub mod version;
|
||||||
pub mod mixer;
|
pub mod mixer;
|
||||||
|
|
||||||
|
|
44
src/util/channel.rs
Normal file
44
src/util/channel.rs
Normal file
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,8 @@ mod int128;
|
||||||
mod spotify_id;
|
mod spotify_id;
|
||||||
mod arcvec;
|
mod arcvec;
|
||||||
mod subfile;
|
mod subfile;
|
||||||
|
#[macro_use]
|
||||||
|
mod channel;
|
||||||
|
|
||||||
pub use util::int128::u128;
|
pub use util::int128::u128;
|
||||||
pub use util::spotify_id::{SpotifyId, FileId};
|
pub use util::spotify_id::{SpotifyId, FileId};
|
||||||
|
|
Loading…
Reference in a new issue