ginger/
lib.rs

1#[derive(Debug, Clone)]
2pub struct Cookie<'a> {
3    pub name: &'a str,
4    pub value: &'a str,
5}
6
7impl<'a> Cookie<'a> {
8    pub fn parse(src: &'a str) -> Result<Self, ParseError> {
9        let src = src.trim_matches(&[' ', '\t'][..]);
10        let eq_idx = src.find('=').ok_or(ParseError::NoEquals)?;
11
12        let name = &src[0..eq_idx];
13
14        let value = &src[(eq_idx + 1)..];
15        let value = if value.starts_with('"') && value.ends_with('"') {
16            &value[1..(value.len() - 1)]
17        } else {
18            value
19        };
20
21        Ok(Cookie {
22            name,
23            value,
24        })
25    }
26}
27
28#[derive(Debug, PartialEq, Eq, Clone, Copy, thiserror::Error)]
29pub enum ParseError {
30    #[error("No = in cookie-pair")]
31    NoEquals,
32}
33
34pub fn parse_cookies<'a>(src: &'a str) -> impl std::iter::Iterator<Item = Result<Cookie<'a>, ParseError>> + 'a {
35    src.split(';').map(Cookie::parse)
36}