#[derive(Debug, Clone)]
pub struct Cookie<'a> {
pub name: &'a str,
pub value: &'a str,
}
impl<'a> Cookie<'a> {
pub fn parse(src: &'a str) -> Result<Self, ParseError> {
let src = src.trim_matches(&[' ', '\t'][..]);
let eq_idx = src.find('=').ok_or(ParseError::NoEquals)?;
let name = &src[0..eq_idx];
let value = &src[(eq_idx + 1)..];
let value = if value.starts_with('"') && value.ends_with('"') {
&value[1..(value.len() - 1)]
} else {
value
};
Ok(Cookie {
name,
value,
})
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, thiserror::Error)]
pub enum ParseError {
#[error("No = in cookie-pair")]
NoEquals,
}
pub fn parse_cookies<'a>(src: &'a str) -> impl std::iter::Iterator<Item = Result<Cookie<'a>, ParseError>> + 'a {
src.split(';').map(Cookie::parse)
}