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}