use serde::{Deserialize, Serialize}; use serde_test::{ assert_de_tokens_error, assert_ser_tokens_error, assert_tokens, Configure, Token, }; use time::macros::datetime; use time::serde::rfc3339; use time::OffsetDateTime; #[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] struct Test { #[serde(with = "rfc3339")] dt: OffsetDateTime, #[serde(with = "rfc3339::option")] option_dt: Option, } #[test] fn serialize_deserialize() { let value = Test { dt: datetime!(2000-01-01 00:00:00 UTC), option_dt: Some(datetime!(2000-01-01 00:00:00 UTC)), }; assert_tokens( &value.compact(), &[ Token::Struct { name: "Test", len: 2, }, Token::Str("dt"), Token::BorrowedStr("2000-01-01T00:00:00Z"), Token::Str("option_dt"), Token::Some, Token::BorrowedStr("2000-01-01T00:00:00Z"), Token::StructEnd, ], ); let value = Test { dt: datetime!(2000-01-01 00:00:00 UTC), option_dt: None, }; assert_tokens( &value.compact(), &[ Token::Struct { name: "Test", len: 2, }, Token::Str("dt"), Token::BorrowedStr("2000-01-01T00:00:00Z"), Token::Str("option_dt"), Token::None, Token::StructEnd, ], ); assert_de_tokens_error::( &[ Token::Struct { name: "Test", len: 2, }, Token::Str("dt"), Token::BorrowedStr("bad"), Token::StructEnd, ], "the 'year' component could not be parsed", ); let value = Test { dt: datetime!(2000-01-01 00:00:00 +00:00:01), option_dt: None, }; assert_ser_tokens_error::( &value, &[ Token::Struct { name: "Test", len: 2, }, Token::Str("dt"), ], "The offset_second component cannot be formatted into the requested format.", ); } #[test] fn parse_json() -> serde_json::Result<()> { #[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] #[serde(untagged)] enum Wrapper { A(Test), } assert_eq!( serde_json::from_str::("{\"dt\": \"2000-01-01T00:00:00Z\", \"option_dt\": null}")?, Wrapper::A(Test { dt: datetime!(2000-01-01 00:00:00 UTC), option_dt: None, }) ); Ok(()) } #[test] fn issue_479() -> serde_json::Result<()> { const A: &str = r#"{ "date": "2022-05-01T10:20:42.123Z" }"#; const B: &str = r#"{ "date": "2022-05-01T10:20:42.123Z", "maybe_date": "2022-05-01T10:20:42.123Z" }"#; #[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] struct S { #[serde(with = "time::serde::rfc3339")] date: OffsetDateTime, #[serde(with = "time::serde::rfc3339::option", default)] maybe_date: Option, } let a = serde_json::from_str::(A)?; let b = serde_json::from_str::(B)?; assert_eq!( a, S { date: datetime!(2022-05-01 10:20:42.123 UTC), maybe_date: None } ); assert_eq!( b, S { date: datetime!(2022-05-01 10:20:42.123 UTC), maybe_date: Some(datetime!(2022-05-01 10:20:42.123 UTC)) } ); Ok(()) }