use futures::future::BoxFuture;
use std::future::Future;
use std::ops::{Deref, DerefMut};
use crate::{Publisher, Result};
pub trait Subscriber {
type Message: Send + 'static;
fn get_name(&self) -> &'static str;
fn subscribe_to(
&mut self,
publisher: &mut dyn Publisher<Message = Self::Message>,
) -> Result<()>;
fn receive(&mut self) -> BoxFuture<Self::Message>;
}
impl<T> Subscriber for T
where
T: Deref + DerefMut,
T::Target: Subscriber,
{
type Message = <T::Target as Subscriber>::Message;
fn get_name(&self) -> &'static str {
self.deref().get_name()
}
fn subscribe_to(
&mut self,
publisher: &mut dyn Publisher<Message = Self::Message>,
) -> Result<()> {
self.deref_mut().subscribe_to(publisher)
}
fn receive(&mut self) -> BoxFuture<Self::Message> {
self.deref_mut().receive()
}
}
pub trait SubscriberWrapper<Message>
where
Message: Send + 'static,
{
fn get_subscriber(&self) -> &impl Subscriber<Message = Message>;
fn get_subscriber_mut(&mut self) -> &mut impl Subscriber<Message = Message>;
fn get_name(&self) -> &'static str {
Subscriber::get_name(self.get_subscriber())
}
fn subscribe_to(&mut self, publisher: &mut dyn Publisher<Message = Message>) -> Result<()> {
Subscriber::subscribe_to(self.get_subscriber_mut(), publisher)
}
fn receive(&mut self) -> impl Future<Output = Message> {
Subscriber::receive(self.get_subscriber_mut())
}
}
impl<T> SubscriberWrapper<T::Message> for T
where
T: Subscriber,
{
fn get_subscriber(&self) -> &impl Subscriber<Message = T::Message> {
self
}
fn get_subscriber_mut(&mut self) -> &mut impl Subscriber<Message = T::Message> {
self
}
}