Skip to content

Commit

Permalink
Add PartialDuration record functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
nekevss committed Jul 21, 2024
1 parent 979ee69 commit 3e29ffe
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
45 changes: 45 additions & 0 deletions src/components/duration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,31 @@ pub use date::DateDuration;
#[doc(inline)]
pub use time::TimeDuration;

/// A `PartialDuration` is a Duration that may have fields not set.
#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)]
pub struct PartialDuration {
/// A potentially existent `years` field.
pub years: Option<FiniteF64>,
/// A potentially existent `months` field.
pub months: Option<FiniteF64>,
/// A potentially existent `weeks` field.
pub weeks: Option<FiniteF64>,
/// A potentially existent `days` field.
pub days: Option<FiniteF64>,
/// A potentially existent `hours` field.
pub hours: Option<FiniteF64>,
/// A potentially existent `minutes` field.
pub minutes: Option<FiniteF64>,
/// A potentially existent `seconds` field.
pub seconds: Option<FiniteF64>,
/// A potentially existent `milliseconds` field.
pub milliseconds: Option<FiniteF64>,
/// A potentially existent `microseconds` field.
pub microseconds: Option<FiniteF64>,
/// A potentially existent `nanoseconds` field.
pub nanoseconds: Option<FiniteF64>,
}

/// The native Rust implementation of `Temporal.Duration`.
///
/// `Duration` is made up of a `DateDuration` and `TimeDuration` as primarily
Expand Down Expand Up @@ -173,6 +198,26 @@ impl Duration {
}
}

/// Creates a `Duration` from a provided `PartialDuration`.
pub fn from_partial_duration(partial: PartialDuration) -> TemporalResult<Self> {
if partial == PartialDuration::default() {
return Err(TemporalError::r#type()
.with_message("PartialDuration cannot have all empty fields."));
}
Self::new(
partial.years.unwrap_or_default(),
partial.months.unwrap_or_default(),
partial.weeks.unwrap_or_default(),
partial.days.unwrap_or_default(),
partial.hours.unwrap_or_default(),
partial.minutes.unwrap_or_default(),
partial.seconds.unwrap_or_default(),
partial.milliseconds.unwrap_or_default(),
partial.microseconds.unwrap_or_default(),
partial.nanoseconds.unwrap_or_default(),
)
}

/// Return if the Durations values are within their valid ranges.
#[inline]
#[must_use]
Expand Down
14 changes: 14 additions & 0 deletions src/components/duration/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -658,3 +658,17 @@ fn basic_subtract_duration() {
assert_eq!(result.days(), 6.0);
assert_eq!(result.minutes(), 30.0);
}

#[test]
fn partial_duration_empty() {
let err = Duration::from_partial_duration(PartialDuration::default());
assert!(err.is_err())
}

#[test]
fn partial_duration_values() {
let mut partial = PartialDuration::default();
let _ = partial.years.insert(FiniteF64(20.0));
let result = Duration::from_partial_duration(partial).unwrap();
assert_eq!(result.years(), 20.0);
}

0 comments on commit 3e29ffe

Please sign in to comment.