1
+ use serde:: { de:: Error , de:: Visitor , Deserialize , Deserializer , Serialize , Serializer } ;
1
2
/// The version of the HTTP protocol in use.
2
3
#[ derive( Copy , Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
3
4
#[ non_exhaustive]
@@ -18,6 +19,55 @@ pub enum Version {
18
19
Http3_0 ,
19
20
}
20
21
22
+ impl Serialize for Version {
23
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
24
+ where
25
+ S : Serializer ,
26
+ {
27
+ serializer. serialize_str ( & self . to_string ( ) )
28
+ }
29
+ }
30
+
31
+ struct VersionVisitor ;
32
+
33
+ impl < ' de > Visitor < ' de > for VersionVisitor {
34
+ type Value = Version ;
35
+
36
+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
37
+ write ! ( formatter, "a HTTP version as &str" )
38
+ }
39
+
40
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
41
+ where
42
+ E : Error ,
43
+ {
44
+ match v {
45
+ "HTTP/0.9" => Ok ( Version :: Http0_9 ) ,
46
+ "HTTP/1.0" => Ok ( Version :: Http1_0 ) ,
47
+ "HTTP/1.1" => Ok ( Version :: Http1_1 ) ,
48
+ "HTTP/2" => Ok ( Version :: Http2_0 ) ,
49
+ "HTTP/3" => Ok ( Version :: Http3_0 ) ,
50
+ _ => Err ( Error :: invalid_value ( serde:: de:: Unexpected :: Str ( v) , & self ) ) ,
51
+ }
52
+ }
53
+
54
+ fn visit_string < E > ( self , v : String ) -> Result < Self :: Value , E >
55
+ where
56
+ E : Error ,
57
+ {
58
+ self . visit_str ( & v)
59
+ }
60
+ }
61
+
62
+ impl < ' de > Deserialize < ' de > for Version {
63
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
64
+ where
65
+ D : Deserializer < ' de > ,
66
+ {
67
+ deserializer. deserialize_str ( VersionVisitor )
68
+ }
69
+ }
70
+
21
71
impl std:: fmt:: Display for Version {
22
72
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
23
73
f. write_str ( match self {
@@ -54,4 +104,11 @@ mod test {
54
104
assert ! ( Http1_1 > Http1_0 ) ;
55
105
assert ! ( Http1_0 > Http0_9 ) ;
56
106
}
107
+
108
+ #[ test]
109
+ fn serde ( ) -> Result < ( ) , serde_json:: Error > {
110
+ assert_eq ! ( "\" HTTP/3\" " , serde_json:: to_string( & Version :: Http3_0 ) ?) ;
111
+ assert_eq ! ( Version :: Http1_1 , serde_json:: from_str( "\" HTTP/1.1\" " ) ?) ;
112
+ Ok ( ( ) )
113
+ }
57
114
}
0 commit comments