echo_server/
echo_server.rs1use actor12::{Actor, Envelope, Exec, Init, MpscChannel, spawn};
2use std::future::Future;
3
4pub struct EchoServer {
6 message_count: u32,
7}
8
9type EchoMessage = Envelope<String, anyhow::Result<String>>;
10
11impl Actor for EchoServer {
12 type Spec = ();
13 type Message = EchoMessage;
14 type Channel = MpscChannel<Self::Message>;
15 type Cancel = ();
16 type State = ();
17
18 fn state(_spec: &Self::Spec) -> Self::State {}
19
20 fn init(_ctx: Init<'_, Self>) -> impl Future<Output = Result<Self, Self::Cancel>> + Send + 'static {
21 println!("Echo server initialized");
22 futures::future::ready(Ok(EchoServer { message_count: 0 }))
23 }
24
25 async fn handle(&mut self, _ctx: Exec<'_, Self>, msg: Self::Message) {
26 self.message_count += 1;
27 let response = format!("Echo #{}: {}", self.message_count, msg.value);
28 println!("Echoing: {}", response);
29 msg.reply.send(Ok(response)).unwrap();
30 }
31}
32
33#[tokio::main]
34async fn main() -> anyhow::Result<()> {
35 let echo_server = spawn::<EchoServer>(());
36
37 let messages = vec!["Hello", "World", "How are you?", "Goodbye"];
38
39 for message in messages {
40 let response: anyhow::Result<String> = echo_server.send(message.to_string()).await;
41 println!("Received: {}", response?);
42 }
43
44 Ok(())
45}