diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 03:57:19 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 03:57:19 +0000 |
commit | a0b8f38ab54ac451646aa00cd5e91b6c76f22a84 (patch) | |
tree | fc451898ccaf445814e26b46664d78702178101d /vendor/time/src/serde | |
parent | Adding debian version 1.71.1+dfsg1-2. (diff) | |
download | rustc-a0b8f38ab54ac451646aa00cd5e91b6c76f22a84.tar.xz rustc-a0b8f38ab54ac451646aa00cd5e91b6c76f22a84.zip |
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/time/src/serde')
-rw-r--r-- | vendor/time/src/serde/mod.rs | 146 |
1 files changed, 131 insertions, 15 deletions
diff --git a/vendor/time/src/serde/mod.rs b/vendor/time/src/serde/mod.rs index 248356e1a..844d7bdef 100644 --- a/vendor/time/src/serde/mod.rs +++ b/vendor/time/src/serde/mod.rs @@ -27,17 +27,31 @@ use core::marker::PhantomData; #[cfg(feature = "serde-human-readable")] use serde::ser::Error as _; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -/// Generate a custom serializer and deserializer from the provided string. +/// Generate a custom serializer and deserializer from a format string or an existing format. /// /// The syntax accepted by this macro is the same as [`format_description::parse()`], which can /// be found in [the book](https://time-rs.github.io/book/api/format-description.html). /// /// # Usage /// -/// Invoked as `serde::format_description!(mod_name, Date, "<format string>")`. This puts a -/// module named `mod_name` in the current scope that can be used to format `Date` structs. A -/// submodule (`mod_name::option`) is also generated for `Option<Date>`. Both modules are only -/// visible in the current scope. +/// Invoked as `serde::format_description!(mod_name, Date, FORMAT)` where `FORMAT` is either a +/// `"<format string>"` or something that implements +#[cfg_attr( + all(feature = "formatting", feature = "parsing"), + doc = "[`Formattable`](crate::formatting::Formattable) and \ + [`Parsable`](crate::parsing::Parsable)." +)] +#[cfg_attr( + all(feature = "formatting", not(feature = "parsing")), + doc = "[`Formattable`](crate::formatting::Formattable)." +)] +#[cfg_attr( + all(not(feature = "formatting"), feature = "parsing"), + doc = "[`Parsable`](crate::parsing::Parsable)." +)] +/// This puts a module named `mod_name` in the current scope that can be used to format `Date` +/// structs. A submodule (`mod_name::option`) is also generated for `Option<Date>`. Both +/// modules are only visible in the current scope. /// /// The returned `Option` will contain a deserialized value if present and `None` if the field /// is present but the value is `null` (or the equivalent in other formats). To return `None` @@ -45,6 +59,8 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; /// /// # Examples /// +/// Using a format string: +/// /// ```rust,no_run /// # use time::OffsetDateTime; #[cfg_attr( @@ -63,6 +79,8 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; /// /// // Makes a module `mod my_format { ... }`. /// serde::format_description!(my_format, OffsetDateTime, "hour=[hour], minute=[minute]"); +/// +/// # #[allow(dead_code)] #[cfg_attr( all(feature = "formatting", feature = "parsing"), doc = "#[derive(Serialize, Deserialize)]" @@ -75,13 +93,111 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; all(not(feature = "formatting"), feature = "parsing"), doc = "#[derive(Deserialize)]" )] +/// struct SerializesWithCustom { +/// #[serde(with = "my_format")] +/// dt: OffsetDateTime, +/// #[serde(with = "my_format::option")] +/// maybe_dt: Option<OffsetDateTime>, +/// } +/// ``` +/// +/// Define the format separately to be used in multiple places: +/// ```rust,no_run +/// # use time::OffsetDateTime; +#[cfg_attr( + all(feature = "formatting", feature = "parsing"), + doc = "use ::serde::{Serialize, Deserialize};" +)] +#[cfg_attr( + all(feature = "formatting", not(feature = "parsing")), + doc = "use ::serde::Serialize;" +)] +#[cfg_attr( + all(not(feature = "formatting"), feature = "parsing"), + doc = "use ::serde::Deserialize;" +)] +/// use time::serde; +/// use time::format_description::FormatItem; +/// +/// const DATE_TIME_FORMAT: &[FormatItem<'_>] = time::macros::format_description!( +/// "hour=[hour], minute=[minute]" +/// ); +/// +/// // Makes a module `mod my_format { ... }`. +/// serde::format_description!(my_format, OffsetDateTime, DATE_TIME_FORMAT); +/// /// # #[allow(dead_code)] +#[cfg_attr( + all(feature = "formatting", feature = "parsing"), + doc = "#[derive(Serialize, Deserialize)]" +)] +#[cfg_attr( + all(feature = "formatting", not(feature = "parsing")), + doc = "#[derive(Serialize)]" +)] +#[cfg_attr( + all(not(feature = "formatting"), feature = "parsing"), + doc = "#[derive(Deserialize)]" +)] +/// struct SerializesWithCustom { +/// #[serde(with = "my_format")] +/// dt: OffsetDateTime, +/// #[serde(with = "my_format::option")] +/// maybe_dt: Option<OffsetDateTime>, +/// } +/// +/// fn main() { +/// # #[allow(unused_variables)] +/// let str_ts = OffsetDateTime::now_utc().format(DATE_TIME_FORMAT).unwrap(); +/// } +/// ``` +/// +/// Customize the configuration of ISO 8601 formatting/parsing: +/// ```rust,no_run +/// # use time::OffsetDateTime; +#[cfg_attr( + all(feature = "formatting", feature = "parsing"), + doc = "use ::serde::{Serialize, Deserialize};" +)] +#[cfg_attr( + all(feature = "formatting", not(feature = "parsing")), + doc = "use ::serde::Serialize;" +)] +#[cfg_attr( + all(not(feature = "formatting"), feature = "parsing"), + doc = "use ::serde::Deserialize;" +)] +/// use time::serde; +/// use time::format_description::well_known::{iso8601, Iso8601}; +/// +/// const CONFIG: iso8601::EncodedConfig = iso8601::Config::DEFAULT +/// .set_year_is_six_digits(false) +/// .encode(); +/// const FORMAT: Iso8601<CONFIG> = Iso8601::<CONFIG>; +/// +/// // Makes a module `mod my_format { ... }`. +/// serde::format_description!(my_format, OffsetDateTime, FORMAT); +/// +/// # #[allow(dead_code)] +#[cfg_attr( + all(feature = "formatting", feature = "parsing"), + doc = "#[derive(Serialize, Deserialize)]" +)] +#[cfg_attr( + all(feature = "formatting", not(feature = "parsing")), + doc = "#[derive(Serialize)]" +)] +#[cfg_attr( + all(not(feature = "formatting"), feature = "parsing"), + doc = "#[derive(Deserialize)]" +)] /// struct SerializesWithCustom { /// #[serde(with = "my_format")] /// dt: OffsetDateTime, /// #[serde(with = "my_format::option")] /// maybe_dt: Option<OffsetDateTime>, /// } +/// # fn main() {} /// ``` /// /// [`format_description::parse()`]: crate::format_description::parse() @@ -108,9 +224,9 @@ impl Serialize for Date { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { #[cfg(feature = "serde-human-readable")] if serializer.is_human_readable() { - guard!(let Ok(s) = self.format(&DATE_FORMAT) else { + let Ok(s) = self.format(&DATE_FORMAT) else { return Err(S::Error::custom("failed formatting `Date`")); - }); + }; return serializer.serialize_str(&s); } @@ -171,9 +287,9 @@ impl Serialize for OffsetDateTime { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { #[cfg(feature = "serde-human-readable")] if serializer.is_human_readable() { - guard!(let Ok(s) = self.format(&OFFSET_DATE_TIME_FORMAT) else { + let Ok(s) = self.format(&OFFSET_DATE_TIME_FORMAT) else { return Err(S::Error::custom("failed formatting `OffsetDateTime`")); - }); + }; return serializer.serialize_str(&s); } @@ -216,9 +332,9 @@ impl Serialize for PrimitiveDateTime { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { #[cfg(feature = "serde-human-readable")] if serializer.is_human_readable() { - guard!(let Ok(s) = self.format(&PRIMITIVE_DATE_TIME_FORMAT) else { + let Ok(s) = self.format(&PRIMITIVE_DATE_TIME_FORMAT) else { return Err(S::Error::custom("failed formatting `PrimitiveDateTime`")); - }); + }; return serializer.serialize_str(&s); } @@ -262,9 +378,9 @@ impl Serialize for Time { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { #[cfg(feature = "serde-human-readable")] if serializer.is_human_readable() { - guard!(let Ok(s) = self.format(&TIME_FORMAT) else { + let Ok(s) = self.format(&TIME_FORMAT) else { return Err(S::Error::custom("failed formatting `Time`")); - }); + }; return serializer.serialize_str(&s); } @@ -298,9 +414,9 @@ impl Serialize for UtcOffset { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { #[cfg(feature = "serde-human-readable")] if serializer.is_human_readable() { - guard!(let Ok(s) = self.format(&UTC_OFFSET_FORMAT) else { + let Ok(s) = self.format(&UTC_OFFSET_FORMAT) else { return Err(S::Error::custom("failed formatting `UtcOffset`")); - }); + }; return serializer.serialize_str(&s); } |