use rama_http_types::{HeaderName, HeaderValue};
use std::error;
use std::fmt::{self, Display, Formatter};
pub trait Header {
fn name() -> &'static HeaderName;
fn decode<'i, I>(values: &mut I) -> Result<Self, Error>
where
Self: Sized,
I: Iterator<Item = &'i HeaderValue>;
fn encode<E: Extend<HeaderValue>>(&self, values: &mut E);
fn encode_to_value(&self) -> HeaderValue {
let mut container = ExtendOnce(None);
self.encode(&mut container);
container.0.unwrap()
}
}
struct ExtendOnce(Option<HeaderValue>);
impl Extend<HeaderValue> for ExtendOnce {
fn extend<T: IntoIterator<Item = HeaderValue>>(&mut self, iter: T) {
self.0 = iter.into_iter().next();
}
}
#[derive(Debug)]
pub struct Error {
kind: Kind,
}
#[derive(Debug)]
enum Kind {
Invalid,
}
impl Error {
pub fn invalid() -> Error {
Error {
kind: Kind::Invalid,
}
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match &self.kind {
Kind::Invalid => f.write_str("invalid HTTP header"),
}
}
}
impl error::Error for Error {}