#[derive(Debug)]
pub(crate) struct AcknowledgedMessage<M, R = ()> {
notifier: tokio::sync::oneshot::Sender<R>,
message: M,
}
impl<M, R> AcknowledgedMessage<M, R> {
pub(crate) fn package(message: M) -> (Self, AcknowledgmentReceiver<R>) {
let (sender, receiver) = tokio::sync::oneshot::channel();
(
Self {
message,
notifier: sender,
},
AcknowledgmentReceiver { receiver },
)
}
pub(crate) fn into_message(self) -> M {
self.message
}
#[allow(dead_code)]
pub(crate) fn acknowledge(self, result: impl Into<R>) {
let _: std::result::Result<_, _> = self.notifier.send(result.into());
}
}
pub(crate) struct AcknowledgmentReceiver<R> {
receiver: tokio::sync::oneshot::Receiver<R>,
}
impl<R> AcknowledgmentReceiver<R> {
pub(crate) async fn wait_for_acknowledgment(self) -> Option<R> {
self.receiver.await.ok()
}
}