mod adt_hack;
use core::num::NonZero;
#[doc(hidden, no_inline)]
pub use self::adt_hack::DoNotRelyOnWhatThisIs;
pub use self::adt_hack::EncodedConfig;
#[cfg_attr(feature = "formatting", doc = "```rust")]
#[cfg_attr(not(feature = "formatting"), doc = "```rust,ignore")]
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct Iso8601<const CONFIG: EncodedConfig = { Config::DEFAULT.encode() }>;
impl<const CONFIG: EncodedConfig> core::fmt::Debug for Iso8601<CONFIG> {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("Iso8601")
.field("config", &Config::decode(CONFIG))
.finish()
}
}
macro_rules! define_assoc_consts {
($($(#[$doc:meta])* $vis:vis const $const_name:ident = $format:expr;)*) => {$(
const $const_name: EncodedConfig = $format.encode();
impl Iso8601<$const_name> {
$(#[$doc])*
$vis const $const_name: Self = Self;
}
)*};
}
define_assoc_consts! {
pub const DEFAULT = Config::DEFAULT;
pub const PARSING = Config::PARSING;
pub const DATE = Config::DEFAULT.set_formatted_components(FormattedComponents::Date);
pub const TIME = Config::DEFAULT.set_formatted_components(FormattedComponents::Time);
pub const OFFSET = Config::DEFAULT.set_formatted_components(FormattedComponents::Offset);
pub const DATE_TIME = Config::DEFAULT.set_formatted_components(FormattedComponents::DateTime);
pub const DATE_TIME_OFFSET = Config::DEFAULT;
pub const TIME_OFFSET = Config::DEFAULT
.set_formatted_components(FormattedComponents::TimeOffset);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FormattedComponents {
None,
Date,
Time,
Offset,
DateTime,
DateTimeOffset,
TimeOffset,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DateKind {
Calendar,
Week,
Ordinal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimePrecision {
Hour {
#[expect(missing_docs)]
decimal_digits: Option<NonZero<u8>>,
},
Minute {
#[expect(missing_docs)]
decimal_digits: Option<NonZero<u8>>,
},
Second {
#[expect(missing_docs)]
decimal_digits: Option<NonZero<u8>>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OffsetPrecision {
Hour,
Minute,
}
#[expect(missing_copy_implementations, reason = "forwards compatibility")]
#[doc(alias = "EncodedConfig")] #[derive(Debug)]
pub struct Config {
pub(crate) formatted_components: FormattedComponents,
pub(crate) use_separators: bool,
pub(crate) year_is_six_digits: bool,
pub(crate) date_kind: DateKind,
pub(crate) time_precision: TimePrecision,
pub(crate) offset_precision: OffsetPrecision,
}
impl Config {
pub const DEFAULT: Self = Self {
formatted_components: FormattedComponents::DateTimeOffset,
use_separators: true,
year_is_six_digits: false,
date_kind: DateKind::Calendar,
time_precision: TimePrecision::Second {
decimal_digits: NonZero::new(9),
},
offset_precision: OffsetPrecision::Minute,
};
const PARSING: Self = Self {
formatted_components: FormattedComponents::None,
use_separators: false,
year_is_six_digits: false,
date_kind: DateKind::Calendar,
time_precision: TimePrecision::Hour {
decimal_digits: None,
},
offset_precision: OffsetPrecision::Hour,
};
#[inline]
pub const fn set_formatted_components(self, formatted_components: FormattedComponents) -> Self {
Self {
formatted_components,
..self
}
}
#[inline]
pub const fn set_use_separators(self, use_separators: bool) -> Self {
Self {
use_separators,
..self
}
}
#[inline]
pub const fn set_year_is_six_digits(self, year_is_six_digits: bool) -> Self {
Self {
year_is_six_digits,
..self
}
}
#[inline]
pub const fn set_date_kind(self, date_kind: DateKind) -> Self {
Self { date_kind, ..self }
}
#[inline]
pub const fn set_time_precision(self, time_precision: TimePrecision) -> Self {
Self {
time_precision,
..self
}
}
#[inline]
pub const fn set_offset_precision(self, offset_precision: OffsetPrecision) -> Self {
Self {
offset_precision,
..self
}
}
}