rama_http_headers/util/
mod.rs1use rama_http_types::HeaderValue;
2
3use crate::Error;
4
5pub(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;
12pub(crate) use self::seconds::Seconds;
15pub(crate) use self::value_string::HeaderValueString;
16
17pub mod csv;
19mod entity;
21mod flat_csv;
22mod fmt;
23mod http_date;
24mod iter;
25mod 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
50pub(crate) trait TryFromValues: Sized {
52 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}