@@ -92,6 +92,13 @@ use unicase::UniCase;
92
92
93
93
use self :: internals:: Item ;
94
94
95
+ #[ cfg( feature = "serde-serialization" ) ]
96
+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
97
+ #[ cfg( feature = "serde-serialization" ) ]
98
+ use serde:: de;
99
+ #[ cfg( feature = "serde-serialization" ) ]
100
+ use serde:: ser;
101
+
95
102
pub use self :: shared:: * ;
96
103
pub use self :: common:: * ;
97
104
@@ -322,6 +329,65 @@ impl fmt::Debug for Headers {
322
329
}
323
330
}
324
331
332
+ #[ cfg( feature = "serde-serialization" ) ]
333
+ impl Serialize for Headers {
334
+ fn serialize < S > ( & self , serializer : & mut S ) -> Result < ( ) , S :: Error > where S : Serializer {
335
+ struct HeadersVisitor < ' a > {
336
+ iter : HeadersItems < ' a > ,
337
+ len : usize ,
338
+ }
339
+
340
+ impl < ' a > ser:: MapVisitor for HeadersVisitor < ' a > {
341
+ fn visit < S > ( & mut self , serializer : & mut S ) -> Result < Option < ( ) > , S :: Error >
342
+ where S : Serializer {
343
+ match self . iter . next ( ) {
344
+ Some ( header_item) => {
345
+ try!( serializer. visit_map_elt ( header_item. name ( ) ,
346
+ header_item. value_string ( ) ) ) ;
347
+ Ok ( Some ( ( ) ) )
348
+ }
349
+ None => Ok ( None ) ,
350
+ }
351
+ }
352
+
353
+ fn len ( & self ) -> Option < usize > {
354
+ Some ( self . len )
355
+ }
356
+ }
357
+
358
+ serializer. visit_map ( HeadersVisitor {
359
+ iter : self . iter ( ) ,
360
+ len : self . len ( ) ,
361
+ } )
362
+ }
363
+ }
364
+
365
+ #[ cfg( feature = "serde-serialization" ) ]
366
+ impl Deserialize for Headers {
367
+ fn deserialize < D > ( deserializer : & mut D ) -> Result < Headers , D :: Error > where D : Deserializer {
368
+ struct HeadersVisitor ;
369
+
370
+ impl de:: Visitor for HeadersVisitor {
371
+ type Value = Headers ;
372
+
373
+ fn visit_map < V > ( & mut self , mut visitor : V ) -> Result < Headers , V :: Error >
374
+ where V : de:: MapVisitor {
375
+ let mut result = Headers :: new ( ) ;
376
+ while let Some ( ( key, value) ) = try!( visitor. visit ( ) ) {
377
+ let ( key, value) : ( String , String ) = ( key, value) ;
378
+ result. set_raw ( key, vec ! [ value. into_bytes( ) ] ) ;
379
+ }
380
+ try!( visitor. end ( ) ) ;
381
+ Ok ( result)
382
+ }
383
+ }
384
+
385
+ let result = Headers :: new ( ) ;
386
+ try!( deserializer. visit_map ( HeadersVisitor ) ) ;
387
+ Ok ( result)
388
+ }
389
+ }
390
+
325
391
/// An `Iterator` over the fields in a `Headers` map.
326
392
pub struct HeadersItems < ' a > {
327
393
inner : Iter < ' a , HeaderName , Item >
0 commit comments