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