1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 {
        formatter.write_str(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);