use crate::broadcast::Sender;
use crate::message::{BastionMessage, Message, Msg};
use crate::path::BastionPath;
use crate::system::SYSTEM;
use std::sync::Arc;
#[derive(Debug)]
pub(crate) struct Envelope {
pub(crate) msg: BastionMessage,
pub(crate) sign: RefAddr,
}
#[derive(Debug)]
pub struct SignedMessage {
pub(crate) msg: Msg,
pub(crate) sign: RefAddr,
}
impl SignedMessage {
pub(crate) fn new(msg: Msg, sign: RefAddr) -> Self {
SignedMessage { msg, sign }
}
#[doc(hidden)]
pub fn extract(self) -> (Msg, RefAddr) {
(self.msg, self.sign)
}
pub fn signature(&self) -> &RefAddr {
&self.sign
}
}
#[derive(Debug, Clone)]
pub struct RefAddr {
path: Arc<BastionPath>,
sender: Sender,
}
impl RefAddr {
pub(crate) fn new(path: Arc<BastionPath>, sender: Sender) -> Self {
RefAddr { path, sender }
}
pub(crate) fn dead_letters() -> Self {
Self::new(
SYSTEM.dead_letters().path().clone(),
SYSTEM.dead_letters().sender().clone(),
)
}
pub fn is_sender_identified(&self) -> bool {
self.path.is_dead_letters()
}
pub fn path(&self) -> &Arc<BastionPath> {
&self.path
}
pub(crate) fn sender(&self) -> &Sender {
&self.sender
}
}
impl Envelope {
pub(crate) fn new(msg: BastionMessage, path: Arc<BastionPath>, sender: Sender) -> Self {
Envelope {
msg,
sign: RefAddr::new(path, sender),
}
}
pub(crate) fn new_with_sign(msg: BastionMessage, sign: RefAddr) -> Self {
Envelope { msg, sign }
}
pub(crate) fn from_dead_letters(msg: BastionMessage) -> Self {
Envelope {
msg,
sign: RefAddr::dead_letters(),
}
}
pub(crate) fn try_clone(&self) -> Option<Self> {
self.msg.try_clone().map(|msg| Envelope {
msg,
sign: self.sign.clone(),
})
}
pub(crate) fn into_msg<M: Message>(self) -> Option<M> {
self.msg.into_msg()
}
}