use std::str::FromStr;
use headers::Header;
use vec1::Vec1;
use crate::field::rules::flat_csv::{Comma, FlatCsv};
mod element;
pub use element::*;
#[derive(Debug, Clone)]
pub struct Forwarded {
pub elements: Vec1<ForwardedElement>,
}
impl Header for Forwarded {
#[inline]
fn name() -> &'static headers::HeaderName {
&http::header::FORWARDED
}
fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
where
Self: Sized,
I: Iterator<Item = &'i headers::HeaderValue>,
{
let elements = values
.flat_map(|value| FlatCsv::<Comma>::from(value).iter())
.map(ForwardedElement::from_str)
.collect::<Result<Vec<ForwardedElement>, _>>()
.map_err(|_| headers::Error::invalid())?;
Ok(Self {
elements: elements.try_into().map_err(|_| headers::Error::invalid())?,
})
}
#[inline]
fn encode<E: Extend<headers::HeaderValue>>(&self, values: &mut E) {
values.extend(self.elements.iter().map(|e| e.into()));
}
}