use service_channel::{mpsc::UnboundedSender, oneshot};
use crate::{envelop::EnvelopWithMessage, Error, Message, Result};
pub struct Address<M>
where
M: Message,
{
pub(crate) sender: UnboundedSender<Box<EnvelopWithMessage<M>>>,
}
impl<M> Clone for Address<M>
where
M: Message,
{
fn clone(&self) -> Self {
Self {
sender: self.sender.clone(),
}
}
}
impl<M> Address<M>
where
M: Message + Send + 'static,
M::Result: Send,
{
pub fn is_stop(&self) -> bool {
self.sender.is_closed()
}
pub async fn call(&self, message: M) -> Result<M::Result> {
let (sender, receiver) = oneshot::channel::<M::Result>();
let env = Box::new(EnvelopWithMessage::new(message, Some(sender)));
self.sender
.unbounded_send(env)
.map_err(|_| Error::ServiceStoped)?;
receiver.await.map_err(|_| Error::ServiceStoped)
}
pub fn send(&self, message: M) -> Result<()> {
let env = Box::new(EnvelopWithMessage::new(message, None));
self.sender
.unbounded_send(env)
.map_err(|_| Error::ServiceStoped)?;
Ok(())
}
}