parse_sap_atom_feed/deserializers/edm_datetime/
mod.rs

1use chrono::NaiveDateTime;
2use serde::{
3    de::{self, Visitor},
4    Deserialize, Deserializer,
5};
6use std::{fmt, str::FromStr};
7
8// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9/// Deserialize Edm.DateTime to chrono::NaiveDateTime
10#[allow(dead_code)]
11struct NaiveDateTimeVisitor;
12
13impl<'de> Visitor<'de> for NaiveDateTimeVisitor {
14    type Value = NaiveDateTime;
15
16    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
17        formatter.write_str("an XML tag a date time formatted either as <d:DeliveryDate>2018-01-07T23:00:00.0000000</d:DeliveryDate> or <d:DateOfBirth m:null=\"true\"/>")
18    }
19
20    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
21    where
22        E: de::Error,
23    {
24        match NaiveDateTime::from_str(&value) {
25            Ok(ndt) => Ok(ndt),
26            Err(err) => Err(de::Error::custom(err.to_string())),
27        }
28    }
29}
30
31// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32pub fn to_naive_date_time_opt<'de, D>(deserializer: D) -> Result<Option<NaiveDateTime>, D::Error>
33where
34    D: Deserializer<'de>,
35{
36    Ok(NaiveDateTime::deserialize(deserializer).ok())
37}
38
39// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
40pub fn to_naive_date_time<'de, D>(deserializer: D) -> Result<NaiveDateTime, D::Error>
41where
42    D: Deserializer<'de>,
43{
44    NaiveDateTime::deserialize(deserializer)
45}
46
47// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
48#[cfg(test)]
49pub mod unit_tests;