#[non_exhaustive]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct DurationFormatterOptions {
pub base: BaseStyle,
pub year: Option<YearStyle>,
pub year_visibility: Option<FieldDisplay>,
pub month: Option<MonthStyle>,
pub month_visibility: Option<FieldDisplay>,
pub week: Option<WeekStyle>,
pub week_visibility: Option<FieldDisplay>,
pub day: Option<DayStyle>,
pub day_visibility: Option<FieldDisplay>,
pub hour: Option<HourStyle>,
pub hour_visibility: Option<FieldDisplay>,
pub minute: Option<MinuteStyle>,
pub minute_visibility: Option<FieldDisplay>,
pub second: Option<SecondStyle>,
pub second_visibility: Option<FieldDisplay>,
pub millisecond: Option<MilliSecondStyle>,
pub millisecond_visibility: Option<FieldDisplay>,
pub microsecond: Option<MicroSecondStyle>,
pub microsecond_visibility: Option<FieldDisplay>,
pub nanosecond: Option<NanoSecondStyle>,
pub nanosecond_visibility: Option<FieldDisplay>,
pub fractional_digits: FractionalDigits,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum FractionalDigits {
#[default]
ShowAll,
Fixed(u8),
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FieldDisplay {
Auto,
Always,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum FieldStyle {
Narrow,
Short,
Long,
TwoDigit,
Numeric,
Fractional,
Digital,
}
macro_rules! derive_style {
(
$(
$(#[$enum_meta:meta])*
pub enum $enum_name: ident {
$(
$(#[$variant_meta:meta])*
$variant: ident
),* $(,)?
}
)+
) => {
$(
$(#[$enum_meta])*
pub enum $enum_name {
$(
$(#[$variant_meta])*
$variant,
)*
}
impl From<$enum_name> for FieldStyle {
fn from(style: $enum_name) -> Self {
#[allow(unreachable_patterns)]
match style {
$(
$enum_name::$variant => FieldStyle::$variant,
)*
}
}
}
impl TryFrom<FieldStyle> for $enum_name {
type Error = FieldStyle;
fn try_from(style: FieldStyle) -> Result<Self, Self::Error> {
match style {
$(
FieldStyle::$variant => Ok($enum_name::$variant),
)*
rest => Err(rest),
}
}
}
)+
};
}
derive_style! {
#[non_exhaustive]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum BaseStyle {
Narrow,
#[default]
Short,
Long,
Digital,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum YearStyle {
Narrow,
Short,
Long,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MonthStyle {
Narrow,
Short,
Long,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WeekStyle {
Narrow,
Short,
Long,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DayStyle {
Narrow,
Short,
Long,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HourStyle {
Narrow,
Short,
Long,
TwoDigit,
Numeric,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MinuteStyle {
Narrow,
Short,
Long,
TwoDigit,
Numeric,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SecondStyle {
Narrow,
Short,
Long,
TwoDigit,
Numeric,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MilliSecondStyle {
Narrow,
Short,
Long,
Numeric,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MicroSecondStyle {
Narrow,
Short,
Long,
Numeric,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NanoSecondStyle {
Narrow,
Short,
Long,
Numeric,
}
}