use std::fmt::Display;
use serde::{Deserialize, Serialize};
use crate::{ErrorKind, Status};
#[derive(Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub enum CacheStatus {
Ok(u16),
Error(Option<u16>),
Excluded,
Unsupported,
}
impl Display for CacheStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Ok(_) => write!(f, "OK (cached)"),
Self::Error(_) => write!(f, "Error (cached)"),
Self::Excluded => write!(f, "Excluded (cached)"),
Self::Unsupported => write!(f, "Unsupported (cached)"),
}
}
}
impl From<&Status> for CacheStatus {
fn from(s: &Status) -> Self {
match s {
Status::Cached(s) => *s,
Status::Ok(code) | Status::UnknownStatusCode(code) => Self::Ok(code.as_u16()),
Status::Excluded => Self::Excluded,
Status::Unsupported(_) => Self::Unsupported,
Status::Redirected(code) => Self::Error(Some(code.as_u16())),
Status::Timeout(code) => Self::Error(code.map(|code| code.as_u16())),
Status::Error(e) => match e {
ErrorKind::NetworkRequest(e)
| ErrorKind::ReadResponseBody(e)
| ErrorKind::BuildRequestClient(e) => match e.status() {
Some(code) => Self::Error(Some(code.as_u16())),
None => Self::Error(None),
},
_ => Self::Error(None),
},
}
}
}