use crate::Membership;
use crate::RaftTypeConfig;
use crate::async_runtime::OneshotSender;
use crate::entry::RaftPayload;
use crate::type_config::alias::OneshotSenderOf;
pub(crate) enum MembershipPayloads<C>
where C: RaftTypeConfig
{
Uniform(C::Payload),
JointOrUniform {
joint: C::Payload,
uniform: C::Payload,
unused_tx: OneshotSenderOf<C, C::Payload>,
},
}
impl<C> MembershipPayloads<C>
where C: RaftTypeConfig
{
pub(crate) fn select(self, membership: Membership<C::NodeId, C::Node>) -> C::Payload {
let payload = match self {
Self::Uniform(uniform) => uniform,
Self::JointOrUniform {
joint,
uniform,
unused_tx,
} => {
let (selected, unused) = if membership.is_joint() {
(joint, uniform)
} else {
(uniform, joint)
};
let _ = unused_tx.send(unused);
selected
}
};
payload.with_membership(membership)
}
}