use std::error; use std::fmt; use std::str::{self, FromStr}; #[cfg(feature = "serde")] use serde::{de, ser}; /// A parsed TOML datetime value /// /// This structure is intended to represent the datetime primitive type that can /// be encoded into TOML documents. This type is a parsed version that contains /// all metadata internally. /// /// Currently this type is intentionally conservative and only supports /// `to_string` as an accessor. Over time though it's intended that it'll grow /// more support! /// /// Note that if you're using `Deserialize` to deserialize a TOML document, you /// can use this as a placeholder for where you're expecting a datetime to be /// specified. /// /// Also note though that while this type implements `Serialize` and /// `Deserialize` it's only recommended to use this type with the TOML format, /// otherwise encoded in other formats it may look a little odd. /// /// Depending on how the option values are used, this struct will correspond /// with one of the following four datetimes from the [TOML v1.0.0 spec]: /// /// | `date` | `time` | `offset` | TOML type | /// | --------- | --------- | --------- | ------------------ | /// | `Some(_)` | `Some(_)` | `Some(_)` | [Offset Date-Time] | /// | `Some(_)` | `Some(_)` | `None` | [Local Date-Time] | /// | `Some(_)` | `None` | `None` | [Local Date] | /// | `None` | `Some(_)` | `None` | [Local Time] | /// /// **1. Offset Date-Time**: If all the optional values are used, `Datetime` /// corresponds to an [Offset Date-Time]. From the TOML v1.0.0 spec: /// /// > To unambiguously represent a specific instant in time, you may use an /// > RFC 3339 formatted date-time with offset. /// > /// > ```toml /// > odt1 = 1979-05-27T07:32:00Z /// > odt2 = 1979-05-27T00:32:00-07:00 /// > odt3 = 1979-05-27T00:32:00.999999-07:00 /// > ``` /// > /// > For the sake of readability, you may replace the T delimiter between date /// > and time with a space character (as permitted by RFC 3339 section 5.6). /// > /// > ```toml /// > odt4 = 1979-05-27 07:32:00Z /// > ``` /// /// **2. Local Date-Time**: If `date` and `time` are given but `offset` is /// `None`, `Datetime` corresponds to a [Local Date-Time]. From the spec: /// /// > If you omit the offset from an RFC 3339 formatted date-time, it will /// > represent the given date-time without any relation to an offset or /// > timezone. It cannot be converted to an instant in time without additional /// > information. Conversion to an instant, if required, is implementation- /// > specific. /// > /// > ```toml /// > ldt1 = 1979-05-27T07:32:00 /// > ldt2 = 1979-05-27T00:32:00.999999 /// > ``` /// /// **3. Local Date**: If only `date` is given, `Datetime` corresponds to a /// [Local Date]; see the docs for [`Date`]. /// /// **4. Local Time**: If only `time` is given, `Datetime` corresponds to a /// [Local Time]; see the docs for [`Time`]. /// /// [TOML v1.0.0 spec]: https://toml.io/en/v1.0.0 /// [Offset Date-Time]: https://toml.io/en/v1.0.0#offset-date-time /// [Local Date-Time]: https://toml.io/en/v1.0.0#local-date-time /// [Local Date]: https://toml.io/en/v1.0.0#local-date /// [Local Time]: https://toml.io/en/v1.0.0#local-time #[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Debug)] pub struct Datetime { /// Optional date. /// Required for: *Offset Date-Time*, *Local Date-Time*, *Local Date*. pub date: Option, /// Optional time. /// Required for: *Offset Date-Time*, *Local Date-Time*, *Local Time*. pub time: Option