http-serde-ext 0.1.0

serde support for http crate types Request, Response, Uri, StatusCode, HeaderMap
Documentation
use std::fmt;

use serde::{de, Deserializer, Serializer};

type Type = http::StatusCode;
const EXPECT_MESSAGE: &str = "a status code";

pub fn serialize<S: Serializer>(status: &Type, ser: S) -> Result<S::Ok, S::Error> {
    ser.serialize_u16(status.as_u16())
}

struct Visitor;

impl<'de> de::Visitor<'de> for Visitor {
    type Value = Type;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(formatter, "{EXPECT_MESSAGE}")
    }

    fn visit_i32<E: de::Error>(self, val: i32) -> Result<Self::Value, E> {
        self.visit_u16(val as u16)
    }

    fn visit_i16<E: de::Error>(self, val: i16) -> Result<Self::Value, E> {
        self.visit_u16(val as u16)
    }

    fn visit_u8<E: de::Error>(self, val: u8) -> Result<Self::Value, E> {
        self.visit_u16(val as u16)
    }

    fn visit_u32<E: de::Error>(self, val: u32) -> Result<Self::Value, E> {
        self.visit_u16(val as u16)
    }

    fn visit_i64<E: de::Error>(self, val: i64) -> Result<Self::Value, E> {
        self.visit_u16(val as u16)
    }

    fn visit_u64<E: de::Error>(self, val: u64) -> Result<Self::Value, E> {
        self.visit_u16(val as u16)
    }

    fn visit_u16<E: de::Error>(self, val: u16) -> Result<Self::Value, E> {
        val.try_into().map_err(de::Error::custom)
    }
}

pub fn deserialize<'de, D>(de: D) -> Result<Type, D::Error>
where
    D: Deserializer<'de>,
{
    de.deserialize_u16(Visitor)
}

derive_extension_types!(super::Type);