use swactor::{ actor::{ActorAddress, ActorInterface}, runtime::{Context, Runtime, RuntimeFlavor}, }; #[derive(Debug, Default)] struct Greeter { pub num_greeted: usize, } #[derive(Debug, Default, Clone)] struct GreetMessage { /// who do we greet? who: String, /// who do we send out greeting back to? return_addr: ActorAddress, } #[derive(Debug, Default, Clone)] struct GreetResponse(String); impl ActorInterface for Greeter { type Incoming = GreetMessage; type Response = GreetResponse; fn handle(&mut self, ctx: &Context, msg: GreetMessage) { let res = GreetResponse(format!("Hello, {}!", msg.who)); self.num_greeted += 1; if let Err(_) = ctx.send_to(msg.return_addr, res) { // no error handling self.num_greeted -= 1; } } } fn main() { let rt = Runtime::new(100, RuntimeFlavor::SingleThreaded); let addr = rt .spawn(Greeter::default()) .expect("failed to spawn greeter"); let inbox = rt.new_inbox::(); rt.send_to( addr, GreetMessage { who: "world".into(), return_addr: *inbox.addr(), }, ) .unwrap(); for _ in 0..3 { rt.tick(); } let resp = inbox.try_recv().expect("greeter should have said hello"); println!("{}", resp.0); }