use crate::Remote;
use crate::thread::LOCAL_THREAD;
pub trait AsReceiver {
fn as_receiver(&self) -> std::result::Result<Remote<Self>, NotReceiver>;
}
#[derive(Debug)]
pub struct NotReceiver;
impl<T> AsReceiver for T {
fn as_receiver(&self) -> std::result::Result<Remote<T>, NotReceiver> {
unsafe {
if let Some(ref weak_thread) = LOCAL_THREAD {
match weak_thread.clone().upgrade() {
Some(thread) => {
match thread.current_receiver(self) {
Some(remote) => Ok(remote),
None => Err(NotReceiver)
}
},
None => Err(NotReceiver)
}
} else {
Err(NotReceiver)
}
}
}
}