use serde::de::Error;
use serde::{Deserialize, Deserializer, Serialize};
use crate::UtcTime;
impl<'de> Deserialize<'de> for UtcTime {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let (secs, nanos) = <(i64, u32)>::deserialize(deserializer)?;
Self::new(secs, nanos).ok_or_else(|| D::Error::custom("UtcTime out of range"))
}
}
impl Serialize for UtcTime {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let Self { secs, nanos } = *self;
(secs, nanos.get()).serialize(serializer)
}
}
#[cfg(test)]
#[test]
fn minimal_test() {
let value = UtcTime::new(1_659_539_413, 885_457_394).unwrap();
let string = serde_json::to_string(&value).unwrap();
assert_eq!(string, "[1659539413,885457394]");
let value = UtcTime::new(-1_659_539_413, 885_457_394).unwrap();
let string = serde_json::to_string(&value).unwrap();
assert_eq!(string, "[-1659539413,885457394]");
let expected = UtcTime::new(1_659_539_413, 885_457_394).unwrap();
let actual: UtcTime = serde_json::from_str("[1659539413,885457394]").unwrap();
assert_eq!(actual, expected);
let expected = UtcTime::new(-1_659_539_413, 885_457_394).unwrap();
let actual: UtcTime = serde_json::from_str("[-1659539413,885457394]").unwrap();
assert_eq!(actual, expected);
assert!(serde_json::from_str::<UtcTime>("[1659539413,8854573940]").is_err());
}