use openraft_macros::since;
use crate::ChangeMembers;
use crate::RaftTypeConfig;
use crate::batch::Batch;
use crate::raft::Precondition;
use crate::type_config::alias::BatchOf;
#[since(version = "0.10.0", change = "added configurable membership change request")]
pub struct ChangeMembershipRequest<C>
where C: RaftTypeConfig
{
members: ChangeMembers<C::NodeId, C::Node>,
retain_removed_as_learners: bool,
preconditions: BatchOf<C, Precondition<C>>,
payload: Option<(C::Payload, C::Payload)>,
}
impl<C> ChangeMembershipRequest<C>
where C: RaftTypeConfig
{
#[since(version = "0.10.0", change = "added configurable membership change request")]
pub fn new(members: impl Into<ChangeMembers<C::NodeId, C::Node>>, retain: bool) -> Self {
let members = members.into();
Self {
members,
retain_removed_as_learners: retain,
preconditions: BatchOf::<C, _>::of([]),
payload: None,
}
}
#[since(version = "0.10.0", change = "select each payload by the shape of its membership")]
#[since(version = "0.10.0", change = "accept separate payloads for membership change steps")]
#[since(version = "0.10.0", change = "added optional membership change payload")]
pub fn with_payload(mut self, joint_payload: C::Payload, uniform_payload: C::Payload) -> Self {
self.payload = Some((joint_payload, uniform_payload));
self
}
#[since(version = "0.10.0", change = "added membership change preconditions")]
pub fn with_preconditions(mut self, preconditions: impl IntoIterator<Item = Precondition<C>>) -> Self {
let preconditions = BatchOf::<C, _>::of(preconditions);
self.preconditions = preconditions;
self
}
pub(crate) fn into_parts(
self,
) -> (
ChangeMembers<C::NodeId, C::Node>,
bool,
BatchOf<C, Precondition<C>>,
Option<(C::Payload, C::Payload)>,
) {
(
self.members,
self.retain_removed_as_learners,
self.preconditions,
self.payload,
)
}
}