use vin::*; use std::fmt::Debug; #[vin::message] #[derive(Debug, Clone)] pub enum Msg { Foo, Bar, Baz, } #[vin::actor] #[vin::handles(Msg, max = 5)] struct MyActor { value: T, } #[async_trait] impl vin::Handler for MyActor { async fn handle(&self, msg: Msg) -> Result<(), ()> { log::info!("The message is: {:?}", msg); let ctx = self.ctx().await; log::info!("Value is: {:?}", ctx.value); Ok(()) } } #[async_trait] impl vin::Hooks for MyActor {} #[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 { value: 8 }; 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; } }