14
14
* See the License for the specific language governing permissions and
15
15
* limitations under the License.
16
16
*/
17
+ use std:: fmt;
18
+
19
+ use serde:: de;
20
+ use serde:: de:: Visitor ;
21
+ use serde:: Deserialize ;
22
+ use serde:: Deserializer ;
23
+ use serde:: Serialize ;
24
+ use serde:: Serializer ;
25
+
17
26
#[ derive( Debug , PartialEq , Copy , Clone , Default ) ]
18
27
pub enum MessageType {
19
28
#[ default]
@@ -47,7 +56,7 @@ impl MessageType {
47
56
}
48
57
}
49
58
50
- #[ derive( Debug , PartialEq , Copy , Clone ) ]
59
+ #[ derive( Debug , PartialEq , Copy , Clone , Hash , Eq ) ]
51
60
pub enum MessageRequestMode {
52
61
Pull ,
53
62
Pop ,
@@ -62,6 +71,48 @@ impl MessageRequestMode {
62
71
}
63
72
}
64
73
74
+ impl Serialize for MessageRequestMode {
75
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
76
+ where
77
+ S : Serializer ,
78
+ {
79
+ serializer. serialize_str ( match * self {
80
+ MessageRequestMode :: Pull => "PULL" ,
81
+ MessageRequestMode :: Pop => "POP" ,
82
+ } )
83
+ }
84
+ }
85
+
86
+ impl < ' de > Deserialize < ' de > for MessageRequestMode {
87
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
88
+ where
89
+ D : Deserializer < ' de > ,
90
+ {
91
+ struct MessageRequestModeVisitor ;
92
+
93
+ impl Visitor < ' _ > for MessageRequestModeVisitor {
94
+ type Value = MessageRequestMode ;
95
+
96
+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
97
+ formatter. write_str ( "a string representing a MessageRequestMode" )
98
+ }
99
+
100
+ fn visit_str < E > ( self , value : & str ) -> Result < MessageRequestMode , E >
101
+ where
102
+ E : de:: Error ,
103
+ {
104
+ match value {
105
+ "PULL" => Ok ( MessageRequestMode :: Pull ) ,
106
+ "POP" => Ok ( MessageRequestMode :: Pop ) ,
107
+ _ => Err ( de:: Error :: unknown_variant ( value, & [ "PULL" , "POP" ] ) ) ,
108
+ }
109
+ }
110
+ }
111
+
112
+ deserializer. deserialize_str ( MessageRequestModeVisitor )
113
+ }
114
+ }
115
+
65
116
#[ cfg( test) ]
66
117
mod tests {
67
118
use super :: * ;
@@ -108,4 +159,39 @@ mod tests {
108
159
assert_eq ! ( MessageRequestMode :: Pull . get_name( ) , "PULL" ) ;
109
160
assert_eq ! ( MessageRequestMode :: Pop . get_name( ) , "POP" ) ;
110
161
}
162
+
163
+ #[ test]
164
+ fn serialize_message_request_mode_pull ( ) {
165
+ let mode = MessageRequestMode :: Pull ;
166
+ let serialized = serde_json:: to_string ( & mode) . unwrap ( ) ;
167
+ assert_eq ! ( serialized, "\" PULL\" " ) ;
168
+ }
169
+
170
+ #[ test]
171
+ fn serialize_message_request_mode_pop ( ) {
172
+ let mode = MessageRequestMode :: Pop ;
173
+ let serialized = serde_json:: to_string ( & mode) . unwrap ( ) ;
174
+ assert_eq ! ( serialized, "\" POP\" " ) ;
175
+ }
176
+
177
+ #[ test]
178
+ fn deserialize_message_request_mode_pull ( ) {
179
+ let json = "\" PULL\" " ;
180
+ let deserialized: MessageRequestMode = serde_json:: from_str ( json) . unwrap ( ) ;
181
+ assert_eq ! ( deserialized, MessageRequestMode :: Pull ) ;
182
+ }
183
+
184
+ #[ test]
185
+ fn deserialize_message_request_mode_pop ( ) {
186
+ let json = "\" POP\" " ;
187
+ let deserialized: MessageRequestMode = serde_json:: from_str ( json) . unwrap ( ) ;
188
+ assert_eq ! ( deserialized, MessageRequestMode :: Pop ) ;
189
+ }
190
+
191
+ #[ test]
192
+ fn deserialize_message_request_mode_invalid ( ) {
193
+ let json = "\" INVALID\" " ;
194
+ let deserialized: Result < MessageRequestMode , _ > = serde_json:: from_str ( json) ;
195
+ assert ! ( deserialized. is_err( ) ) ;
196
+ }
111
197
}
0 commit comments