safe_http 0.1.0-beta.4

Simple and safe HTTP types.
Documentation
use crate::HeaderValue;
use std::{iter::FusedIterator, slice, vec};

#[derive(Debug, Clone)]
pub struct IntoIter {
    pub(super) first: Option<HeaderValue>,
    pub(super) remaining: vec::IntoIter<HeaderValue>,
}

impl Iterator for IntoIter {
    type Item = HeaderValue;

    fn next(&mut self) -> Option<HeaderValue> {
        self.first.take().or_else(|| self.remaining.next())
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        if self.first.is_some() {
            let length = self.remaining.len() + 1;
            (length, Some(length))
        } else {
            self.remaining.size_hint()
        }
    }
}

impl DoubleEndedIterator for IntoIter {
    fn next_back(&mut self) -> Option<Self::Item> {
        self.remaining.next_back().or_else(|| self.first.take())
    }
}

impl ExactSizeIterator for IntoIter {}

impl FusedIterator for IntoIter {}

#[derive(Debug, Clone)]
pub struct Iter<'r> {
    pub(super) first: Option<&'r HeaderValue>,
    pub(super) remaining: slice::Iter<'r, HeaderValue>,
}

impl<'r> Iterator for Iter<'r> {
    type Item = &'r HeaderValue;

    fn next(&mut self) -> Option<Self::Item> {
        self.first.take().or_else(|| self.remaining.next())
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        if self.first.is_some() {
            let length = self.remaining.len() + 1;
            (length, Some(length))
        } else {
            self.remaining.size_hint()
        }
    }
}

impl DoubleEndedIterator for Iter<'_> {
    fn next_back(&mut self) -> Option<Self::Item> {
        self.remaining.next_back().or_else(|| self.first.take())
    }
}

impl ExactSizeIterator for Iter<'_> {}

impl FusedIterator for Iter<'_> {}

#[derive(Debug)]
pub struct IterMut<'r> {
    pub(super) first: Option<&'r mut HeaderValue>,
    pub(super) remaining: slice::IterMut<'r, HeaderValue>,
}

impl<'r> Iterator for IterMut<'r> {
    type Item = &'r mut HeaderValue;

    fn next(&mut self) -> Option<Self::Item> {
        self.first.take().or_else(|| self.remaining.next())
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        if self.first.is_some() {
            let length = self.remaining.len() + 1;
            (length, Some(length))
        } else {
            self.remaining.size_hint()
        }
    }
}

impl DoubleEndedIterator for IterMut<'_> {
    fn next_back(&mut self) -> Option<Self::Item> {
        self.remaining.next_back().or_else(|| self.first.take())
    }
}

impl ExactSizeIterator for IterMut<'_> {}

impl FusedIterator for IterMut<'_> {}