use std::error::Error; use serde::{Deserialize, Serialize}; use serde_test::Configure; use time::macros::{date, datetime, time}; use time::{Date, Duration, Month, OffsetDateTime, PrimitiveDateTime, Time, Weekday}; enum Format { Compact, Readable, } use Format::*; fn serialize(val: T) -> Result> { let mut buf: Vec = Vec::new(); let mut ser = serde_json::Serializer::new(&mut buf); val.serialize(&mut ser)?; let str = String::from_utf8(buf)?; Ok(str) } fn deserialize<'a, T: Deserialize<'a>>(from: &'a str, fmt: Format) -> serde_json::Result { let mut de = serde_json::Deserializer::from_str(from); match fmt { Compact => T::deserialize((&mut de).compact()), Readable => T::deserialize((&mut de).readable()), } } #[test] fn weekday_json() -> Result<(), Box> { use Weekday::*; assert_eq!(serialize(Monday.compact())?, "1"); assert_eq!(deserialize::("1", Compact)?, Monday); assert_eq!(serialize(Monday.readable())?, "\"Monday\""); assert_eq!(deserialize::("\"Monday\"", Readable)?, Monday); assert_eq!(deserialize::("1", Readable)?, Monday); Ok(()) } #[test] fn month_json() -> Result<(), Box> { use Month::*; assert_eq!(serialize(March.compact())?, "3"); assert_eq!(deserialize::("3", Compact)?, March); assert_eq!(serialize(March.readable())?, "\"March\""); assert_eq!(deserialize::("\"March\"", Readable)?, March); assert_eq!(deserialize::("3", Readable)?, March); Ok(()) } #[test] fn time_json() -> Result<(), Box> { let time = time!(12:40:20); assert_eq!(serialize(time.compact())?, "[12,40,20,0]"); assert_eq!(deserialize::