Skip to content

Commit

Permalink
Reimpl unit groups - previous fails were a result of false positives
Browse files Browse the repository at this point in the history
  • Loading branch information
nekevss committed Jan 25, 2025
1 parent 40e5dfb commit 24bc008
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/builtins/core/date.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use crate::{
iso::{IsoDate, IsoDateTime, IsoTime},
options::{
ArithmeticOverflow, DifferenceOperation, DifferenceSettings, DisplayCalendar,
ResolvedRoundingOptions, TemporalUnit,
ResolvedRoundingOptions, TemporalUnit, UnitGroup,
},
parsers::{parse_date_time, IxdtfStringBuilder},
primitive::FiniteF64,
Expand Down Expand Up @@ -265,6 +265,7 @@ impl PlainDate {
let resolved = ResolvedRoundingOptions::from_diff_settings(
settings,
op,
UnitGroup::Date,
TemporalUnit::Day,
TemporalUnit::Day,
)?;
Expand Down
3 changes: 2 additions & 1 deletion src/builtins/core/datetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use crate::{
iso::{IsoDate, IsoDateTime, IsoTime},
options::{
ArithmeticOverflow, DifferenceOperation, DifferenceSettings, DisplayCalendar,
ResolvedRoundingOptions, RoundingOptions, TemporalUnit, ToStringRoundingOptions,
ResolvedRoundingOptions, RoundingOptions, TemporalUnit, ToStringRoundingOptions, UnitGroup,
},
parsers::{parse_date_time, IxdtfStringBuilder},
provider::NeverProvider,
Expand Down Expand Up @@ -133,6 +133,7 @@ impl PlainDateTime {
let options = ResolvedRoundingOptions::from_diff_settings(
settings,
op,
UnitGroup::DateTime,
TemporalUnit::Day,
TemporalUnit::Nanosecond,
)?;
Expand Down
3 changes: 2 additions & 1 deletion src/builtins/core/instant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::{
iso::IsoDateTime,
options::{
DifferenceOperation, DifferenceSettings, DisplayOffset, ResolvedRoundingOptions,
RoundingOptions, TemporalUnit, ToStringRoundingOptions,
RoundingOptions, TemporalUnit, ToStringRoundingOptions, UnitGroup,
},
parsers::{parse_instant, IxdtfStringBuilder},
primitive::FiniteF64,
Expand Down Expand Up @@ -88,6 +88,7 @@ impl Instant {
let resolved_options = ResolvedRoundingOptions::from_diff_settings(
options,
op,
UnitGroup::Time,
TemporalUnit::Second,
TemporalUnit::Nanosecond,
)?;
Expand Down
3 changes: 2 additions & 1 deletion src/builtins/core/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::{
iso::IsoTime,
options::{
ArithmeticOverflow, DifferenceOperation, DifferenceSettings, ResolvedRoundingOptions,
RoundingIncrement, TemporalRoundingMode, TemporalUnit, ToStringRoundingOptions,
RoundingIncrement, TemporalRoundingMode, TemporalUnit, ToStringRoundingOptions, UnitGroup,
},
parsers::{parse_time, IxdtfStringBuilder},
primitive::FiniteF64,
Expand Down Expand Up @@ -127,6 +127,7 @@ impl PlainTime {
let resolved = ResolvedRoundingOptions::from_diff_settings(
settings,
op,
UnitGroup::Time,
TemporalUnit::Hour,
TemporalUnit::Nanosecond,
)?;
Expand Down
3 changes: 2 additions & 1 deletion src/builtins/core/zoneddatetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
ArithmeticOverflow, DifferenceOperation, DifferenceSettings, Disambiguation,
DisplayCalendar, DisplayOffset, DisplayTimeZone, OffsetDisambiguation,
ResolvedRoundingOptions, RoundingIncrement, TemporalRoundingMode, TemporalUnit,
ToStringRoundingOptions,
ToStringRoundingOptions, UnitGroup,
},
parsers::{self, IxdtfStringBuilder},
partial::{PartialDate, PartialTime},
Expand Down Expand Up @@ -271,6 +271,7 @@ impl ZonedDateTime {
let resolved_options = ResolvedRoundingOptions::from_diff_settings(
options,
op,
UnitGroup::DateTime,
TemporalUnit::Hour,
TemporalUnit::Nanosecond,
)?;
Expand Down
29 changes: 29 additions & 0 deletions src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,13 @@ impl ResolvedRoundingOptions {
pub(crate) fn from_diff_settings(
options: DifferenceSettings,
operation: DifferenceOperation,
unit_group: UnitGroup,
fallback_largest: TemporalUnit,
fallback_smallest: TemporalUnit,
) -> TemporalResult<Self> {
// 4. Let resolvedOptions be ? SnapshotOwnProperties(? GetOptionsObject(options), null).
// 5. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, DATE, « », "day", "day").
unit_group.validate_unit(options.largest_unit)?;
let increment = options.increment.unwrap_or_default();
let rounding_mode = match operation {
DifferenceOperation::Since => options
Expand Down Expand Up @@ -341,6 +343,33 @@ impl ResolvedRoundingOptions {

// ==== Options enums and methods ====

pub enum UnitGroup {
Date,
Time,
DateTime,
}

impl UnitGroup {
pub fn validate_unit(self, unit: Option<TemporalUnit>) -> TemporalResult<()> {
// TODO: Determine proper handling of Auto.
match self {
UnitGroup::Date => match unit {
Some(unit) if !unit.is_time_unit() => Ok(()),
None => Ok(()),
_ => Err(TemporalError::range()
.with_message("Unit was not part of the date unit group.")),
},
UnitGroup::Time => match unit {
Some(unit) if unit.is_time_unit() => Ok(()),
None => Ok(()),
_ => Err(TemporalError::range()
.with_message("Unit was not part of the time unit group.")),
},
UnitGroup::DateTime => Ok(()),
}
}
}

/// The relevant unit that should be used for the operation that
/// this option is provided as a value.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
Expand Down

0 comments on commit 24bc008

Please sign in to comment.