use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub struct ParseError {
pub line: usize,
pub kind: ParseErrorKind,
}
#[derive(Debug)]
pub enum ParseErrorKind {
Io(std::io::Error),
MissingFields { found: usize },
InvalidExpires,
InvalidOctets,
}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "line {}: {}", self.line, self.kind)
}
}
impl fmt::Display for ParseErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Io(error) => write!(f, "read error: {error}"),
Self::MissingFields { found } => {
write!(f, "expected 7 tab-separated fields, found {found}")
}
Self::InvalidExpires => f.write_str("invalid expires timestamp"),
Self::InvalidOctets => f.write_str("cookie name or value contains control octets"),
}
}
}
impl Error for ParseError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match &self.kind {
ParseErrorKind::Io(error) => Some(error),
_ => None,
}
}
}