use crate::RaftTypeConfig;
use crate::entry::RaftEntry;
use crate::entry::RaftPayload;
use crate::raft::responder::core_responder::CoreResponder;
use crate::storage::v2::apply_responder::ApplyResponder;
use crate::storage::v2::apply_responder_inner::ApplyResponderInner;
use crate::type_config::alias::EntryOf;
pub type EntryResponder<C> = (EntryOf<C>, Option<ApplyResponder<C>>);
pub(crate) struct EntryResponderBuilder<C: RaftTypeConfig> {
pub(crate) entry: C::Entry,
pub(crate) responder: Option<CoreResponder<C>>,
}
impl<C: RaftTypeConfig> EntryResponderBuilder<C> {
pub(crate) fn into_parts(self) -> (C::Entry, Option<ApplyResponder<C>>) {
let responder = match self.responder {
None => return (self.entry, None),
Some(r) => r,
};
let log_id = self.entry.log_id();
let membership = self.entry.get_membership();
let inner = match membership {
Some(membership) => ApplyResponderInner::Membership {
log_id,
membership,
responder,
},
None => ApplyResponderInner::Normal { log_id, responder },
};
(self.entry, Some(ApplyResponder { inner }))
}
}
impl<C: RaftTypeConfig> std::fmt::Display for EntryResponderBuilder<C> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"EntryResponderBuilder(log_id={}, has_responder={}, has_membership={})",
self.entry.log_id(),
self.responder.is_some(),
self.entry.get_membership().is_some()
)
}
}