use crate::{
actor::{context::ActorContext, Actor},
error::ActorError,
};
use super::{Message, Notification, DefaultFederated, DefaultNotification};
#[async_trait::async_trait]
pub trait HandleNotification<N: Notification>: Actor {
async fn notified<F: Message>(
&mut self,
context: &mut ActorContext<F, N>,
notification: N,
) -> Result<(), ActorError>;
}
#[async_trait::async_trait]
impl<T> HandleNotification<DefaultNotification> for T where T: Actor {
async fn notified<F: Message>(
&mut self,
_context: &mut ActorContext<F, DefaultNotification>,
_notification: DefaultNotification,
) -> Result<(), ActorError> {
Ok(())
}
}
#[async_trait::async_trait]
pub trait HandleFederated<F: Message>: Actor {
async fn federated_message<N: Notification>(
&mut self,
context: &mut ActorContext<F, N>,
federated_message: F,
) -> Result<F::Response, ActorError>;
}
#[async_trait::async_trait]
impl<T> HandleFederated<DefaultFederated> for T where T: Actor {
async fn federated_message<N: Notification>(
&mut self,
_context: &mut ActorContext<DefaultFederated, N>,
_federated_message: DefaultFederated,
) -> Result<(), ActorError> {
Ok(())
}
}
#[async_trait::async_trait]
pub trait HandleMessage<M: Message>: Actor {
async fn message<F: Message, N: Notification>(
&mut self,
context: &mut ActorContext<F, N>,
message: M,
) -> Result<M::Response, ActorError>;
}