Yet Another Actor Framework
A simple, local actor framework.
- Compile time checks on message publishing.
- Simple UX.
#[derive(Clone, Debug)]
struct Ping;
#[derive(Clone, Debug)]
struct Pong;
#[derive(Source)]
#[publish(Ping)]
struct Server;
#[async_trait]
impl Source for Server {
async fn run(mut self, mut ctx: Context<Self>) {
ctx.publish(Ping);
}
}
#[derive(Actor)]
#[handle(Ping)]
#[publish(Pong)]
struct Paddle;
#[async_trait]
impl Handler<Ping> for Paddle {
async fn handle(&mut self, ctx: &mut Context<Self>, _message: Ping) {
ctx.publish(Pong);
}
}
#[derive(Actor)]
#[handle(Pong)]
struct Floor;
#[async_trait]
impl Handler<Pong> for Floor {
async fn handle(&mut self, _ctx: &mut Context<Self>, _message: Pong) {
println!("Received message");
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn ::std::error::Error>> {
let mut system = System::new().await?;
let server = Server;
let paddle1 = Paddle;
let paddle2 = Paddle;
let floor = Floor;
system.add_source(server).await?;
let paddle_addr = system.add_actor(paddle1).await?;
system.add_actor(paddle2).await?;
let floor_addr = system.add_actor(floor).await?;
paddle_addr.tell(Ping);
floor_addr.tell(Pong);
sleep(Duration::from_millis(50));
system.shutdown().await?;
Ok(())
}