use core::fmt;
use async_channel::{Receiver, Sender};
pub trait BackgroundTask {
type Task: Future;
type MessageIn;
type MessageOut;
fn run(self, message_bus: MessageBus<Self::MessageIn, Self::MessageOut>) -> Self::Task;
}
#[derive(Clone)]
pub struct MessageBus<MessageIn, MessageOut> {
tx: Sender<MessageOut>,
rx: Receiver<MessageIn>,
}
impl<MessageIn, MessageOut> fmt::Debug for MessageBus<MessageIn, MessageOut> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("MessageBus")
.field("tx", &self.tx)
.field("rx", &self.rx)
.finish()
}
}
impl<MessageIn, MessageOut> MessageBus<MessageIn, MessageOut> {
pub(crate) fn from_parts(tx: Sender<MessageOut>, rx: Receiver<MessageIn>) -> Self {
MessageBus { tx, rx }
}
pub fn split(self) -> (Sender<MessageOut>, Receiver<MessageIn>) {
let MessageBus { tx, rx } = self;
(tx, rx)
}
pub fn send(&self, message: MessageOut) -> async_channel::Send<'_, MessageOut> {
self.tx.send(message)
}
pub fn recv(&self) -> async_channel::Recv<'_, MessageIn> {
self.rx.recv()
}
}