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}