libsubconverter/utils/
deserialize.rs1use serde::de::{self, Deserializer, Visitor};
2use std::fmt;
3
4pub fn deserialize_string_or_number<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
6where
7 D: Deserializer<'de>,
8{
9 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 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 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 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 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 fn visit_none<E>(self) -> Result<Self::Value, E>
53 where
54 E: de::Error,
55 {
56 Ok(None)
57 }
58
59 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}