pub mod option;
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
use crate::FileTime;
#[allow(clippy::missing_errors_doc)]
#[inline]
pub fn serialize<S: Serializer>(ft: &FileTime, serializer: S) -> Result<S::Ok, S::Error> {
ft.to_unix_time_nanos().serialize(serializer)
}
#[allow(clippy::missing_errors_doc)]
#[inline]
pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<FileTime, D::Error> {
FileTime::from_unix_time_nanos(<_>::deserialize(deserializer)?).map_err(D::Error::custom)
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
struct Test {
#[serde(with = "crate::serde_with::unix_time::nanoseconds")]
time: FileTime,
}
#[test]
fn serialize_json() {
assert_eq!(
serde_json::to_string(&Test {
time: FileTime::NT_TIME_EPOCH
})
.unwrap(),
r#"{"time":-11644473600000000000}"#
);
assert_eq!(
serde_json::to_string(&Test {
time: FileTime::UNIX_EPOCH
})
.unwrap(),
r#"{"time":0}"#
);
assert_eq!(
serde_json::to_string(&Test {
time: FileTime::MAX
})
.unwrap(),
r#"{"time":1833029933770955161500}"#
);
}
#[test]
fn deserialize_json() {
assert_eq!(
serde_json::from_str::<Test>(r#"{"time":-11644473600000000000}"#).unwrap(),
Test {
time: FileTime::NT_TIME_EPOCH
}
);
assert_eq!(
serde_json::from_str::<Test>(r#"{"time":0}"#).unwrap(),
Test {
time: FileTime::UNIX_EPOCH
}
);
assert_eq!(
serde_json::from_str::<Test>(r#"{"time":1833029933770955161500}"#).unwrap(),
Test {
time: FileTime::MAX
}
);
}
}