Skip to content

Commit 6a223e1

Browse files
authored
Adjustments to toPlainYearMonth and toPlainMonthDay methods on PlainDate (#237)
Closes #204 This PR updates a couple methods on `PlainDate` and adjusts the implementation of `PlainDate::to_plain_year_month`. Both `to_plain_year_month` and `to_plain_month_day` are passing 100% of tests in Boa. This PR also removes `PlainDate::days_until` from being pub. There's not clear reason why it was made public, so it's been made private.
1 parent 30b531c commit 6a223e1

File tree

4 files changed

+51
-54
lines changed

4 files changed

+51
-54
lines changed

src/builtins/core/date.rs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,15 @@ impl PlainDate {
350350
DifferenceOperation::Since => Ok(result.negated()),
351351
}
352352
}
353+
354+
/// Abstract operation `DaysUntil`
355+
///
356+
/// Calculates the epoch days between two `Date`s
357+
#[inline]
358+
#[must_use]
359+
fn days_until(&self, other: &Self) -> i32 {
360+
other.iso.to_epoch_days() - self.iso.to_epoch_days()
361+
}
353362
}
354363

355364
// ==== Public API ====
@@ -477,16 +486,6 @@ impl PlainDate {
477486
self.iso.is_valid()
478487
}
479488

480-
// TODO: make private
481-
/// `DaysUntil`
482-
///
483-
/// Calculates the epoch days between two `Date`s
484-
#[inline]
485-
#[must_use]
486-
pub fn days_until(&self, other: &Self) -> i32 {
487-
other.iso.to_epoch_days() - self.iso.to_epoch_days()
488-
}
489-
490489
/// Compares one `PlainDate` to another `PlainDate` using their
491490
/// `IsoDate` representation.
492491
///
@@ -620,24 +619,36 @@ impl PlainDate {
620619
///
621620
/// If no time is provided, then the time will default to midnight.
622621
#[inline]
623-
pub fn to_date_time(&self, time: Option<PlainTime>) -> TemporalResult<PlainDateTime> {
622+
pub fn to_plain_date_time(&self, time: Option<PlainTime>) -> TemporalResult<PlainDateTime> {
624623
let time = time.unwrap_or_default();
625624
let iso = IsoDateTime::new(self.iso, time.iso)?;
626625
Ok(PlainDateTime::new_unchecked(iso, self.calendar().clone()))
627626
}
628627

629-
/// Converts the current `Date<C>` into a `PlainYearMonth`
628+
/// Converts the current `Date` into a `PlainYearMonth`
630629
#[inline]
631-
pub fn to_year_month(&self) -> TemporalResult<PlainYearMonth> {
632-
self.calendar().year_month_from_partial(
633-
&PartialDate::default().with_fallback_date(self)?,
634-
ArithmeticOverflow::Constrain,
635-
)
630+
pub fn to_plain_year_month(&self) -> TemporalResult<PlainYearMonth> {
631+
// TODO: Migrate to `PartialYearMonth`
632+
let era = self
633+
.era()
634+
.map(|e| {
635+
TinyAsciiStr::<19>::try_from_utf8(e.as_bytes())
636+
.map_err(|e| TemporalError::general(format!("{e}")))
637+
})
638+
.transpose()?;
639+
let partial = PartialDate::new()
640+
.with_year(Some(self.year()))
641+
.with_era(era)
642+
.with_era_year(self.era_year())
643+
.with_month(Some(self.month()))
644+
.with_month_code(Some(self.month_code()));
645+
self.calendar()
646+
.year_month_from_partial(&partial, ArithmeticOverflow::Constrain)
636647
}
637648

638-
/// Converts the current `Date<C>` into a `PlainMonthDay`
649+
/// Converts the current `Date` into a `PlainMonthDay`
639650
#[inline]
640-
pub fn to_month_day(&self) -> TemporalResult<PlainMonthDay> {
651+
pub fn to_plain_month_day(&self) -> TemporalResult<PlainMonthDay> {
641652
self.calendar().month_day_from_partial(
642653
&PartialDate::default().with_fallback_date(self)?,
643654
ArithmeticOverflow::Constrain,

temporal_capi/bindings/cpp/temporal_rs/PlainDate.d.hpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ class PlainDate {
6565

6666
inline bool is_valid() const;
6767

68-
inline int32_t days_until(const temporal_rs::PlainDate& other) const;
69-
7068
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;
7169

7270
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;
@@ -105,11 +103,11 @@ class PlainDate {
105103

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

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

110-
inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> to_month_day() const;
108+
inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> to_plain_month_day() const;
111109

112-
inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> to_year_month() const;
110+
inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> to_plain_year_month() const;
113111

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

temporal_capi/bindings/cpp/temporal_rs/PlainDate.hpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ namespace capi {
5656

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

59-
int32_t temporal_rs_PlainDate_days_until(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainDate* other);
60-
6159
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;
6260
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);
6361

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

107-
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;
108-
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);
105+
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;
106+
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);
109107

110-
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;
111-
temporal_rs_PlainDate_to_month_day_result temporal_rs_PlainDate_to_month_day(const temporal_rs::capi::PlainDate* self);
108+
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;
109+
temporal_rs_PlainDate_to_plain_month_day_result temporal_rs_PlainDate_to_plain_month_day(const temporal_rs::capi::PlainDate* self);
112110

113-
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;
114-
temporal_rs_PlainDate_to_year_month_result temporal_rs_PlainDate_to_year_month(const temporal_rs::capi::PlainDate* self);
111+
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;
112+
temporal_rs_PlainDate_to_plain_year_month_result temporal_rs_PlainDate_to_plain_year_month(const temporal_rs::capi::PlainDate* self);
115113

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

@@ -191,12 +189,6 @@ inline bool temporal_rs::PlainDate::is_valid() const {
191189
return result;
192190
}
193191

194-
inline int32_t temporal_rs::PlainDate::days_until(const temporal_rs::PlainDate& other) const {
195-
auto result = temporal_rs::capi::temporal_rs_PlainDate_days_until(this->AsFFI(),
196-
other.AsFFI());
197-
return result;
198-
}
199-
200192
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 {
201193
auto result = temporal_rs::capi::temporal_rs_PlainDate_add(this->AsFFI(),
202194
duration.AsFFI(),
@@ -306,19 +298,19 @@ inline std::optional<int32_t> temporal_rs::PlainDate::era_year() const {
306298
return result.is_ok ? std::optional<int32_t>(result.ok) : std::nullopt;
307299
}
308300

309-
inline diplomat::result<std::unique_ptr<temporal_rs::PlainDateTime>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_date_time(const temporal_rs::PlainTime* time) const {
310-
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_date_time(this->AsFFI(),
301+
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 {
302+
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_date_time(this->AsFFI(),
311303
time ? time->AsFFI() : nullptr);
312304
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)));
313305
}
314306

315-
inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_month_day() const {
316-
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_month_day(this->AsFFI());
307+
inline diplomat::result<std::unique_ptr<temporal_rs::PlainMonthDay>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_month_day() const {
308+
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_month_day(this->AsFFI());
317309
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)));
318310
}
319311

320-
inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_year_month() const {
321-
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_year_month(this->AsFFI());
312+
inline diplomat::result<std::unique_ptr<temporal_rs::PlainYearMonth>, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_year_month() const {
313+
auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_year_month(this->AsFFI());
322314
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)));
323315
}
324316

temporal_capi/src/plain_date.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,6 @@ pub mod ffi {
114114
self.0.is_valid()
115115
}
116116

117-
pub fn days_until(&self, other: &Self) -> i32 {
118-
self.0.days_until(&other.0)
119-
}
120-
121117
pub fn add(
122118
&self,
123119
duration: &Duration,
@@ -213,26 +209,26 @@ pub mod ffi {
213209
self.0.era_year()
214210
}
215211

216-
pub fn to_date_time(
212+
pub fn to_plain_date_time(
217213
&self,
218214
time: Option<&PlainTime>,
219215
) -> Result<Box<PlainDateTime>, TemporalError> {
220216
self.0
221-
.to_date_time(time.map(|t| t.0))
217+
.to_plain_date_time(time.map(|t| t.0))
222218
.map(|x| Box::new(PlainDateTime(x)))
223219
.map_err(Into::into)
224220
}
225221

226-
pub fn to_month_day(&self) -> Result<Box<PlainMonthDay>, TemporalError> {
222+
pub fn to_plain_month_day(&self) -> Result<Box<PlainMonthDay>, TemporalError> {
227223
self.0
228-
.to_month_day()
224+
.to_plain_month_day()
229225
.map(|x| Box::new(PlainMonthDay(x)))
230226
.map_err(Into::into)
231227
}
232228

233-
pub fn to_year_month(&self) -> Result<Box<PlainYearMonth>, TemporalError> {
229+
pub fn to_plain_year_month(&self) -> Result<Box<PlainYearMonth>, TemporalError> {
234230
self.0
235-
.to_year_month()
231+
.to_plain_year_month()
236232
.map(|x| Box::new(PlainYearMonth(x)))
237233
.map_err(Into::into)
238234
}

0 commit comments

Comments
 (0)