Skip to main content

cookie_rs/cookie/parse/
error.rs

1use std::error::Error;
2use std::fmt;
3use std::num::ParseIntError;
4
5#[non_exhaustive]
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum ParseError {
8    EmptyName,
9    MissingPair(MissingPair),
10    UnknownAttribute(String),
11    ParseMaxAgeError(ParseIntError),
12    ParseSameSiteError(ParseSameSiteError),
13}
14
15#[derive(Debug, Clone, PartialEq, Eq)]
16pub enum ParseSameSiteError {
17    UnknownValue(String),
18}
19
20#[derive(Debug, Clone, PartialEq, Eq)]
21pub enum MissingPair {
22    NameValue,
23    Domain,
24    Expires,
25    MaxAge,
26    Path,
27    SameSite,
28}
29
30impl Error for ParseError {}
31
32impl Error for ParseSameSiteError {}
33
34impl From<MissingPair> for ParseError {
35    fn from(value: MissingPair) -> Self {
36        Self::MissingPair(value)
37    }
38}
39
40impl From<ParseIntError> for ParseError {
41    fn from(value: ParseIntError) -> Self {
42        Self::ParseMaxAgeError(value)
43    }
44}
45
46impl From<ParseSameSiteError> for ParseError {
47    fn from(value: ParseSameSiteError) -> Self {
48        Self::ParseSameSiteError(value)
49    }
50}
51
52impl fmt::Display for ParseError {
53    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
54        match self {
55            ParseError::EmptyName => write!(f, "the provided name is empty."),
56            ParseError::MissingPair(pair) => write!(f, "missed pair: {pair}"),
57            ParseError::UnknownAttribute(attr) => write!(f, "unknown attribute: {attr}"),
58            ParseError::ParseMaxAgeError(err) => write!(f, "failed to parse Max-Age: {err}"),
59            ParseError::ParseSameSiteError(err) => write!(f, "failed to parse SameSite: {err}"),
60        }
61    }
62}
63
64impl fmt::Display for ParseSameSiteError {
65    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66        match self {
67            ParseSameSiteError::UnknownValue(value) => {
68                write!(f, "unknown SameSite value: {value}")
69            }
70        }
71    }
72}
73
74impl fmt::Display for MissingPair {
75    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76        let pair_name = match self {
77            MissingPair::NameValue => "Name-Value",
78            MissingPair::Domain => "Domain",
79            MissingPair::Expires => "Expires",
80            MissingPair::MaxAge => "Max-Age",
81            MissingPair::Path => "Path",
82            MissingPair::SameSite => "SameSite",
83        };
84        write!(f, "{pair_name}")
85    }
86}