pub mod default_dt_formatter {
use chrono::{DateTime, Utc};
use serde::{self, Deserialize, Deserializer, Serializer};
const FORMAT: &str = "%Y-%m-%d %H:%M:%S";
pub fn serialize<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", date.format(FORMAT));
serializer.serialize_str(&s)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
chrono::NaiveDateTime::parse_from_str(&s, FORMAT)
.map_err(serde::de::Error::custom)
.map(|naive| naive.and_utc())
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::TimeZone;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct TestStruct {
#[serde(with = "super")]
dt: DateTime<Utc>,
}
#[test]
fn test_serialization() {
let dt = Utc.with_ymd_and_hms(2024, 3, 14, 15, 30, 0).unwrap();
let test_struct = TestStruct { dt };
let serialized = serde_json::to_string(&test_struct).unwrap();
assert_eq!(serialized, r#"{"dt":"2024-03-14 15:30:00"}"#);
}
#[test]
fn test_deserialization() {
let json = r#"{"dt":"2024-03-14 15:30:00"}"#;
let deserialized: TestStruct = serde_json::from_str(json).unwrap();
let expected = Utc.with_ymd_and_hms(2024, 3, 14, 15, 30, 0).unwrap();
assert_eq!(deserialized.dt, expected);
}
#[test]
fn test_invalid_format() {
let json = r#"{"dt":"2024-03-14T15:30:00Z"}"#; let result: Result<TestStruct, _> = serde_json::from_str(json);
assert!(result.is_err());
}
#[test]
fn test_invalid_date() {
let json = r#"{"dt":"2024-13-14 15:30:00"}"#; let result: Result<TestStruct, _> = serde_json::from_str(json);
assert!(result.is_err());
}
}
}