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