Skip to content

Adjustments to toPlainYearMonth and toPlainMonthDay methods on PlainDate #237

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 30 additions & 19 deletions src/builtins/core/date.rs
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,15 @@ impl PlainDate {
DifferenceOperation::Since => Ok(result.negated()),
}
}

/// Abstract operation `DaysUntil`
///
/// Calculates the epoch days between two `Date`s
#[inline]
#[must_use]
fn days_until(&self, other: &Self) -> i32 {
other.iso.to_epoch_days() - self.iso.to_epoch_days()
}
}

// ==== Public API ====
Expand Down Expand Up @@ -477,16 +486,6 @@ impl PlainDate {
self.iso.is_valid()
}

// TODO: make private
/// `DaysUntil`
///
/// Calculates the epoch days between two `Date`s
#[inline]
#[must_use]
pub fn days_until(&self, other: &Self) -> i32 {
other.iso.to_epoch_days() - self.iso.to_epoch_days()
}

/// Compares one `PlainDate` to another `PlainDate` using their
/// `IsoDate` representation.
///
Expand Down Expand Up @@ -620,24 +619,36 @@ impl PlainDate {
///
/// If no time is provided, then the time will default to midnight.
#[inline]
pub fn to_date_time(&self, time: Option<PlainTime>) -> TemporalResult<PlainDateTime> {
pub fn to_plain_date_time(&self, time: Option<PlainTime>) -> TemporalResult<PlainDateTime> {
let time = time.unwrap_or_default();
let iso = IsoDateTime::new(self.iso, time.iso)?;
Ok(PlainDateTime::new_unchecked(iso, self.calendar().clone()))
}

/// Converts the current `Date<C>` into a `PlainYearMonth`
/// Converts the current `Date` into a `PlainYearMonth`
#[inline]
pub fn to_year_month(&self) -> TemporalResult<PlainYearMonth> {
self.calendar().year_month_from_partial(
&PartialDate::default().with_fallback_date(self)?,
ArithmeticOverflow::Constrain,
)
pub fn to_plain_year_month(&self) -> TemporalResult<PlainYearMonth> {
// TODO: Migrate to `PartialYearMonth`
let era = self
.era()
.map(|e| {
TinyAsciiStr::<19>::try_from_utf8(e.as_bytes())
.map_err(|e| TemporalError::general(format!("{e}")))
})
.transpose()?;
let partial = PartialDate::new()
.with_year(Some(self.year()))
.with_era(era)
.with_era_year(self.era_year())
.with_month(Some(self.month()))
.with_month_code(Some(self.month_code()));
self.calendar()
.year_month_from_partial(&partial, ArithmeticOverflow::Constrain)
}

/// Converts the current `Date<C>` into a `PlainMonthDay`
/// Converts the current `Date` into a `PlainMonthDay`
#[inline]
pub fn to_month_day(&self) -> TemporalResult<PlainMonthDay> {
pub fn to_plain_month_day(&self) -> TemporalResult<PlainMonthDay> {
self.calendar().month_day_from_partial(
&PartialDate::default().with_fallback_date(self)?,
ArithmeticOverflow::Constrain,
Expand Down
8 changes: 3 additions & 5 deletions temporal_capi/bindings/cpp/temporal_rs/PlainDate.d.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,6 @@ class PlainDate {

inline bool is_valid() const;

inline int32_t days_until(const temporal_rs::PlainDate& other) const;

inline diplomat::result<std::unique_ptr<temporal_rs::PlainDate>, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration, std::optional<temporal_rs::ArithmeticOverflow> overflow) const;

inline diplomat::result<std::unique_ptr<temporal_rs::PlainDate>, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration, std::optional<temporal_rs::ArithmeticOverflow> overflow) const;
Expand Down Expand Up @@ -105,11 +103,11 @@ class PlainDate {

inline std::optional<int32_t> era_year() const;

inline diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError> to_date_time(const temporal_rs::PlainTime* time) const;
inline diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError> to_plain_date_time(const temporal_rs::PlainTime* time) const;

inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> to_month_day() const;
inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> to_plain_month_day() const;

inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> to_year_month() const;
inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> to_plain_year_month() const;

inline std::string to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const;

Expand Down
32 changes: 12 additions & 20 deletions temporal_capi/bindings/cpp/temporal_rs/PlainDate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ namespace capi {

bool temporal_rs_PlainDate_is_valid(const temporal_rs::capi::PlainDate* self);

int32_t temporal_rs_PlainDate_days_until(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainDate* other);

typedef struct temporal_rs_PlainDate_add_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_add_result;
temporal_rs_PlainDate_add_result temporal_rs_PlainDate_add(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow);

Expand Down Expand Up @@ -104,14 +102,14 @@ namespace capi {
typedef struct temporal_rs_PlainDate_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDate_era_year_result;
temporal_rs_PlainDate_era_year_result temporal_rs_PlainDate_era_year(const temporal_rs::capi::PlainDate* self);

typedef struct temporal_rs_PlainDate_to_date_time_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_date_time_result;
temporal_rs_PlainDate_to_date_time_result temporal_rs_PlainDate_to_date_time(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainTime* time);
typedef struct temporal_rs_PlainDate_to_plain_date_time_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_date_time_result;
temporal_rs_PlainDate_to_plain_date_time_result temporal_rs_PlainDate_to_plain_date_time(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainTime* time);

typedef struct temporal_rs_PlainDate_to_month_day_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_month_day_result;
temporal_rs_PlainDate_to_month_day_result temporal_rs_PlainDate_to_month_day(const temporal_rs::capi::PlainDate* self);
typedef struct temporal_rs_PlainDate_to_plain_month_day_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_month_day_result;
temporal_rs_PlainDate_to_plain_month_day_result temporal_rs_PlainDate_to_plain_month_day(const temporal_rs::capi::PlainDate* self);

typedef struct temporal_rs_PlainDate_to_year_month_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_year_month_result;
temporal_rs_PlainDate_to_year_month_result temporal_rs_PlainDate_to_year_month(const temporal_rs::capi::PlainDate* self);
typedef struct temporal_rs_PlainDate_to_plain_year_month_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_year_month_result;
temporal_rs_PlainDate_to_plain_year_month_result temporal_rs_PlainDate_to_plain_year_month(const temporal_rs::capi::PlainDate* self);

void temporal_rs_PlainDate_to_ixdtf_string(const temporal_rs::capi::PlainDate* self, temporal_rs::capi::DisplayCalendar display_calendar, diplomat::capi::DiplomatWrite* write);

Expand Down Expand Up @@ -191,12 +189,6 @@ inline bool temporal_rs::PlainDate::is_valid() const {
return result;
}

inline int32_t temporal_rs::PlainDate::days_until(const temporal_rs::PlainDate& other) const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_days_until(this->AsFFI(),
other.AsFFI());
return result;
}

inline diplomat::result<std::unique_ptr<temporal_rs::PlainDate>, temporal_rs::TemporalError> temporal_rs::PlainDate::add(const temporal_rs::Duration& duration, std::optional<temporal_rs::ArithmeticOverflow> overflow) const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_add(this->AsFFI(),
duration.AsFFI(),
Expand Down Expand Up @@ -306,19 +298,19 @@ inline std::optional<int32_t> temporal_rs::PlainDate::era_year() const {
return result.is_ok ? std::optional<int32_t>(result.ok) : std::nullopt;
}

inline diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_date_time(const temporal_rs::PlainTime* time) const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_date_time(this->AsFFI(),
inline diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_date_time(const temporal_rs::PlainTime* time) const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_date_time(this->AsFFI(),
time ? time->AsFFI() : nullptr);
return result.is_ok ? diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError>(diplomat::Ok<std::unique_ptr<temporal_rs::PlainDateTime>>(std::unique_ptr<temporal_rs::PlainDateTime>(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError>(diplomat::Err<temporal_rs::TemporalError>(temporal_rs::TemporalError::FromFFI(result.err)));
}

inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_month_day() const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_month_day(this->AsFFI());
inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_month_day() const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_month_day(this->AsFFI());
return result.is_ok ? diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError>(diplomat::Ok<std::unique_ptr<temporal_rs::PlainMonthDay>>(std::unique_ptr<temporal_rs::PlainMonthDay>(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError>(diplomat::Err<temporal_rs::TemporalError>(temporal_rs::TemporalError::FromFFI(result.err)));
}

inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_year_month() const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_year_month(this->AsFFI());
inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_year_month() const {
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_year_month(this->AsFFI());
return result.is_ok ? diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError>(diplomat::Ok<std::unique_ptr<temporal_rs::PlainYearMonth>>(std::unique_ptr<temporal_rs::PlainYearMonth>(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError>(diplomat::Err<temporal_rs::TemporalError>(temporal_rs::TemporalError::FromFFI(result.err)));
}

Expand Down
16 changes: 6 additions & 10 deletions temporal_capi/src/plain_date.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,6 @@ pub mod ffi {
self.0.is_valid()
}

pub fn days_until(&self, other: &Self) -> i32 {
self.0.days_until(&other.0)
}

pub fn add(
&self,
duration: &Duration,
Expand Down Expand Up @@ -213,26 +209,26 @@ pub mod ffi {
self.0.era_year()
}

pub fn to_date_time(
pub fn to_plain_date_time(
&self,
time: Option<&PlainTime>,
) -> Result<Box<PlainDateTime>, TemporalError> {
self.0
.to_date_time(time.map(|t| t.0))
.to_plain_date_time(time.map(|t| t.0))
.map(|x| Box::new(PlainDateTime(x)))
.map_err(Into::into)
}

pub fn to_month_day(&self) -> Result<Box<PlainMonthDay>, TemporalError> {
pub fn to_plain_month_day(&self) -> Result<Box<PlainMonthDay>, TemporalError> {
self.0
.to_month_day()
.to_plain_month_day()
.map(|x| Box::new(PlainMonthDay(x)))
.map_err(Into::into)
}

pub fn to_year_month(&self) -> Result<Box<PlainYearMonth>, TemporalError> {
pub fn to_plain_year_month(&self) -> Result<Box<PlainYearMonth>, TemporalError> {
self.0
.to_year_month()
.to_plain_year_month()
.map(|x| Box::new(PlainYearMonth(x)))
.map_err(Into::into)
}
Expand Down