diff --git a/src/traft/mod.rs b/src/traft/mod.rs index 9a69aa0be47666e4037c10c620e722c0bcc37785..8fa89c047ac7c5a0e7c0b022f0b5367bec52b195 100644 --- a/src/traft/mod.rs +++ b/src/traft/mod.rs @@ -919,52 +919,22 @@ pub struct UpdatePeerRequest { pub changes: Vec<PeerChange>, } -macro_rules! define_peer_change { - ( - $(#[$meta:meta])* - pub enum $enum:ident { - $( - #[setter = $setter:ident, field = $field:ident] - $variant:ident($type:ty), - )* - } - ) => { - $(#[$meta])* - pub enum $enum { - $( $variant($type), )* - } - - impl $enum { - pub fn apply(self, peer: &mut Peer) { - match self { - $( Self::$variant(value) => peer.$field = value, )* - } - } - } - - impl UpdatePeerRequest { - $( - #[inline] - pub fn $setter(mut self, value: $type) -> Self { - self.changes.push($enum::$variant(value)); - self - } - )* - } - } +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum PeerChange { + CurrentGrade(CurrentGrade), + TargetGrade(TargetGrade), + FailureDomain(FailureDomain), + IsMaster(bool), } -define_peer_change! { - #[derive(Clone, Debug, Serialize, Deserialize)] - pub enum PeerChange { - #[setter = with_current_grade, field = current_grade] - CurrentGrade(CurrentGrade), - #[setter = with_target_grade, field = target_grade] - TargetGrade(TargetGrade), - #[setter = with_failure_domain, field = failure_domain] - FailureDomain(FailureDomain), - #[setter = with_is_master, field = is_master] - IsMaster(bool), +impl PeerChange { + pub fn apply(self, peer: &mut Peer) { + match self { + Self::CurrentGrade(value) => peer.current_grade = value, + Self::TargetGrade(value) => peer.target_grade = value, + Self::FailureDomain(value) => peer.failure_domain = value, + Self::IsMaster(value) => peer.is_master = value, + } } } @@ -978,6 +948,26 @@ impl UpdatePeerRequest { changes: vec![], } } + #[inline] + pub fn with_current_grade(mut self, value: CurrentGrade) -> Self { + self.changes.push(PeerChange::CurrentGrade(value)); + self + } + #[inline] + pub fn with_target_grade(mut self, value: TargetGrade) -> Self { + self.changes.push(PeerChange::TargetGrade(value)); + self + } + #[inline] + pub fn with_failure_domain(mut self, value: FailureDomain) -> Self { + self.changes.push(PeerChange::FailureDomain(value)); + self + } + #[inline] + pub fn with_is_master(mut self, value: bool) -> Self { + self.changes.push(PeerChange::IsMaster(value)); + self + } } ///////////////////////////////////////////////////////////////////////////////