leyline-http 0.1.1

HTTP client that mimics browsers on the wire
Documentation
use serde::de::Error as _;
use serde::{Deserialize, Deserializer, Serialize, Serializer};

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) enum FileVersion {
    #[default]
    V1,
}

impl FileVersion {
    const fn number(self) -> u32 {
        match self {
            FileVersion::V1 => 1,
        }
    }

    fn from_number(number: u32) -> Option<Self> {
        match number {
            1 => Some(FileVersion::V1),
            _ => None,
        }
    }
}

impl Serialize for FileVersion {
    fn serialize<S: Serializer>(&self, ser: S) -> std::result::Result<S::Ok, S::Error> {
        ser.serialize_u32(self.number())
    }
}

impl<'de> Deserialize<'de> for FileVersion {
    fn deserialize<D: Deserializer<'de>>(de: D) -> std::result::Result<Self, D::Error> {
        let number = u32::deserialize(de)?;
        FileVersion::from_number(number).ok_or_else(|| {
            D::Error::custom(format!(
                "unsupported file version {number}; this build reads version {}",
                FileVersion::default().number()
            ))
        })
    }
}