re-add TsSeconds for RustcDecodable
I think it's a terrible API, but AFAIK rustc-serialize doesn't support anything like serde's `with` attribute. I think it would be better to just not include this API at all and require that people who want to use this move to serde, which is the recommended rust encoding/decoding library.
This commit is contained in:
parent
44fc13d7df
commit
4e7b84064f
|
@ -477,6 +477,35 @@ fn test_decodable_json<FUTC, FFixed, FLocal, E>(utc_from_str: FUTC,
|
|||
assert!(fixed_from_str(r#""2014-07-32T12:34:06Z""#).is_err());
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "rustc-serialize"))]
|
||||
fn test_decodable_json_timestamps<FUTC, FFixed, FLocal, E>(utc_from_str: FUTC,
|
||||
fixed_from_str: FFixed,
|
||||
local_from_str: FLocal)
|
||||
where FUTC: Fn(&str) -> Result<TsSeconds<UTC>, E>,
|
||||
FFixed: Fn(&str) -> Result<TsSeconds<FixedOffset>, E>,
|
||||
FLocal: Fn(&str) -> Result<TsSeconds<Local>, E>,
|
||||
E: ::std::fmt::Debug
|
||||
{
|
||||
fn norm<Tz: TimeZone>(dt: &Option<DateTime<Tz>>) -> Option<(&DateTime<Tz>, &Tz::Offset)> {
|
||||
dt.as_ref().map(|dt| (dt, dt.offset()))
|
||||
}
|
||||
|
||||
assert_eq!(norm(&utc_from_str("0").ok().map(DateTime::from)),
|
||||
norm(&Some(UTC.ymd(1970, 1, 1).and_hms(0, 0, 0))));
|
||||
assert_eq!(norm(&utc_from_str("-1").ok().map(DateTime::from)),
|
||||
norm(&Some(UTC.ymd(1969, 12, 31).and_hms(23, 59, 59))));
|
||||
|
||||
assert_eq!(norm(&fixed_from_str("0").ok().map(DateTime::from)),
|
||||
norm(&Some(FixedOffset::east(0).ymd(1970, 1, 1).and_hms(0, 0, 0))));
|
||||
assert_eq!(norm(&fixed_from_str("-1").ok().map(DateTime::from)),
|
||||
norm(&Some(FixedOffset::east(0).ymd(1969, 12, 31).and_hms(23, 59, 59))));
|
||||
|
||||
assert_eq!(*fixed_from_str("0").expect("0 timestamp should parse"),
|
||||
UTC.ymd(1970, 1, 1).and_hms(0, 0, 0));
|
||||
assert_eq!(*local_from_str("-1").expect("-1 timestamp should parse"),
|
||||
UTC.ymd(1969, 12, 31).and_hms(23, 59, 59));
|
||||
}
|
||||
|
||||
#[cfg(feature = "rustc-serialize")]
|
||||
mod rustc_serialize {
|
||||
use std::fmt;
|
||||
|
@ -565,6 +594,11 @@ mod rustc_serialize {
|
|||
super::test_decodable_json(json::decode, json::decode, json::decode);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decodable_timestamps() {
|
||||
super::test_decodable_json_timestamps(json::decode, json::decode, json::decode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Ser/de helpers
|
||||
|
|
|
@ -1443,6 +1443,23 @@ fn test_decodable_json<F, E>(from_str: F)
|
|||
assert!(from_str(r#"null"#).is_err());
|
||||
}
|
||||
|
||||
|
||||
#[cfg(all(test, feature = "rustc-serialize"))]
|
||||
fn test_decodable_json_timestamp<F, E>(from_str: F)
|
||||
where F: Fn(&str) -> Result<TsSeconds, E>, E: ::std::fmt::Debug
|
||||
{
|
||||
assert_eq!(
|
||||
*from_str("0").unwrap(),
|
||||
NaiveDate::from_ymd(1970, 1, 1).and_hms(0, 0, 0),
|
||||
"should parse integers as timestamps"
|
||||
);
|
||||
assert_eq!(
|
||||
*from_str("-1").unwrap(),
|
||||
NaiveDate::from_ymd(1969, 12, 31).and_hms(23, 59, 59),
|
||||
"should parse integers as timestamps"
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(feature = "rustc-serialize")]
|
||||
mod rustc_serialize {
|
||||
use super::{NaiveDateTime, TsSeconds};
|
||||
|
@ -1480,6 +1497,12 @@ mod rustc_serialize {
|
|||
super::test_decodable_json(json::decode);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decodable_timestamps() {
|
||||
super::test_decodable_json_timestamp(json::decode);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Tools to help serializing/deserializing NaiveDateTimes
|
||||
|
|
Loading…
Reference in New Issue