guinea_core/actor/
envelope.rs1use crate::actor::addr::Addr;
2use crate::actor::traits::Handler;
3use crate::actor::{Cx, short_type_name};
4use crate::trace::{self, Cause, Point};
5
6pub trait Envelope<A> {
7 fn handle(&mut self, actor: &mut A, addr: &Addr<A>);
8}
9
10pub struct MessageEnvelope<M: 'static> {
11 pub(super) message: Option<M>,
12 pub(super) cause: Cause,
14}
15
16impl<A, M: 'static> Envelope<A> for MessageEnvelope<M>
17where
18 A: Handler<M>,
19{
20 fn handle(&mut self, actor: &mut A, addr: &Addr<A>) {
21 if let Some(message) = self.message.take() {
22 let _handling = trace::enter_under(Some(self.cause), || Point::Handle {
23 actor: short_type_name::<A>(),
24 message: short_type_name::<M>(),
25 });
26 actor.handle(message, Cx::new(addr.clone()));
27 }
28 }
29}