Skip to main content

guinea_core/actor/
envelope.rs

1use 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    /// The send that queued this message.
13    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}