Skip to main content

injective_std/serde/
mod.rs

1pub mod as_str {
2    use serde::{de, Deserialize, Deserializer, Serializer};
3    use std::{fmt::Display, str::FromStr};
4
5    pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
6    where
7        T: FromStr,
8        T::Err: Display,
9        D: Deserializer<'de>,
10    {
11        let s = String::deserialize(deserializer)?;
12        T::from_str(&s).map_err(de::Error::custom)
13    }
14
15    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer,
18        T: Display,
19    {
20        serializer.serialize_str(&value.to_string())
21    }
22}
23
24pub mod enum_i32 {
25    use serde::de::{self, IntoDeserializer, Visitor};
26    use serde::{Deserialize, Deserializer};
27    use std::{fmt, marker::PhantomData};
28
29    pub fn deserialize<'de, E, D>(deserializer: D) -> Result<i32, D::Error>
30    where
31        D: Deserializer<'de>,
32        E: Deserialize<'de> + Into<i32>,
33    {
34        struct EnumVisitor<E>(PhantomData<E>);
35
36        impl<'de, E> Visitor<'de> for EnumVisitor<E>
37        where
38            E: Deserialize<'de> + Into<i32>,
39        {
40            type Value = i32;
41
42            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
43                formatter.write_str("an enum name or integer")
44            }
45
46            fn visit_i64<Err>(self, value: i64) -> Result<i32, Err>
47            where
48                Err: de::Error,
49            {
50                if value < i32::MIN as i64 || value > i32::MAX as i64 {
51                    return Err(Err::custom("enum value out of range for i32"));
52                }
53                Ok(value as i32)
54            }
55
56            fn visit_u64<Err>(self, value: u64) -> Result<i32, Err>
57            where
58                Err: de::Error,
59            {
60                if value > i32::MAX as u64 {
61                    return Err(Err::custom("enum value out of range for i32"));
62                }
63                Ok(value as i32)
64            }
65
66            fn visit_str<Err>(self, value: &str) -> Result<i32, Err>
67            where
68                Err: de::Error,
69            {
70                if let Ok(value) = value.parse::<i32>() {
71                    return Ok(value);
72                }
73                let enum_val: E = Deserialize::deserialize(value.into_deserializer())?;
74                Ok(enum_val.into())
75            }
76
77            fn visit_string<Err>(self, value: String) -> Result<i32, Err>
78            where
79                Err: de::Error,
80            {
81                self.visit_str(&value)
82            }
83        }
84
85        deserializer.deserialize_any(EnumVisitor::<E>(PhantomData))
86    }
87}