a3s_boot/http/
request_cookie.rs1use 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}