Skip to main content

a3s_boot/http/
request_cookie.rs

1use super::header::parse_cookie_header_values;
2use super::request::{parse_optional_value, parse_required_value, parse_value, BootRequest};
3use crate::{BootError, Result};
4use std::collections::BTreeMap;
5use std::fmt;
6use std::str::FromStr;
7
8impl BootRequest {
9    pub fn cookie_pairs(&self) -> Result<Vec<(String, String)>> {
10        parse_cookie_header_values(&self.header_values("cookie"))
11    }
12
13    pub fn cookie(&self, name: &str) -> Result<Option<String>> {
14        Ok(self
15            .cookie_pairs()?
16            .into_iter()
17            .find_map(|(key, value)| (key == name).then_some(value)))
18    }
19
20    pub fn require_cookie(&self, name: &str) -> Result<String> {
21        self.cookie(name)?
22            .ok_or_else(|| BootError::Unauthorized(format!("missing cookie: {name}")))
23    }
24
25    pub fn cookie_as<T>(&self, name: &str) -> Result<T>
26    where
27        T: FromStr,
28        T::Err: fmt::Display,
29    {
30        parse_required_value(self.cookie(name)?, "cookie", name)
31    }
32
33    pub fn optional_cookie_as<T>(&self, name: &str) -> Result<Option<T>>
34    where
35        T: FromStr,
36        T::Err: fmt::Display,
37    {
38        parse_optional_value(self.cookie(name)?, "cookie", name)
39    }
40
41    pub fn cookie_values(&self, name: &str) -> Result<Vec<String>> {
42        Ok(self
43            .cookie_pairs()?
44            .into_iter()
45            .filter_map(|(key, value)| (key == name).then_some(value))
46            .collect())
47    }
48
49    pub fn cookie_values_as<T>(&self, name: &str) -> Result<Vec<T>>
50    where
51        T: FromStr,
52        T::Err: fmt::Display,
53    {
54        self.cookie_values(name)?
55            .into_iter()
56            .map(|value| parse_value(value, "cookie", name))
57            .collect()
58    }
59
60    pub fn cookies(&self) -> Result<BTreeMap<String, String>> {
61        let mut cookies = BTreeMap::new();
62        for (name, value) in self.cookie_pairs()? {
63            cookies.entry(name).or_insert(value);
64        }
65        Ok(cookies)
66    }
67}