http_serde_ext_ios/
status_code.rs

1use std::fmt;
2
3use serde::{de, Deserializer, Serializer};
4
5type Type = http::StatusCode;
6const EXPECT_MESSAGE: &str = "a status code";
7
8pub fn serialize<S: Serializer>(status: &Type, ser: S) -> Result<S::Ok, S::Error> {
9    ser.serialize_u16(status.as_u16())
10}
11
12struct Visitor;
13
14impl<'de> de::Visitor<'de> for Visitor {
15    type Value = Type;
16
17    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
18        formatter.write_str(EXPECT_MESSAGE)
19    }
20
21    fn visit_i32<E: de::Error>(self, val: i32) -> Result<Self::Value, E> {
22        self.visit_u16(val as u16)
23    }
24
25    fn visit_i16<E: de::Error>(self, val: i16) -> Result<Self::Value, E> {
26        self.visit_u16(val as u16)
27    }
28
29    fn visit_u8<E: de::Error>(self, val: u8) -> Result<Self::Value, E> {
30        self.visit_u16(val as u16)
31    }
32
33    fn visit_u32<E: de::Error>(self, val: u32) -> Result<Self::Value, E> {
34        self.visit_u16(val as u16)
35    }
36
37    fn visit_i64<E: de::Error>(self, val: i64) -> Result<Self::Value, E> {
38        self.visit_u16(val as u16)
39    }
40
41    fn visit_u64<E: de::Error>(self, val: u64) -> Result<Self::Value, E> {
42        self.visit_u16(val as u16)
43    }
44
45    fn visit_u16<E: de::Error>(self, val: u16) -> Result<Self::Value, E> {
46        val.try_into().map_err(de::Error::custom)
47    }
48}
49
50pub fn deserialize<'de, D>(de: D) -> Result<Type, D::Error>
51where
52    D: Deserializer<'de>,
53{
54    de.deserialize_u16(Visitor)
55}
56
57derive_extension_types!(super::Type);
58derive_hash_types!(super::Type);
59derive_ord_types!(super::Type);