aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdward Barnard2018-10-06 20:21:53 +0100
committerEdward Barnard2018-10-06 20:21:53 +0100
commit205c980cf0c75c6b8267491ade1e45cb2e91a61d (patch)
tree954e2a422072792834f992c307462d8d767f4153
parent68f412c2bd440733226e5a463c542323000454e4 (diff)
downloadrust-plist-205c980cf0c75c6b8267491ade1e45cb2e91a61d.tar.bz2
Manually implement Hash for Date to keep minimum supported Rust version at 1.18.0.
-rw-r--r--src/date.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/date.rs b/src/date.rs
index 5394ada..89b3118 100644
--- a/src/date.rs
+++ b/src/date.rs
@@ -1,10 +1,11 @@
use humantime;
use std::fmt;
+use std::hash::{Hash, Hasher};
use std::result::Result as StdResult;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
/// A UTC timestamp. Used for serialization to and from the plist date type.
-#[derive(Clone, Copy, Hash, PartialEq)]
+#[derive(Clone, Copy, PartialEq)]
pub struct Date {
inner: SystemTime,
}
@@ -54,6 +55,23 @@ impl fmt::Debug for Date {
}
}
+// TODO: Remove manual impl once minimum Rust version reaches 1.24.0.
+impl Hash for Date {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ let elapsed = match self.inner.duration_since(UNIX_EPOCH) {
+ Ok(elapsed) => {
+ false.hash(state);
+ elapsed
+ }
+ Err(err) => {
+ true.hash(state);
+ err.duration()
+ }
+ };
+ elapsed.hash(state)
+ }
+}
+
impl From<SystemTime> for Date {
fn from(date: SystemTime) -> Self {
Date { inner: date }