use crate::actor::{
addr::{Addr, WeakAddr},
message::{Handler, Message},
proxy::Proxy,
};
#[async_trait::async_trait]
pub trait Broker<T: Message + Sync + Clone>:
Handler<Publish<T>> + Handler<Subscribe<T>> + Handler<Unsubscribe>
{
}
pub struct Publish<T: Message + Sync + Clone + Clone>(pub T);
impl<T: Message + Sync + Clone> Message for Publish<T> {
type Result = ();
}
pub type SubscriptionID = u64;
pub struct Subscribe<T: Message + Sync + Clone> {
pub addr: WeakAddr,
pub proxy: Proxy<T>,
}
impl<T: Message + Sync + Clone> Subscribe<T> {
pub async fn from_addr<A: Handler<T>>(addr: &Addr) -> Self {
Self {
addr: addr.downgrade(),
proxy: addr.proxy::<A, T>().await,
}
}
}
impl<T: Message + Sync + Clone> Message for Subscribe<T> {
type Result = SubscriptionID;
}
pub struct Unsubscribe(pub SubscriptionID);
impl Message for Unsubscribe {
type Result = ();
}