use vin::*; pub mod epic { pub mod win { #[derive(Debug, Clone)] pub struct EpicWin; } } #[vin::message(result = (u32, epic::win::EpicWin), error = u32)] #[derive(Debug, Clone)] pub enum Msg { Foo, Bar, Baz, } #[vin::actor] #[vin::handles(Msg)] struct MyActor { pub number: u32, } #[async_trait] impl vin::Hooks for MyActor {} #[async_trait] impl vin::Handler for MyActor { async fn handle(&self, msg: Msg) -> Result<(u32, epic::win::EpicWin), u32> { let ctx = self.ctx().await; println!("The message is: {:?} and the number is {}", msg, ctx.number); Ok((ctx.number, epic::win::EpicWin)) } } #[cfg(test)] mod tests { use std::time::Duration; use tracing::Level; use super::*; #[tokio::test] async fn test1() { tracing_subscriber::fmt() .with_max_level(Level::TRACE) .init(); let ctx = VinContextMyActor { number: 42 }; let actor = MyActor::start("test", ctx).unwrap(); tokio::join!( actor.send(Msg::Bar), actor.send(Msg::Baz), actor.send(Msg::Foo), actor.send(Msg::Bar), ); tokio::time::sleep(Duration::from_millis(100)).await; vin::shutdown(); vin::wait_for_shutdowns().await; } }