1 use super::NaiveDateTime;
2 use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
3 use std::ops::Deref;
4 
5 impl Encodable for NaiveDateTime {
encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error>6     fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
7         format!("{:?}", self).encode(s)
8     }
9 }
10 
11 impl Decodable for NaiveDateTime {
decode<D: Decoder>(d: &mut D) -> Result<NaiveDateTime, D::Error>12     fn decode<D: Decoder>(d: &mut D) -> Result<NaiveDateTime, D::Error> {
13         d.read_str()?.parse().map_err(|_| d.error("invalid date time string"))
14     }
15 }
16 
17 /// A `DateTime` that can be deserialized from a seconds-based timestamp
18 #[derive(Debug)]
19 #[deprecated(
20     since = "1.4.2",
21     note = "RustcSerialize will be removed before chrono 1.0, use Serde instead"
22 )]
23 pub struct TsSeconds(NaiveDateTime);
24 
25 #[allow(deprecated)]
26 impl From<TsSeconds> for NaiveDateTime {
27     /// Pull the internal NaiveDateTime out
28     #[allow(deprecated)]
from(obj: TsSeconds) -> NaiveDateTime29     fn from(obj: TsSeconds) -> NaiveDateTime {
30         obj.0
31     }
32 }
33 
34 #[allow(deprecated)]
35 impl Deref for TsSeconds {
36     type Target = NaiveDateTime;
37 
38     #[allow(deprecated)]
deref(&self) -> &Self::Target39     fn deref(&self) -> &Self::Target {
40         &self.0
41     }
42 }
43 
44 #[allow(deprecated)]
45 impl Decodable for TsSeconds {
46     #[allow(deprecated)]
decode<D: Decoder>(d: &mut D) -> Result<TsSeconds, D::Error>47     fn decode<D: Decoder>(d: &mut D) -> Result<TsSeconds, D::Error> {
48         Ok(TsSeconds(
49             NaiveDateTime::from_timestamp_opt(d.read_i64()?, 0)
50                 .ok_or_else(|| d.error("invalid timestamp"))?,
51         ))
52     }
53 }
54 
55 #[cfg(test)]
56 mod tests {
57     use crate::naive::datetime::test_encodable_json;
58     use crate::naive::datetime::{test_decodable_json, test_decodable_json_timestamp};
59     use rustc_serialize::json;
60 
61     #[test]
test_encodable()62     fn test_encodable() {
63         test_encodable_json(json::encode);
64     }
65 
66     #[test]
test_decodable()67     fn test_decodable() {
68         test_decodable_json(json::decode);
69     }
70 
71     #[test]
test_decodable_timestamps()72     fn test_decodable_timestamps() {
73         test_decodable_json_timestamp(json::decode);
74     }
75 }
76