Skip to content

Commit c8defc7

Browse files
authored
impl serde::Serialize and serde::Deserialize for TimeDelta (#1599)
1 parent 081c648 commit c8defc7

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

src/time_delta.rs

+41
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,47 @@ impl arbitrary::Arbitrary<'_> for TimeDelta {
638638
}
639639
}
640640

641+
#[cfg(feature = "serde")]
642+
mod serde {
643+
use super::TimeDelta;
644+
use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
645+
646+
impl Serialize for TimeDelta {
647+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
648+
<(i64, i32) as Serialize>::serialize(&(self.secs, self.nanos), serializer)
649+
}
650+
}
651+
652+
impl<'de> Deserialize<'de> for TimeDelta {
653+
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
654+
let (secs, nanos) = <(i64, i32) as Deserialize>::deserialize(deserializer)?;
655+
TimeDelta::new(secs, nanos as u32).ok_or(Error::custom("TimeDelta out of bounds"))
656+
}
657+
}
658+
659+
#[cfg(test)]
660+
mod tests {
661+
use super::{super::MAX, TimeDelta};
662+
663+
#[test]
664+
fn test_serde() {
665+
let duration = TimeDelta::new(123, 456).unwrap();
666+
assert_eq!(
667+
serde_json::from_value::<TimeDelta>(serde_json::to_value(duration).unwrap())
668+
.unwrap(),
669+
duration
670+
);
671+
}
672+
673+
#[test]
674+
#[should_panic(expected = "TimeDelta out of bounds")]
675+
fn test_serde_oob_panic() {
676+
let _ =
677+
serde_json::from_value::<TimeDelta>(serde_json::json!([MAX.secs + 1, 0])).unwrap();
678+
}
679+
}
680+
}
681+
641682
#[cfg(test)]
642683
mod tests {
643684
use super::OutOfRangeError;

0 commit comments

Comments
 (0)