diff --git a/prost-types/src/lib.rs b/prost-types/src/lib.rs index 81fcd9670..f92947fb1 100644 --- a/prost-types/src/lib.rs +++ b/prost-types/src/lib.rs @@ -395,6 +395,16 @@ impl std::hash::Hash for Timestamp { } } +#[cfg(feature = "std")] +impl Ord for Timestamp { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + match self.seconds.cmp(&other.seconds) { + std::cmp::Ordering::Equal => self.nanos.cmp(&other.nanos), + ordering => ordering, + } + } +} + #[cfg(feature = "std")] impl From for Timestamp { fn from(system_time: std::time::SystemTime) -> Timestamp { @@ -907,4 +917,38 @@ mod tests { // Must contain at least one "/" character. assert_eq!(TypeUrl::new("google.protobuf.Duration"), None); } + + #[test] + fn check_timestamp_ord() { + let earlier_timestamp = Timestamp { + seconds: 10, + nanos: 500, + }; + let later_timestamp = Timestamp { + seconds: 10, + nanos: 700, + }; + let equal_timestamp = Timestamp { + seconds: 10, + nanos: 500, + }; + + assert!(earlier_timestamp < later_timestamp); + assert!(earlier_timestamp <= later_timestamp); + assert!(later_timestamp > earlier_timestamp); + assert!(later_timestamp >= earlier_timestamp); + + assert_eq!( + earlier_timestamp.cmp(&later_timestamp), + std::cmp::Ordering::Less + ); + assert_eq!( + later_timestamp.cmp(&earlier_timestamp), + std::cmp::Ordering::Greater + ); + assert_eq!( + equal_timestamp.cmp(&earlier_timestamp), + std::cmp::Ordering::Equal + ); + } } diff --git a/prost-types/src/protobuf.rs b/prost-types/src/protobuf.rs index edc1361be..34caa44c9 100644 --- a/prost-types/src/protobuf.rs +++ b/prost-types/src/protobuf.rs @@ -2293,7 +2293,7 @@ impl NullValue { /// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use /// the Joda Time's [`ISODateTimeFormat.dateTime()`]() to obtain a formatter capable of generating timestamps in this format. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, PartialOrd,::prost::Message)] pub struct Timestamp { /// Represents seconds of UTC time since Unix epoch /// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to