bottle 0.1.0

Actor model framework for Rust.
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)
            }
        }
    }
}