#[rustfmt::skip] // Tries to remove the leading `::`, which breaks compilation. use ::serde::{Deserialize, Serialize}; use serde_test::{
assert_de_tokens, assert_de_tokens_error, assert_ser_tokens_error, assert_tokens, Configure,
Token,
}; use time::format_description::well_known::{iso8601, Iso8601}; use time::format_description::BorrowedFormatItem; use time::macros::{date, datetime, offset, time}; use time::{serde, Date, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset};
// Not used in the tests, but ensures that the macro compiles. #[expect(dead_code)] const ISO_FORMAT: Iso8601<{ iso8601::Config::DEFAULT.encode() }> =
Iso8601::<{ iso8601::Config::DEFAULT.encode() }>;
time::serde::format_description!(my_format, OffsetDateTime, ISO_FORMAT);
time::serde::format_description!(
my_format2,
OffsetDateTime,
Iso8601::<{ iso8601::Config::DEFAULT.encode() }>
);
#[test] fn custom_serialize_error() { // Deserialization error due to parse problem.
assert_de_tokens_error::<TestCustomFormat>(
&[
Token::Struct {
name: "TestCustomFormat",
len: 5,
},
Token::Str("offset_dt"),
Token::BorrowedStr("custom format: 2000-01-01 0:00:00 -04:00"),
], "the 'hour' component could not be parsed",
); // Parse problem in optional field.
assert_de_tokens_error::<TestCustomFormat>(
&[
Token::Struct {
name: "TestCustomFormat",
len: 5,
},
Token::Str("offset_dt"),
Token::BorrowedStr("custom format: 2000-01-01 00:00:00 -04:00"),
Token::Str("primitive_dt"),
Token::Some,
Token::BorrowedStr("custom format: 2000-01-01 0:00:00 -04:00"),
], "the 'hour' component could not be parsed",
); // Type error
assert_de_tokens_error::<TestCustomFormat>(
&[
Token::Struct {
name: "TestCustomFormat",
len: 5,
},
Token::Str("offset_dt"),
Token::Bool(false),
], "invalid type: boolean `false`, expected a(n) `OffsetDateTime` in the format \"custom \
format: [year]-[month]-[day] [hour]:[minute]:[second] [offset_hour \
sign:mandatory]:[offset_minute]\"",
);
assert_de_tokens_error::<TestCustomFormat>(
&[
Token::Struct {
name: "TestCustomFormat",
len: 5,
},
Token::Str("offset_dt"),
Token::BorrowedStr("custom format: 2000-01-01 00:00:00 -04:00"),
Token::Str("primitive_dt"),
Token::Bool(false),
], "invalid type: boolean `false`, expected an `Option<PrimitiveDateTime>` in the format \
\"custom format: [year]-[month]-[day] [hour]:[minute]:[second]\"",
);
}
// This format string has offset_hour and offset_minute, but is for formatting PrimitiveDateTime.
serde::format_description!(
primitive_date_time_format_bad,
PrimitiveDateTime, "[offset_hour]:[offset_minute]"
);
#[test] fn custom_serialize_bad_type_error() { let value = TestCustomFormatPrimitiveDateTimeBad {
dt: datetime!(2000-01-0100:00),
};
assert_ser_tokens_error::<TestCustomFormatPrimitiveDateTimeBad>(
&value,
&[
Token::Struct {
name: "TestCustomFormatPrimitiveDateTimeBad",
len: 1,
},
Token::Str("dt"),
], "The type being formatted does not contain sufficient information to format a component.",
);
}
// Test the behavior of versioning.
serde::format_description!(version = 1, version_test_1, Time, "[[ [hour]:[minute]");
serde::format_description!(version = 1, version_test_2, Time, r"\\ [hour]:[minute]");
serde::format_description!(version = 2, version_test_3, Time, r"\\ [hour]:[minute]");
serde::format_description!(version, Time, "[hour]:[minute]");
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] struct TestVersioning { #[serde(with = "version_test_1")]
time_1: Time, #[serde(with = "version_test_2")]
time_2: Time, #[serde(with = "version_test_3")]
time_3: Time, #[serde(with = "version")]
time_4: Time,
}
serde::format_description!(
version = 1,
nested_v1,
Time, "[hour]:[minute][optional [:[second]]]"
);
serde::format_description!(
version = 2,
nested_v2,
Time, "[hour]:[minute][optional [:[second]]]"
);
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] struct TestNested { #[serde(with = "nested_v1")]
time_1: Time, #[serde(with = "nested_v2")]
time_2: Time,
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.