http_serde_ext_ios/
status_code.rs1use 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);