use super::*;
use crate::{component::HandlerResult, messaging::UnpackError};
pub trait DynActorRefFactory {
fn dyn_ref(&self) -> DynActorRef;
}
pub trait Dispatching {
fn dispatcher_ref(&self) -> DispatcherRef;
}
pub trait NetworkActor: ComponentLogging {
type Message: MessageBounds;
type Deserialiser: Deserialiser<Self::Message>;
fn receive(&mut self, sender: Option<ActorPath>, msg: Self::Message) -> HandlerResult;
fn on_error(&mut self, error: UnpackError<crate::messaging::NetMessage>) -> HandlerResult {
warn!(
self.log(),
"Could not deserialise a message with Deserialiser with id={}. Error was: {:?}",
Self::Deserialiser::SER_ID,
error
);
Handled::OK
}
}
impl<A, M, D> Actor for A
where
M: MessageBounds,
D: Deserialiser<M>,
A: NetworkActor<Message = M, Deserialiser = D>,
{
type Message = M;
#[inline(always)]
fn receive_local(&mut self, msg: Self::Message) -> HandlerResult {
self.receive(None, msg)
}
#[inline(always)]
fn receive_network(&mut self, msg: crate::messaging::NetMessage) -> HandlerResult {
match msg.try_into_deserialised::<_, <Self as NetworkActor>::Deserialiser>() {
Ok(m) => self.receive(Some(m.sender), m.content),
Err(e) => self.on_error(e),
}
}
}