zero_bounce/utility/structures/
custom_deserialize.rs1use chrono::{DateTime, FixedOffset, NaiveDateTime, NaiveDate};
2
3use serde::de::Error as SerdeError;
4
5
6pub(crate) fn deserialize_naive_date<'de, D>(
7 deserializer: D,
8) -> Result<NaiveDateTime, D::Error>
9where
10 D: serde::Deserializer<'de>,
11{
12 let string: &str = serde::Deserialize::deserialize(deserializer)?;
13 let format = "%Y-%m-%d %H:%M:%S.%3f";
14 NaiveDateTime::parse_from_str(string, format)
15 .map_err(SerdeError::custom)
16}
17
18
19pub(crate) fn deserialize_only_date<'de, D>(
20 deserializer: D,
21) -> Result<NaiveDate, D::Error>
22where
23 D: serde::Deserializer<'de>,
24{
25 let string: &str = serde::Deserialize::deserialize(deserializer)?;
26 let format = "%m/%d/%Y";
27 NaiveDate::parse_from_str(string, format)
28 .map_err(SerdeError::custom)
29}
30
31pub(crate) fn deserialize_stringified_uint<'de, D>(
32 deserializer: D,
33) -> Result<Option<u128>, D::Error>
34where
35 D: serde::Deserializer<'de>,
36{
37 let optional_string: Option<&str> = serde::Deserialize::deserialize(deserializer)?;
38
39 if optional_string.is_none() {
40 return Ok(None);
41 }
42
43 let value: u128 = optional_string
44 .unwrap()
45 .parse::<u128>()
46 .map_err(SerdeError::custom)?;
47
48 Ok(Some(value))
49}
50
51
52pub(crate) fn deserialize_date_rfc<'de, D>(
53 deserializer: D,
54) -> Result<DateTime<FixedOffset>, D::Error>
55where
56 D: serde::Deserializer<'de>
57{
58 let string: &str = serde::Deserialize::deserialize(deserializer)?;
59 DateTime::parse_from_rfc3339(string).map_err(SerdeError::custom)
60}
61
62pub(crate) fn deserialize_percentage_float<'de, D>(deserializer: D) -> Result<f32, D::Error>
64where
65 D: serde::Deserializer<'de>
66{
67 let string: &str = serde::Deserialize::deserialize(deserializer)?;
68
69 let raw_error = SerdeError::custom("invalid percentage amount");
70 let first_part = string.split('%').next().ok_or(raw_error)?;
71 let amount = first_part
72 .parse::<f32>()
73 .ok()
74 .unwrap_or(-1.);
75
76 Ok(amount)
77}