zero_formatter/
time.rs

1use error::*;
2use formatter::*;
3
4use std::io::Seek;
5use byteorder::{ReadBytesExt, WriteBytesExt};
6use chrono::{UTC, DateTime, TimeZone};
7use std::time::Duration;
8
9impl<R> Formatter<DateTime<UTC>> for R where R: Seek + ReadBytesExt + WriteBytesExt {
10
11    fn serialize(&mut self, offset: u64, value: DateTime<UTC>) -> ZeroFormatterResult<i32> {
12        let seconds = try!(self.serialize(offset, value.timestamp()));
13        let nanos = try!(self.serialize(offset + 8, value.timestamp_subsec_nanos() as i32));
14        Ok(seconds + nanos)
15    }
16
17    fn deserialize(&mut self, offset: &mut u64) -> ZeroFormatterResult<DateTime<UTC>> {
18        let seconds: i64 = try!(self.deserialize(offset));
19        let nanos: i32 = try!(self.deserialize(offset));
20        Ok(UTC.timestamp(seconds, nanos as u32))
21    }
22}
23
24impl<R> Formatter<Duration> for R where R: Seek + ReadBytesExt + WriteBytesExt {
25
26    fn serialize(&mut self, offset: u64, value: Duration) -> ZeroFormatterResult<i32> {
27        let seconds = try!(self.serialize(offset, value.as_secs() as i64));
28        let nanos = try!(self.serialize(offset + 8, value.subsec_nanos() as i32));
29        Ok(seconds + nanos)
30    }
31
32    fn deserialize(&mut self, offset: &mut u64) -> ZeroFormatterResult<Duration> {
33        let seconds: i64 = try!(self.deserialize(offset));
34        let nanos: i32 = try!(self.deserialize(offset));
35        Ok(Duration::new(seconds as u64, nanos as u32))
36    }
37}
38
39#[cfg(test)]
40mod tests {
41
42    use std::io::Cursor;
43    use chrono::UTC;
44    use formatter::*;
45    use std::time::Duration;
46
47    #[test]
48    fn serialize_deserialize_datetime_utc() {
49        let dt = UTC::now();
50        let mut wtr = Cursor::new(Vec::new());
51        assert_eq!(wtr.serialize(0, dt).unwrap(), 12);
52        let mut offset = 0;
53        assert_eq!(dt, wtr.deserialize(&mut offset).unwrap());
54    }
55
56    #[test]
57    fn serialize_duration() {
58        let mut wtr = Cursor::new(Vec::new());
59        assert_eq!(wtr.serialize(0, Duration::new(1, 2)).unwrap(), 12);
60        assert_eq!(wtr.into_inner(), vec![1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0]);
61    }
62
63    #[test]
64    fn deserialize_duration() {
65        let mut rdr = Cursor::new(vec![1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0]);
66        let mut offset = 0;
67        assert_eq!(Duration::new(1, 2), rdr.deserialize(&mut offset).unwrap());
68    }
69}