dynamic/
dynamic.rs

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}