Skip to main content

zero_bounce/utility/structures/
custom_deserialize.rs

1use 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
62// Expecting a
63pub(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}