rama_http_headers/util/
mod.rs

1use rama_http_types::HeaderValue;
2
3use crate::Error;
4
5//pub use self::charset::Charset;
6//pub use self::encoding::Encoding;
7pub(crate) use self::entity::{EntityTag, EntityTagRange};
8pub(crate) use self::flat_csv::{FlatCsv, SemiColon};
9pub(crate) use self::fmt::fmt;
10pub(crate) use self::http_date::HttpDate;
11pub(crate) use self::iter::IterExt;
12//pub use language_tags::LanguageTag;
13//pub use self::quality_value::{Quality, QualityValue};
14pub(crate) use self::seconds::Seconds;
15pub(crate) use self::value_string::HeaderValueString;
16
17//mod charset;
18pub mod csv;
19//mod encoding;
20mod entity;
21mod flat_csv;
22mod fmt;
23mod http_date;
24mod iter;
25//mod quality_value;
26mod seconds;
27mod value_string;
28
29macro_rules! derive_header {
30    ($type:ident(_), name: $name:ident) => {
31        impl crate::Header for $type {
32            fn name() -> &'static ::rama_http_types::header::HeaderName {
33                &::rama_http_types::header::$name
34            }
35
36            fn decode<'i, I>(values: &mut I) -> Result<Self, crate::Error>
37            where
38                I: Iterator<Item = &'i ::rama_http_types::header::HeaderValue>,
39            {
40                crate::util::TryFromValues::try_from_values(values).map($type)
41            }
42
43            fn encode<E: Extend<::rama_http_types::HeaderValue>>(&self, values: &mut E) {
44                values.extend(::std::iter::once((&self.0).into()));
45            }
46        }
47    };
48}
49
50/// A helper trait for use when deriving `Header`.
51pub(crate) trait TryFromValues: Sized {
52    /// Try to convert from the values into an instance of `Self`.
53    fn try_from_values<'i, I>(values: &mut I) -> Result<Self, Error>
54    where
55        Self: Sized,
56        I: Iterator<Item = &'i HeaderValue>;
57}
58
59impl TryFromValues for HeaderValue {
60    fn try_from_values<'i, I>(values: &mut I) -> Result<Self, Error>
61    where
62        I: Iterator<Item = &'i HeaderValue>,
63    {
64        values.next().cloned().ok_or_else(Error::invalid)
65    }
66}