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<T: Serialize>(val: T) -> Result<String, Box <dyn Error>> {
let mut buf: Vec<u8> = 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<T> {
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 <dyn Error>> {
use Weekday::*;
assert_eq!(serialize(Monday.compact())?, "1" );
assert_eq!(deserialize::<Weekday>("1" , Compact)?, Monday);
assert_eq!(serialize(Monday.readable())?, "\" Monday\"" );
assert_eq!(deserialize::<Weekday>("\" Monday\"" , Readable)?, Monday);
assert_eq!(deserialize::<Weekday>("1" , Readable)?, Monday);
Ok(())
}
#[ test]
fn month_json() -> Result<(), Box <dyn Error>> {
use Month::*;
assert_eq!(serialize(March.compact())?, "3" );
assert_eq!(deserialize::<Month>("3" , Compact)?, March);
assert_eq!(serialize(March.readable())?, "\" March\"" );
assert_eq!(deserialize::<Month>("\" March\"" , Readable)?, March);
assert_eq!(deserialize::<Month>("3" , Readable)?, March);
Ok(())
}
#[ test]
fn time_json() -> Result<(), Box <dyn Error>> {
let time = time!(12 :40 :20 );
assert_eq!(serialize(time.compact())?, "[12,40,20,0]" );
assert_eq!(deserialize::<Time>("[12,40,20,0]" , Compact)?, time);
assert_eq!(serialize(time.readable())?, "\" 12 :40 :20 .0 \"" );
assert_eq!(deserialize::<Time>("\" 12 :40 :20 .0 \"" , Readable)?, time);
assert_eq!(deserialize::<Time>("[12,40,20,0]" , Readable)?, time);
Ok(())
}
#[ test]
fn primitive_datetime_json() -> Result<(), Box <dyn Error>> {
let dt = datetime!(2022 -05 -20 12 :40 :20 );
assert_eq!(serialize(dt.compact())?, "[2022,140,12,40,20,0]" );
assert_eq!(
deserialize::<PrimitiveDateTime>("[2022,140,12,40,20,0]" , Compact)?,
dt
);
assert_eq!(serialize(dt.readable())?, "\" 2022 -05 -20 12 :40 :20 .0 \"" );
assert_eq!(
deserialize::<PrimitiveDateTime>("\" 2022 -05 -20 12 :40 :20 .0 \"" , Readable)?,
dt
);
assert_eq!(
deserialize::<PrimitiveDateTime>("[2022,140,12,40,20,0]" , Readable)?,
dt
);
Ok(())
}
#[ test]
fn offset_datetime_json() -> Result<(), Box <dyn Error>> {
let dt = datetime!(2022 -05 -20 12 :40 :20 ).assume_utc();
assert_eq!(serialize(dt.compact())?, "[2022,140,12,40,20,0,0,0,0]" );
assert_eq!(
deserialize::<OffsetDateTime>("[2022,140,12,40,20,0,0,0,0]" , Compact)?,
dt
);
assert_eq!(
serialize(dt.readable())?,
"\" 2022 -05 -20 12 :40 :20 .0 +00 :00 :00 \""
);
assert_eq!(
deserialize::<OffsetDateTime>("\" 2022 -05 -20 12 :40 :20 .0 +00 :00 :00 \"" , Readable)?,
dt
);
assert_eq!(
deserialize::<OffsetDateTime>("[2022,140,12,40,20,0,0,0,0]" , Readable)?,
dt
);
Ok(())
}
#[ test]
fn duration_json() -> Result<(), Box <dyn Error>> {
let dur = Duration::new(50 , 0 );
assert_eq!(serialize(dur.compact())?, "[50,0]" );
assert_eq!(deserialize::<Duration>("[50,0]" , Compact)?, dur);
assert_eq!(serialize(dur.readable())?, "\" 50 .000000000 \"" );
assert_eq!(deserialize::<Duration>("\" 50 .000000000 \"" , Readable)?, dur);
assert_eq!(deserialize::<Duration>("[50,0]" , Readable)?, dur);
Ok(())
}
#[ test]
fn date_json() -> Result<(), Box <dyn Error>> {
let date = date!(2022 -04 -05 );
assert_eq!(serialize(date.compact())?, "[2022,95]" );
assert_eq!(deserialize::<Date>("[2022,95]" , Compact)?, date);
assert_eq!(serialize(date.readable())?, "\" 2022 -04 -05 \"" );
assert_eq!(deserialize::<Date>("\" 2022 -04 -05 \"" , Readable)?, date);
assert_eq!(deserialize::<Date>("[2022,95]" , Readable)?, date);
Ok(())
}
Messung V0.5 in Prozent C=100 H=69 G=85
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-08-27)
¤
*© Formatika GbR, Deutschland