use std::{fmt::Display, str::FromStr};
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Version {
Http1_0,
#[default]
Http1_1,
}
impl Version {
pub fn as_str(&self) -> &str {
match self {
Version::Http1_0 => "HTTP/1.0",
Version::Http1_1 => "HTTP/1.1",
}
}
}
impl Display for Version {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug)]
pub struct InvalidVersion(String);
impl std::error::Error for InvalidVersion {}
impl Display for InvalidVersion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "invalid http version: {}", self.0)
}
}
impl FromStr for Version {
type Err = InvalidVersion;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
s if s.eq_ignore_ascii_case("HTTP/1.0") => Ok(Version::Http1_0),
s if s.eq_ignore_ascii_case("HTTP/1.1") => Ok(Version::Http1_1),
_ => Err(InvalidVersion(s.to_owned())),
}
}
}