injective_std/serde/
mod.rs1pub 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}