use super::*;
use crate::serialisation::ser_helpers::deserialise_bytes;
use std::{any::Any, fmt};
#[derive(Debug)]
pub enum DispatchData {
Lazy(Box<dyn Serialisable>, ActorPath, ActorPath),
Serialised(SerialisedFrame),
NetMessage(NetMessage),
}
impl DispatchData {
pub fn into_local(self) -> Result<NetMessage, SerError> {
match self {
DispatchData::Lazy(ser, src, dst) => {
let ser_id = ser.ser_id();
Ok(NetMessage::with_box(ser_id, src, dst, ser))
}
DispatchData::Serialised(SerialisedFrame::ChunkLease(mut chunk_lease)) => {
chunk_lease.advance(FRAME_HEAD_LEN as usize);
Ok(deserialise_chunk_lease(chunk_lease).expect("s11n errors"))
}
DispatchData::Serialised(SerialisedFrame::ChunkRef(mut chunk_ref)) => {
chunk_ref.advance(FRAME_HEAD_LEN as usize);
Ok(deserialise_chunk_ref(chunk_ref).expect("s11n errors"))
}
DispatchData::Serialised(SerialisedFrame::Bytes(mut bytes)) => {
bytes.advance(FRAME_HEAD_LEN as usize);
Ok(deserialise_bytes(bytes).expect("s11n errors"))
}
DispatchData::NetMessage(net_message) => Ok(net_message),
}
}
pub fn into_serialised(self, buf: &mut BufferEncoder) -> Result<SerialisedFrame, SerError> {
match self {
DispatchData::Lazy(ser, src, dst) => Ok(SerialisedFrame::ChunkLease(
crate::serialisation::ser_helpers::serialise_msg(&src, &dst, ser.deref(), buf)?,
)),
DispatchData::Serialised(frame) => Ok(frame),
DispatchData::NetMessage(net_message) => Ok(SerialisedFrame::ChunkRef(
crate::serialisation::ser_helpers::embed_msg(net_message, buf)?,
)),
}
}
}
pub trait DispatchEvent: Any + Send + fmt::Debug {
fn into_any(self: Box<Self>) -> Box<dyn Any + Send>;
}
impl<T> DispatchEvent for T
where
T: Any + Send + fmt::Debug,
{
fn into_any(self: Box<Self>) -> Box<dyn Any + Send> {
self
}
}
#[derive(Debug)]
pub enum DispatchEnvelope {
Msg {
src: ActorPath,
dst: ActorPath,
msg: DispatchData,
},
ForwardedMsg {
msg: NetMessage,
},
Registration(RegistrationEnvelope),
Event(Box<dyn DispatchEvent>),
LockedChunk(BufferChunk),
}