1use truba::{Context, Message, MpscChannel, TaskId};
2
3struct Value(u32);
4
5impl Message for Value {
6 type Channel = MpscChannel<Self>;
7}
8
9struct MyActor {
10 value: u32,
11}
12
13impl MyActor {
14 fn run(ctx: Context, actor_id: &'static str, value: u32) -> TaskId {
15 let mut value_in = ctx.actor_receiver::<Value>(actor_id);
16 let mut actor = MyActor { value };
17
18 println!("run the {actor_id}");
19 ctx.clone().spawn(async move {
20 truba::event_loop!(ctx, {
21 Some(msg) = value_in.recv() => {
22 actor.handle_value(msg);
23 if actor.value == 0 {
24 break;
25 }
26 },
27 });
28 println!("stop the {actor_id}");
29 })
30 }
31
32 fn handle_value(&mut self, Value(value): Value) {
33 self.value = value;
34 println!("receive value {value}");
35 }
36}
37
38#[tokio::main]
39async fn main() {
40 let ctx = Context::new();
41
42 MyActor::run(ctx.clone(), "actor 1", 1);
43 let actor_2_task = MyActor::run(ctx.clone(), "actor 2", 2);
44
45 let sender_1 = ctx.actor_sender::<Value>("actor 1");
46 sender_1.send(Value(11)).await.ok();
47 sender_1.send(Value(12)).await.ok();
48
49 let sender_2 = ctx.actor_sender::<Value>("actor 2");
50 sender_2.send(Value(21)).await.ok();
51 sender_2.send(Value(22)).await.ok();
52
53 sender_2.send(Value(0)).await.ok();
54 ctx.join(&actor_2_task).await.ok();
55
56 MyActor::run(ctx.clone(), "actor 2", 2);
57
58 let sender_2 = ctx.actor_sender::<Value>("actor 2");
59 sender_2.send(Value(23)).await.ok();
60
61 ctx.shutdown().await;
62}