headers/util/
mod.rs
1use HeaderValue;
2
3pub(crate) use self::entity::{EntityTag, EntityTagRange};
6pub(crate) use self::flat_csv::{FlatCsv, SemiColon};
7pub(crate) use self::fmt::fmt;
8pub(crate) use self::http_date::HttpDate;
9pub(crate) use self::iter::IterExt;
10pub(crate) use self::seconds::Seconds;
13pub(crate) use self::value_string::HeaderValueString;
14
15pub(crate) mod csv;
17mod entity;
19mod flat_csv;
20mod fmt;
21mod http_date;
22mod iter;
23mod seconds;
25mod value_string;
26
27macro_rules! error_type {
28 ($name:ident) => {
29 #[doc(hidden)]
30 pub struct $name {
31 _inner: (),
32 }
33
34 impl ::std::fmt::Debug for $name {
35 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
36 f.debug_struct(stringify!($name)).finish()
37 }
38 }
39
40 impl ::std::fmt::Display for $name {
41 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
42 f.write_str(stringify!($name))
43 }
44 }
45
46 impl ::std::error::Error for $name {}
47 };
48}
49
50macro_rules! derive_header {
51 ($type:ident(_), name: $name:ident) => {
52 impl crate::Header for $type {
53 fn name() -> &'static ::http::header::HeaderName {
54 &::http::header::$name
55 }
56
57 fn decode<'i, I>(values: &mut I) -> Result<Self, ::Error>
58 where
59 I: Iterator<Item = &'i ::http::header::HeaderValue>,
60 {
61 ::util::TryFromValues::try_from_values(values).map($type)
62 }
63
64 fn encode<E: Extend<::HeaderValue>>(&self, values: &mut E) {
65 values.extend(::std::iter::once((&self.0).into()));
66 }
67 }
68 };
69}
70
71pub(crate) trait TryFromValues: Sized {
73 fn try_from_values<'i, I>(values: &mut I) -> Result<Self, ::Error>
75 where
76 Self: Sized,
77 I: Iterator<Item = &'i HeaderValue>;
78}
79
80impl TryFromValues for HeaderValue {
81 fn try_from_values<'i, I>(values: &mut I) -> Result<Self, ::Error>
82 where
83 I: Iterator<Item = &'i HeaderValue>,
84 {
85 values.next().cloned().ok_or_else(|| ::Error::invalid())
86 }
87}