libsubconverter/utils/
deserialize.rs

1use serde::de::{self, Deserializer, Visitor};
2use std::fmt;
3
4/// Helper function to deserialize fields that can be either string or number
5pub fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
6where
7    D: Deserializer<'de>,
8{
9    // Define a visitor to handle different types
10    struct StringOrNumberVisitor;
11
12    impl<'de> Visitor<'de> for StringOrNumberVisitor {
13        type Value = Option<String>;
14
15        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
16            formatter.write_str("string or number")
17        }
18
19        // Handle string
20        fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
21        where
22            E: de::Error,
23        {
24            Ok(Some(value.to_string()))
25        }
26
27        // Handle i64
28        fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
29        where
30            E: de::Error,
31        {
32            Ok(Some(value.to_string()))
33        }
34
35        // Handle u64
36        fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
37        where
38            E: de::Error,
39        {
40            Ok(Some(value.to_string()))
41        }
42
43        // Handle f64
44        fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
45        where
46            E: de::Error,
47        {
48            Ok(Some(value.to_string()))
49        }
50
51        // Handle None
52        fn visit_none<E>(self) -> Result<Self::Value, E>
53        where
54            E: de::Error,
55        {
56            Ok(None)
57        }
58
59        // Handle null
60        fn visit_unit<E>(self) -> Result<Self::Value, E>
61        where
62            E: de::Error,
63        {
64            Ok(None)
65        }
66    }
67
68    deserializer.deserialize_any(StringOrNumberVisitor)
69}