yaaf 0.1.0

Yet Another Actor Framework
Documentation
use ::async_trait::async_trait;
use ::std::sync::Arc;
use ::tokio::sync::{
    oneshot::{channel, Sender},
    Mutex,
};
use ::yaaf::prelude::*;

#[derive(Clone)]
struct Communication(String);

#[derive(Actor)]
#[handle(Communication)]
struct Bob {
    done: Option<Sender<()>>,
    visited: Arc<Mutex<bool>>,
}

impl Bob {
    fn complete(&mut self) {
        let done = self.done.take();
        if let Some(done) = done {
            done.send(()).unwrap();
        }
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn ::std::error::Error>> {
    let mut system = System::new().await;

    let (send, recv) = channel();
    let visited = Arc::new(Mutex::new(false));
    let bob = Bob {
        done: Some(send),
        visited: visited.clone(),
    };

    let bob_addr = system.add_actor(bob).await;

    bob_addr.tell(Communication("Hello".into()));

    recv.await.unwrap();
    system.shutdown().await;

    assert_eq!(true, *visited.lock().await);

    Ok(())
}