From 404ffe3a199c8adb62961a0180ec1f3088e8e3bf Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Thu, 15 Dec 2022 16:17:00 +0300
Subject: [PATCH] refactor(util): generic Transition for displaying transitions

---
 src/traft/mod.rs | 19 ++++---------------
 src/util.rs      | 24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/src/traft/mod.rs b/src/traft/mod.rs
index 8dfbd7635a..18e1da3791 100644
--- a/src/traft/mod.rs
+++ b/src/traft/mod.rs
@@ -12,7 +12,7 @@ pub mod topology;
 use crate::storage;
 use crate::storage::ClusterwideSpace;
 use crate::stringify_debug;
-use crate::util::{AnyWithTypeName, Uppercase};
+use crate::util::{AnyWithTypeName, Transition, Uppercase};
 use ::raft::prelude as raft;
 use ::tarantool::tlua;
 use ::tarantool::tlua::LuaError;
@@ -495,25 +495,14 @@ impl Instance {
 impl std::fmt::Display for Instance {
     #[rustfmt::skip]
     fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
-        return write!(f,
+        write!(f,
             "({}, {}, {}, {}, {})",
             self.instance_id,
             self.raft_id,
             self.replicaset_id,
-            GradeTransition { from: self.current_grade, to: self.target_grade },
+            Transition { from: self.current_grade, to: self.target_grade },
             &self.failure_domain,
-        );
-
-        struct GradeTransition { from: CurrentGrade, to: TargetGrade }
-        impl std::fmt::Display for GradeTransition {
-            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-                if self.from == self.to {
-                    write!(f, "{}", self.to)
-                } else {
-                    write!(f, "{} -> {}", self.from, self.to)
-                }
-            }
-        }
+        )
     }
 }
 
diff --git a/src/util.rs b/src/util.rs
index aadd362831..3f10edfe08 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -398,6 +398,30 @@ pub fn downcast<T: 'static>(any: Box<dyn AnyWithTypeName>) -> Result<T, Error> {
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+/// A helper struct for displaying transitions between 2 values.
+pub struct Transition<T, U> {
+    pub from: T,
+    pub to: U,
+}
+
+impl<T, U> std::fmt::Display for Transition<T, U>
+where
+    T: std::fmt::Display,
+    U: std::fmt::Display,
+    T: PartialEq<U>,
+{
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if self.from == self.to {
+            write!(f, "{}", self.to)
+        } else {
+            write!(f, "{} -> {}", self.from, self.to)
+        }
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// tests
 #[cfg(test)]
 mod tests {
     #[test]
-- 
GitLab