1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub enum NodeType {
10 Electable,
14
15 Monitor,
19
20 Secondary,
24
25 Arbiter,
29}
30
31impl NodeType {
32 pub fn is_electable(&self) -> bool {
36 matches!(self, NodeType::Electable | NodeType::Arbiter)
37 }
38
39 pub fn is_data_node(&self) -> bool {
43 matches!(self, NodeType::Electable | NodeType::Secondary)
44 }
45
46 pub fn can_be_master(&self) -> bool {
50 matches!(self, NodeType::Electable)
51 }
52}
53
54impl std::fmt::Display for NodeType {
55 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56 match self {
57 NodeType::Electable => write!(f, "ELECTABLE"),
58 NodeType::Monitor => write!(f, "MONITOR"),
59 NodeType::Secondary => write!(f, "SECONDARY"),
60 NodeType::Arbiter => write!(f, "ARBITER"),
61 }
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn test_is_electable() {
71 assert!(NodeType::Electable.is_electable());
72 assert!(!NodeType::Monitor.is_electable());
73 assert!(!NodeType::Secondary.is_electable());
74 assert!(NodeType::Arbiter.is_electable());
75 }
76
77 #[test]
78 fn test_is_data_node() {
79 assert!(NodeType::Electable.is_data_node());
80 assert!(!NodeType::Monitor.is_data_node());
81 assert!(NodeType::Secondary.is_data_node());
82 assert!(!NodeType::Arbiter.is_data_node());
83 }
84
85 #[test]
86 fn test_can_be_master() {
87 assert!(NodeType::Electable.can_be_master());
88 assert!(!NodeType::Monitor.can_be_master());
89 assert!(!NodeType::Secondary.can_be_master());
90 assert!(!NodeType::Arbiter.can_be_master());
91 }
92
93 #[test]
94 fn test_display() {
95 assert_eq!(NodeType::Electable.to_string(), "ELECTABLE");
96 assert_eq!(NodeType::Monitor.to_string(), "MONITOR");
97 assert_eq!(NodeType::Secondary.to_string(), "SECONDARY");
98 assert_eq!(NodeType::Arbiter.to_string(), "ARBITER");
99 }
100
101 #[test]
102 fn test_clone_and_copy() {
103 let nt = NodeType::Electable;
104 let cloned = nt;
105 let copied = nt;
106 assert_eq!(nt, cloned);
107 assert_eq!(nt, copied);
108 }
109
110 #[test]
111 fn test_eq_and_hash() {
112 use std::collections::HashSet;
113 let mut set = HashSet::new();
114 set.insert(NodeType::Electable);
115 set.insert(NodeType::Monitor);
116 set.insert(NodeType::Secondary);
117 set.insert(NodeType::Arbiter);
118 assert_eq!(set.len(), 4);
119
120 set.insert(NodeType::Electable);
122 assert_eq!(set.len(), 4);
123 }
124
125 #[test]
126 fn test_debug() {
127 let s = format!("{:?}", NodeType::Electable);
128 assert_eq!(s, "Electable");
129 }
130}