safe_http 0.1.0-beta.4

Simple and safe HTTP types.
Documentation
mod iter;

pub use iter::{IntoIter, Iter, IterMut};

use crate::HeaderValue;

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct HeaderValues {
    first: HeaderValue,
    remaining: Vec<HeaderValue>,
}

impl HeaderValues {
    #[inline]
    pub fn new(first: HeaderValue) -> Self {
        Self {
            first,
            remaining: Vec::new(),
        }
    }

    pub fn has_only_one(&self) -> bool {
        self.remaining.is_empty()
    }

    pub fn push(&mut self, v: HeaderValue) {
        self.remaining.push(v);
    }

    pub fn first(&self) -> &HeaderValue {
        &self.first
    }

    pub fn first_mut(&mut self) -> &mut HeaderValue {
        &mut self.first
    }

    pub fn into_first(self) -> HeaderValue {
        self.first
    }

    pub fn iter(&self) -> Iter<'_> {
        Iter {
            first: Some(&self.first),
            remaining: self.remaining.iter(),
        }
    }

    pub fn iter_mut(&mut self) -> IterMut<'_> {
        IterMut {
            first: Some(&mut self.first),
            remaining: self.remaining.iter_mut(),
        }
    }
}

impl From<HeaderValue> for HeaderValues {
    #[inline]
    fn from(v: HeaderValue) -> Self {
        Self::new(v)
    }
}

impl FromIterator<HeaderValue> for Option<HeaderValues> {
    fn from_iter<T: IntoIterator<Item = HeaderValue>>(iter: T) -> Self {
        let mut iter = iter.into_iter();
        let first = iter.next()?;
        let remaining = iter.collect();
        Some(HeaderValues { first, remaining })
    }
}

impl Extend<HeaderValue> for HeaderValues {
    fn extend<T: IntoIterator<Item = HeaderValue>>(&mut self, iter: T) {
        self.remaining.extend(iter)
    }
}

impl IntoIterator for HeaderValues {
    type Item = HeaderValue;

    type IntoIter = IntoIter;

    fn into_iter(self) -> Self::IntoIter {
        IntoIter {
            first: Some(self.first),
            remaining: self.remaining.into_iter(),
        }
    }
}

impl<'r> IntoIterator for &'r HeaderValues {
    type Item = &'r HeaderValue;

    type IntoIter = Iter<'r>;

    fn into_iter(self) -> Self::IntoIter {
        self.iter()
    }
}