#[cfg(feature = "chrono")]
pub type Timestamp = chrono::DateTime<chrono::Utc>;
#[cfg(not(feature = "chrono"))]
pub type Timestamp = i64;
#[cfg(feature = "chrono")]
pub mod seconds {
pub use chrono::serde::ts_seconds::{deserialize, serialize};
}
#[cfg(feature = "chrono")]
pub mod optional_seconds {
pub use chrono::serde::ts_seconds_option::{deserialize, serialize};
}
#[cfg(all(test, feature = "chrono"))]
mod tests {
use serde::{Deserialize, Serialize};
use super::Timestamp;
#[derive(Debug, Deserialize, PartialEq, Serialize)]
struct TimestampFixture {
#[serde(with = "crate::model::timestamp::seconds")]
required: Timestamp,
#[serde(with = "crate::model::timestamp::optional_seconds")]
optional: Option<Timestamp>,
}
#[test]
fn deserializes_unix_seconds_as_chrono_timestamps() {
let fixture: TimestampFixture =
serde_json::from_str(r#"{"required":1700000000,"optional":null}"#)
.unwrap();
assert_eq!(fixture.required.timestamp(), 1_700_000_000);
assert_eq!(fixture.optional, None);
}
#[test]
fn serializes_chrono_timestamps_as_unix_seconds() {
let fixture: TimestampFixture = serde_json::from_str(
r#"{"required":1700000000,"optional":1700000001}"#,
)
.unwrap();
assert_eq!(
serde_json::to_string(&fixture).unwrap(),
r#"{"required":1700000000,"optional":1700000001}"#
);
}
}