use zestors::{prelude::*, messaging::RecvError, actor_reference::ExitError};
use futures::stream::StreamExt;
async fn my_actor(mut inbox: Inbox<()>) -> &'static str {
match inbox.recv().await {
Err(RecvError::ClosedAndEmpty) => {
"Closed and empty"
}
Err(RecvError::Halted) => {
"Halt properly handled"
}
Ok(_msg) => {
panic!(r"\('o')/ This actor panics upon receiving a message!")
}
}
}
#[tokio::main]
async fn main() {
let (child, address) = spawn(my_actor);
child.halt();
assert!(matches!(child.await, Ok("Halt properly handled")));
assert_eq!(address.await, ());
let (mut child, address) = spawn(my_actor);
child.shutdown();
assert!(matches!(child.await, Ok("Halt properly handled")));
assert_eq!(address.await, ());
let (mut child, address) = spawn(my_actor);
child.abort();
assert!(matches!(child.await, Err(ExitError::Abort)));
assert_eq!(address.await, ());
let (child, address) = spawn(my_actor);
child.close();
assert!(matches!(child.await, Ok("Closed and empty")));
assert_eq!(address.await, ());
let (child, address) = spawn(my_actor);
child.send(()).await.unwrap();
assert!(matches!(child.await, Err(ExitError::Panic(_))));
assert_eq!(address.await, ());
let (child, address) = spawn(my_actor);
drop(child);
assert_eq!(address.await, ());
let (child_pool, address) = spawn_many(0..10, |_, inbox| async move {
my_actor(inbox).await
});
address.halt();
child_pool
.for_each(|process_exit| async move {
assert!(matches!(process_exit, Ok("Halt properly handled")));
})
.await;
assert_eq!(address.await, ());
let (mut child_pool, address) = spawn_many(0..10, |_, inbox| async move {
my_actor(inbox).await
});
child_pool
.shutdown()
.for_each(|process_exit| async move {
assert!(matches!(process_exit, Ok("Halt properly handled")));
})
.await;
assert_eq!(address.await, ());
}