use crate::actor::ActorAddress;
use crate::message::Message;
use std::fmt::{Display, Formatter};
#[derive(Debug)]
pub(crate) struct Letter {
pub(crate) sender: SenderType,
pub(crate) payload: Box<dyn Message>,
}
#[derive(Debug)]
pub(crate) enum SenderType {
Actor(ActorAddress),
System,
Parent,
SentToSelf,
}
impl Display for SenderType {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
SenderType::Actor(addr) => addr.fmt(f),
SenderType::System => write!(f, "System"),
SenderType::Parent => write!(f, "Parent"),
SenderType::SentToSelf => write!(f, "Self"),
}
}
}
impl Letter {
pub fn new(
sender: Option<ActorAddress>,
receiver: &ActorAddress,
payload: Box<dyn Message>,
) -> Self {
match sender {
None => Self {
sender: SenderType::System,
payload,
},
Some(sender) => {
if sender.uri == receiver.uri {
Self {
sender: SenderType::SentToSelf,
payload,
}
} else if receiver.is_parent(&sender) {
Self {
sender: SenderType::Parent,
payload,
}
} else {
Self {
sender: SenderType::Actor(sender),
payload,
}
}
}
}
}
}