1#![deny(missing_docs)]
55#![deny(unsafe_code)]
56
57use cookie::Cookie;
58use headers::ContentType;
59use hyper::StatusCode;
60use hyper::header::{HeaderName, HeaderValue};
61use http::HeaderMap;
62use hyper::Method;
63use mime::Mime;
64use serde::{Deserialize, Deserializer, Serialize, Serializer};
65use serde_bytes::{ByteBuf, Bytes};
66use serde::de::{self, MapAccess, SeqAccess, Visitor, Error};
67use serde::ser::{SerializeMap, SerializeSeq};
68use std::cmp;
69use std::fmt;
70use std::ops::{Deref, DerefMut};
71use std::str;
72use std::str::FromStr;
73use time::{Tm, strptime};
74use hyper::Uri;
75
76#[inline(always)]
81pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
82 where D: Deserializer<'de>,
83 De<T>: Deserialize<'de>,
84{
85 De::deserialize(deserializer).map(De::into_inner)
86}
87
88#[inline(always)]
93pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
94 where S: Serializer,
95 for<'a> Ser<'a, T>: Serialize,
96{
97 Ser::new(value).serialize(serializer)
98}
99
100#[inline(always)]
109pub fn serialize_pretty<T, S>(value: &T,
110 serializer: S)
111 -> Result<S::Ok, S::Error>
112 where S: Serializer,
113 for<'a> Ser<'a, T>: Serialize,
114{
115 Ser::new_pretty(value).serialize(serializer)
116}
117
118#[derive(Debug, PartialEq)]
125pub struct De<T> {
126 v: T,
127}
128
129impl<T> De<T> {
130 #[inline(always)]
132 pub fn new(v: T) -> Self {
133 De { v: v }
134 }
135}
136
137impl<'de, T> De<T>
138 where De<T>: Deserialize<'de>,
139{
140 #[inline(always)]
142 pub fn into_inner(self) -> T {
143 self.v
144 }
145}
146
147#[derive(Debug)]
153pub struct Ser<'a, T: 'a> {
154 v: &'a T,
155 pretty: bool,
156}
157
158impl<'a, T> Ser<'a, T>
159 where Ser<'a, T>: serde::Serialize,
160{
161 #[inline(always)]
163 pub fn new(value: &'a T) -> Self {
164 Ser {
165 v: value,
166 pretty: false,
167 }
168 }
169
170 #[inline(always)]
174 pub fn new_pretty(value: &'a T) -> Self {
175 Ser {
176 v: value,
177 pretty: true,
178 }
179 }
180}
181
182#[derive(Clone, PartialEq)]
185pub struct Serde<T>(pub T)
186 where for<'de> De<T>: Deserialize<'de>,
187 for<'a> Ser<'a, T>: Serialize;
188
189impl<T> Serde<T>
190 where for<'de> De<T>: Deserialize<'de>,
191 for<'a> Ser<'a, T>: Serialize,
192{
193 #[inline(always)]
195 pub fn into_inner(self) -> T {
196 self.0
197 }
198}
199
200impl<T> fmt::Debug for Serde<T>
201 where T: fmt::Debug,
202 for<'de> De<T>: Deserialize<'de>,
203 for<'a> Ser<'a, T>: Serialize,
204{
205 fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
206 self.0.fmt(formatter)
207 }
208}
209
210impl<T> Deref for Serde<T>
211 where for<'de> De<T>: Deserialize<'de>,
212 for<'a> Ser<'a, T>: Serialize,
213{
214 type Target = T;
215
216 fn deref(&self) -> &T {
217 &self.0
218 }
219}
220
221impl<T> DerefMut for Serde<T>
222 where for<'de> De<T>: Deserialize<'de>,
223 for<'a> Ser<'a, T>: Serialize,
224{
225 fn deref_mut(&mut self) -> &mut T {
226 &mut self.0
227 }
228}
229
230impl<T: PartialEq> PartialEq<T> for Serde<T>
231 where for<'de> De<T>: Deserialize<'de>,
232 for<'a> Ser<'a, T>: Serialize,
233{
234 fn eq(&self, other: &T) -> bool {
235 self.0 == *other
236 }
237}
238
239impl<'b, T> Deserialize<'b> for Serde<T>
240 where for<'de> De<T>: Deserialize<'de>,
241 for<'a> Ser<'a, T>: Serialize,
242{
243 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
244 where D: Deserializer<'b>,
245 {
246 De::deserialize(deserializer).map(De::into_inner).map(Serde)
247 }
248}
249
250impl<T> Serialize for Serde<T>
251 where for<'de> De<T>: Deserialize<'de>,
252 for<'a> Ser<'a, T>: Serialize,
253{
254 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
255 where S: Serializer,
256 {
257 Ser::new(&self.0).serialize(serializer)
258 }
259}
260
261impl<'de> Deserialize<'de> for De<ContentType> {
262 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
263 where D: Deserializer<'de>,
264 {
265 deserialize(deserializer).map(|v: mime::Mime| ContentType::from(v)).map(De::new)
266 }
267}
268
269impl<'a> Serialize for Ser<'a, ContentType> {
270 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
271 where S: Serializer,
272 {
273 serialize(&mime::Mime::from(self.v.clone()), serializer)
274 }
275}
276
277impl<'de> Deserialize<'de> for De<Cookie<'static>> {
278 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
279 where D: Deserializer<'de>,
280 {
281 struct CookieVisitor;
282
283 impl<'de> Visitor<'de> for CookieVisitor {
284 type Value = De<Cookie<'static>>;
285
286 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
287 write!(formatter, "an HTTP cookie header value")
288 }
289
290 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
291 where E: de::Error,
292 {
293 Cookie::parse(v)
294 .map(Cookie::into_owned)
295 .map(De::new)
296 .map_err(|e| E::custom(format!("{:?}", e)))
297 }
298 }
299
300 deserializer.deserialize_string(CookieVisitor)
301 }
302}
303
304impl<'a, 'cookie> Serialize for Ser<'a, Cookie<'cookie>> {
305 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
306 where S: Serializer,
307 {
308 serializer.serialize_str(&self.v.to_string())
309 }
310}
311
312
313impl<'de> Deserialize<'de> for De<HeaderMap> {
314 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
315 where D: Deserializer<'de>,
316 {
317 struct HeadersVisitor;
318
319 impl<'de> Visitor<'de> for HeadersVisitor {
320 type Value = De<HeaderMap>;
321
322 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
323 write!(formatter, "a map from header names to header values")
324 }
325
326 fn visit_unit<E>(self) -> Result<Self::Value, E>
327 where E: de::Error,
328 {
329 Ok(De::new(HeaderMap::new()))
330 }
331
332 fn visit_map<V>(self,
333 mut visitor: V)
334 -> Result<Self::Value, V::Error>
335 where V: MapAccess<'de>,
336 {
337 let mut headers = HeaderMap::new();
338 while let Some((k, values)) = visitor.next_entry::<String, Value>()? {
339 for v in values.0.iter() {
340 headers.append(HeaderName::from_str(&k).map_err(V::Error::custom)?, HeaderValue::from_bytes(&v).map_err(V::Error::custom)?);
341 }
342 }
343 Ok(De::new(headers))
344 }
345 }
346
347 struct Value(Vec<Vec<u8>>);
348
349 impl<'de> Deserialize<'de> for Value {
350 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
351 where D: Deserializer<'de>,
352 {
353 deserializer.deserialize_seq(ValueVisitor)
354 }
355 }
356
357 struct ValueVisitor;
358
359 impl<'de> Visitor<'de> for ValueVisitor {
360 type Value = Value;
361
362 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
363 write!(formatter, "an array of strings and sequences of bytes")
364 }
365
366 fn visit_unit<E>(self) -> Result<Value, E>
367 where E: de::Error,
368 {
369 Ok(Value(vec![]))
370 }
371
372 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
373 where V: SeqAccess<'de>,
374 {
375 let capacity = cmp::min(visitor.size_hint().unwrap_or(0), 64);
377 let mut values = Vec::with_capacity(capacity);
378 while let Some(v) = visitor.next_element::<ByteBuf>()? {
379 values.push(v.into_vec());
380 }
381 Ok(Value(values))
382 }
383 }
384
385 deserializer.deserialize_map(HeadersVisitor)
386 }
387}
388
389impl<'a> Serialize for Ser<'a, HeaderMap> {
390 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
391 where S: Serializer,
392 {
393 struct Value<'headers>(&'headers [Vec<u8>], bool);
394
395 impl<'headers> Serialize for Value<'headers> {
396 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
397 where S: Serializer,
398 {
399 let mut serializer =
400 serializer.serialize_seq(Some(self.0.len()))?;
401 for v in self.0 {
402 if self.1 {
403 if let Ok(v) = str::from_utf8(v) {
404 serializer.serialize_element(v)?;
405 continue;
406 }
407 }
408 serializer.serialize_element(&Bytes::new(v))?;
409 }
410 serializer.end()
411 }
412 }
413
414 let mut serializer = serializer.serialize_map(Some(self.v.keys_len()))?;
415 for name in self.v.keys() {
416 let values = self.v.get_all(name);
417 serializer.serialize_entry(name.as_str(), &Value(&values.iter().map(|v| v.as_bytes().iter().cloned().collect()).collect::<Vec<Vec<u8>>>(), self.pretty))?;
418 }
419 serializer.end()
420 }
421}
422
423impl<'de> Deserialize<'de> for De<Method> {
424 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
425 where D: Deserializer<'de>,
426 {
427 struct MethodVisitor;
428
429 impl<'de> Visitor<'de> for MethodVisitor {
430 type Value = De<Method>;
431
432 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
433 write!(formatter, "an HTTP method")
434 }
435
436 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
437 where E: de::Error,
438 {
439 v.parse::<Method>().map(De::new).map_err(E::custom)
440 }
441 }
442
443 deserializer.deserialize_string(MethodVisitor)
444 }
445}
446
447impl<'a> Serialize for Ser<'a, Method> {
448 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
449 where S: Serializer,
450 {
451 Serialize::serialize(self.v.as_ref(), serializer)
452 }
453}
454
455impl<'de> Deserialize<'de> for De<Mime> {
456 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
457 where D: Deserializer<'de>,
458 {
459 struct MimeVisitor;
460
461 impl<'de> Visitor<'de> for MimeVisitor {
462 type Value = De<Mime>;
463
464 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
465 write!(formatter, "a mime type")
466 }
467
468 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
469 where E: de::Error,
470 {
471 v.parse::<Mime>().map(De::new).map_err(|_| {
472 E::custom("could not parse mime type")
473 })
474 }
475 }
476
477 deserializer.deserialize_string(MimeVisitor)
478 }
479}
480
481impl<'a> Serialize for Ser<'a, Mime> {
482 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
483 where S: Serializer,
484 {
485 serializer.serialize_str(&self.v.to_string())
486 }
487}
488
489impl<'de> Deserialize<'de> for De<StatusCode> {
490 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
491 where D: Deserializer<'de>,
492 {
493 let code = Deserialize::deserialize(deserializer)?;
494 Ok(De::new(StatusCode::from_u16(code).map_err(D::Error::custom)?))
495 }
496}
497
498impl<'a> Serialize for Ser<'a, StatusCode> {
499 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
500 where S: Serializer,
501 {
502 self.v.as_u16().serialize(serializer)
503 }
504}
505
506impl<'a> Serialize for Ser<'a, (StatusCode, String)> {
507 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
508 where S: Serializer,
509 {
510 let mut serializer = serializer.serialize_seq(Some(2))?;
511 serializer.serialize_element(&Ser::new(&self.v.0))?;
512 serializer.serialize_element(&self.v.1)?;
513 serializer.end()
514 }
515}
516
517impl<'de> Deserialize<'de> for De<(StatusCode, String)> {
518 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
519 where D: Deserializer<'de>,
520 {
521 Ok(De::new(deserializer.deserialize_seq(StatusVisitor)?))
522 }
523}
524
525struct StatusVisitor;
526
527impl<'de> Visitor<'de> for StatusVisitor {
528 type Value = (StatusCode, String);
529
530 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
531 write!(formatter, "an array containing a status code and a reason string")
532 }
533
534 fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
535 where V: SeqAccess<'de>,
536 {
537
538 let code = visitor.next_element::<u16>()?.ok_or_else(||
539 V::Error::custom("Can't find the status code")
540 )?;
541 let code = StatusCode::from_u16(code).map_err(V::Error::custom)?;
542 let reason = visitor.next_element::<String>()?.ok_or_else(||
543 V::Error::custom("Can't find the reason string")
544 )?;
545 Ok((code, reason))
546 }
547}
548
549impl<'de> Deserialize<'de> for De<Tm> {
550 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
551 where D: Deserializer<'de>,
552 {
553 struct TmVisitor;
554
555 impl<'de> Visitor<'de> for TmVisitor {
556 type Value = De<Tm>;
557
558 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
559 write!(formatter, "a date and time according to RFC 3339")
560 }
561
562 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
563 where E: de::Error,
564 {
565 strptime(v, "%Y-%m-%dT%H:%M:%SZ").map(De::new).map_err(|e| {
566 E::custom(e.to_string())
567 })
568 }
569 }
570
571 deserializer.deserialize_string(TmVisitor)
572 }
573}
574
575impl<'a> Serialize for Ser<'a, Tm> {
576 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
577 where S: Serializer,
578 {
579 serializer.serialize_str(&self.v.rfc3339().to_string())
580 }
581}
582
583impl<'de> Deserialize<'de> for De<Uri> {
584 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
585 where D: Deserializer<'de>,
586 {
587 struct UriVisitor;
588
589 impl<'de> Visitor<'de> for UriVisitor {
590 type Value = De<Uri>;
591
592 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
593 write!(formatter, "an HTTP Uri value")
594 }
595
596 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
597 where E: de::Error,
598 {
599 Uri::from_str(v)
600 .map(De::new)
601 .map_err(|e| E::custom(format!("{}", e)))
602 }
603 }
604
605 deserializer.deserialize_string(UriVisitor)
606 }
607}
608
609impl<'a> Serialize for Ser<'a, Uri> {
610 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
611 where S: Serializer,
612 {
613 serializer.serialize_str(&self.v.to_string())
617 }
618}