tyra/actor/
handler.rs

1use crate::actor::actor::Actor;
2use crate::actor::context::ActorContext;
3use crate::message::actor_message::BaseActorMessage;
4use crate::message::actor_stop_message::ActorStopMessage;
5use crate::message::sleep_message::SleepMessage;
6use crate::message::system_stop_message::SystemStopMessage;
7use crate::prelude::{ActorResult, BulkActorMessage, SerializedMessage};
8use std::error::Error;
9
10/// Defines which [ActorMessage] is supported per [Actor]
11///
12/// # Examples
13///
14/// Basic usage:
15///
16/// ```rust
17/// use std::error::Error;
18/// use tyra::prelude::{TyraConfig, ActorSystem, ActorFactory, ActorContext, SerializedMessage, Handler, Actor, ActorResult, ActorMessage};
19///
20/// struct TestActor {}
21/// impl Actor for TestActor {}
22///
23/// struct FooBar {}
24/// impl ActorMessage for FooBar {}
25///
26/// impl Handler<FooBar> for TestActor {
27///     fn handle(&mut self, _msg: FooBar, _context: &ActorContext<Self>) -> Result<ActorResult, Box<dyn Error>> {
28///         Ok(ActorResult::Ok)
29///     }
30/// }
31/// ```
32pub trait Handler<M: ?Sized>
33where
34    Self: Actor + Sized,
35    M: BaseActorMessage,
36{
37    fn handle(
38        &mut self,
39        msg: M,
40        context: &ActorContext<Self>,
41    ) -> Result<ActorResult, Box<dyn Error>>;
42}
43
44impl<A> Handler<ActorStopMessage> for A
45where
46    A: Actor + Sized,
47{
48    fn handle(
49        &mut self,
50        _msg: ActorStopMessage,
51        _context: &ActorContext<A>,
52    ) -> Result<ActorResult, Box<dyn Error>> {
53        return Ok(ActorResult::Stop);
54    }
55}
56
57impl<A> Handler<SystemStopMessage> for A
58where
59    A: Actor + Sized,
60{
61    fn handle(
62        &mut self,
63        _msg: SystemStopMessage,
64        context: &ActorContext<A>,
65    ) -> Result<ActorResult, Box<dyn Error>> {
66        return self.on_system_stop(context);
67    }
68}
69
70impl<M, A> Handler<BulkActorMessage<M>> for A
71where
72    Self: Actor + Sized,
73    A: Handler<M>,
74    M: BaseActorMessage,
75{
76    fn handle(
77        &mut self,
78        msg: BulkActorMessage<M>,
79        context: &ActorContext<Self>,
80    ) -> Result<ActorResult, Box<dyn Error>> {
81        for i in msg.data.into_iter() {
82            self.handle(i, context)?;
83        }
84        return Ok(ActorResult::Ok);
85    }
86}
87
88impl<A> Handler<SerializedMessage> for A
89where
90    A: Actor + Sized + Actor,
91{
92    fn handle(
93        &mut self,
94        msg: SerializedMessage,
95        context: &ActorContext<A>,
96    ) -> Result<ActorResult, Box<dyn Error>> {
97        return self.handle_serialized_message(msg, context);
98    }
99}
100
101impl<A> Handler<SleepMessage> for A
102where
103    A: Actor + Sized + Actor,
104{
105    fn handle(
106        &mut self,
107        msg: SleepMessage,
108        _context: &ActorContext<A>,
109    ) -> Result<ActorResult, Box<dyn Error>> {
110        return Ok(ActorResult::Sleep(msg.duration));
111    }
112}