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
+    }
 }
 
 ///////////////////////////////////////////////////////////////////////////////