rocketmq_protocol/protocol/heartbeat/
message_model.rs1use std::fmt;
16use std::fmt::Display;
17
18use serde::Deserialize;
19use serde::Deserializer;
20use serde::Serialize;
21use serde::Serializer;
22
23#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Default)]
24pub enum MessageModel {
25 Broadcasting,
26 #[default]
27 Clustering,
28}
29
30impl MessageModel {
31 fn get_mode_cn(&self) -> &'static str {
32 match self {
33 MessageModel::Broadcasting => "BROADCASTING",
34 MessageModel::Clustering => "CLUSTERING",
35 }
36 }
37}
38
39impl Serialize for MessageModel {
40 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41 where
42 S: Serializer,
43 {
44 let value = match self {
45 MessageModel::Broadcasting => "BROADCASTING",
46 MessageModel::Clustering => "CLUSTERING",
47 };
48 serializer.serialize_str(value)
49 }
50}
51
52impl<'de> Deserialize<'de> for MessageModel {
53 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54 where
55 D: Deserializer<'de>,
56 {
57 struct MessageModelVisitor;
58
59 impl serde::de::Visitor<'_> for MessageModelVisitor {
60 type Value = MessageModel;
61
62 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
63 formatter.write_str("a string representing MessageModel")
64 }
65
66 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
67 where
68 E: serde::de::Error,
69 {
70 match value {
71 "BROADCASTING" => Ok(MessageModel::Broadcasting),
72 "CLUSTERING" => Ok(MessageModel::Clustering),
73 _ => Err(E::custom(format_args!(
74 "MessageModel: {}",
75 E::unknown_variant(value, &["BROADCASTING", "CLUSTERING"])
76 ))),
77 }
78 }
79 }
80
81 deserializer.deserialize_str(MessageModelVisitor)
82 }
83}
84
85impl Display for MessageModel {
86 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87 write!(f, "{}", self.get_mode_cn())
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use serde_json;
94
95 use super::*;
96
97 #[test]
98 fn serialize_message_model_broadcasting() {
99 let model = MessageModel::Broadcasting;
100 let serialized = serde_json::to_string(&model).unwrap();
101 assert_eq!(serialized, "\"BROADCASTING\"");
102 }
103
104 #[test]
105 fn serialize_message_model_clustering() {
106 let model = MessageModel::Clustering;
107 let serialized = serde_json::to_string(&model).unwrap();
108 assert_eq!(serialized, "\"CLUSTERING\"");
109 }
110
111 #[test]
112 fn deserialize_message_model_broadcasting() {
113 let json = "\"BROADCASTING\"";
114 let deserialized: MessageModel = serde_json::from_str(json).unwrap();
115 assert_eq!(deserialized, MessageModel::Broadcasting);
116 }
117
118 #[test]
119 fn deserialize_message_model_clustering() {
120 let json = "\"CLUSTERING\"";
121 let deserialized: MessageModel = serde_json::from_str(json).unwrap();
122 assert_eq!(deserialized, MessageModel::Clustering);
123 }
124
125 #[test]
126 fn deserialize_message_model_invalid() {
127 let json = "\"INVALID\"";
128 let error = serde_json::from_str::<MessageModel>(json).unwrap_err().to_string();
129 for fragment in ["MessageModel", "unknown variant", "BROADCASTING", "CLUSTERING"] {
130 assert!(error.contains(fragment), "{error}");
131 }
132 let error = serde_json::from_str::<MessageModel>("1").unwrap_err().to_string();
133 assert!(error.contains("a string representing MessageModel"), "{error}");
134 }
135
136 #[test]
137 fn display_message_model_broadcasting() {
138 let model = MessageModel::Broadcasting;
139 assert_eq!(model.to_string(), "BROADCASTING");
140 }
141
142 #[test]
143 fn display_message_model_clustering() {
144 let model = MessageModel::Clustering;
145 assert_eq!(model.to_string(), "CLUSTERING");
146 }
147}