use crate::OptionalSend;
use crate::RaftTypeConfig;
use crate::async_runtime::OneshotSender;
use crate::raft::responder::Responder;
use crate::type_config::TypeConfigExt;
use crate::type_config::alias::OneshotReceiverOf;
use crate::type_config::alias::OneshotSenderOf;
pub struct OneshotResponder<C, T>
where
C: RaftTypeConfig,
T: OptionalSend,
{
tx: OneshotSenderOf<C, T>,
}
impl<C, T> OneshotResponder<C, T>
where
C: RaftTypeConfig,
T: OptionalSend,
{
pub fn new(tx: OneshotSenderOf<C, T>) -> Self {
Self { tx }
}
pub fn new_pair() -> (Self, OneshotReceiverOf<C, T>) {
let (tx, rx) = C::oneshot();
(Self::new(tx), rx)
}
}
impl<C, T> Responder<C, T> for OneshotResponder<C, T>
where
C: RaftTypeConfig,
T: OptionalSend + 'static,
{
fn on_complete(self, res: T) {
let res = self.tx.send(res);
if res.is_ok() {
tracing::debug!("OneshotConsumer.tx.send: is_ok: {}", res.is_ok());
} else {
tracing::warn!("OneshotConsumer.tx.send: is_ok: {}", res.is_ok());
}
}
}