Skip to content

Commit d6ed946

Browse files
committed
Merge branch 'main' into add-offset-struct
2 parents b3eebc3 + f2b335c commit d6ed946

File tree

17 files changed

+379
-189
lines changed

17 files changed

+379
-189
lines changed

src/builtins/compiled/zoneddatetime.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
ArithmeticOverflow, DifferenceSettings, Disambiguation, DisplayCalendar, DisplayOffset,
66
DisplayTimeZone, OffsetDisambiguation, ToStringRoundingOptions,
77
},
8-
Duration, PlainDate, PlainDateTime, PlainTime, TemporalError, TemporalResult,
8+
Duration, MonthCode, PlainDate, PlainDateTime, PlainTime, TemporalError, TemporalResult,
99
};
1010
use alloc::string::String;
1111
use tinystr::TinyAsciiStr;
@@ -58,7 +58,7 @@ impl ZonedDateTime {
5858
/// Returns the `ZonedDateTime`'s calendar month code.
5959
///
6060
/// Enable with the `compiled_data` feature flag.
61-
pub fn month_code(&self) -> TemporalResult<TinyAsciiStr<4>> {
61+
pub fn month_code(&self) -> TemporalResult<MonthCode> {
6262
let provider = TZ_PROVIDER
6363
.lock()
6464
.map_err(|_| TemporalError::general("Unable to acquire lock"))?;

src/builtins/core/calendar.rs

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,6 @@
33
//! The goal of the calendar module of `boa_temporal` is to provide
44
//! Temporal compatible calendar implementations.
55
6-
// TODO: It may finally be time to clean up API to use `IsoDate` and `DateDuration` directly.
7-
8-
use alloc::string::String;
9-
use alloc::vec::Vec;
10-
use core::str::FromStr;
11-
use icu_calendar::types::{Era as IcuEra, MonthCode as IcuMonthCode, MonthInfo, YearInfo};
12-
136
use crate::{
147
builtins::core::{
158
duration::{DateDuration, TimeDuration},
@@ -20,7 +13,9 @@ use crate::{
2013
parsers::parse_allowed_calendar_formats,
2114
TemporalError, TemporalResult,
2215
};
16+
use core::str::FromStr;
2317

18+
use icu_calendar::types::{Era as IcuEra, MonthCode as IcuMonthCode, MonthInfo, YearInfo};
2419
use icu_calendar::{
2520
any_calendar::AnyDateInner,
2621
cal::{
@@ -40,8 +35,8 @@ use super::{PartialDate, ZonedDateTime};
4035
mod era;
4136
mod types;
4237

43-
pub use types::ResolvedCalendarFields;
44-
pub(crate) use types::{ascii_four_to_integer, month_to_month_code};
38+
pub(crate) use types::{month_to_month_code, ResolutionType};
39+
pub use types::{MonthCode, ResolvedCalendarFields};
4540

4641
use era::EraInfo;
4742

@@ -226,13 +221,14 @@ impl Calendar {
226221
partial: &PartialDate,
227222
overflow: ArithmeticOverflow,
228223
) -> TemporalResult<PlainDate> {
229-
let resolved_fields = ResolvedCalendarFields::try_from_partial(partial, overflow)?;
224+
let resolved_fields =
225+
ResolvedCalendarFields::try_from_partial(partial, overflow, ResolutionType::Date)?;
230226

231227
if self.is_iso() {
232228
// Resolve month and monthCode;
233229
return PlainDate::new_with_overflow(
234230
resolved_fields.era_year.year,
235-
resolved_fields.month_code.as_iso_month_integer()?,
231+
resolved_fields.month_code.to_month_integer(),
236232
resolved_fields.day,
237233
self.clone(),
238234
overflow,
@@ -264,10 +260,11 @@ impl Calendar {
264260
partial: &PartialDate,
265261
overflow: ArithmeticOverflow,
266262
) -> TemporalResult<PlainMonthDay> {
267-
let resolved_fields = ResolvedCalendarFields::try_from_partial(partial, overflow)?;
263+
let resolved_fields =
264+
ResolvedCalendarFields::try_from_partial(partial, overflow, ResolutionType::MonthDay)?;
268265
if self.is_iso() {
269266
return PlainMonthDay::new_with_overflow(
270-
resolved_fields.month_code.as_iso_month_integer()?,
267+
resolved_fields.month_code.to_month_integer(),
271268
resolved_fields.day,
272269
self.clone(),
273270
overflow,
@@ -286,11 +283,12 @@ impl Calendar {
286283
partial: &PartialDate,
287284
overflow: ArithmeticOverflow,
288285
) -> TemporalResult<PlainYearMonth> {
289-
let resolved_fields = ResolvedCalendarFields::try_from_partial(partial, overflow)?;
286+
let resolved_fields =
287+
ResolvedCalendarFields::try_from_partial(partial, overflow, ResolutionType::YearMonth)?;
290288
if self.is_iso() {
291289
return PlainYearMonth::new_with_overflow(
292290
resolved_fields.era_year.year,
293-
resolved_fields.month_code.as_iso_month_integer()?,
291+
resolved_fields.month_code.to_month_integer(),
294292
Some(resolved_fields.day),
295293
self.clone(),
296294
overflow,
@@ -360,7 +358,6 @@ impl Calendar {
360358
let date_duration = one.diff_iso_date(two, largest_unit)?;
361359
return Ok(Duration::from(date_duration));
362360
}
363-
364361
Err(TemporalError::range().with_message("Not yet implemented."))
365362
}
366363

@@ -396,56 +393,57 @@ impl Calendar {
396393
if self.is_iso() {
397394
return Ok(iso_date.month);
398395
}
399-
400-
Err(TemporalError::range().with_message("Not yet implemented."))
396+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
397+
Ok(self.0.month(&calendar_date).month_number())
401398
}
402399

403400
/// `CalendarMonthCode`
404-
pub fn month_code(&self, iso_date: &IsoDate) -> TemporalResult<TinyAsciiStr<4>> {
401+
pub fn month_code(&self, iso_date: &IsoDate) -> TemporalResult<MonthCode> {
405402
if self.is_iso() {
406-
return Ok(iso_date.as_icu4x()?.month().standard_code.0);
403+
let mc = iso_date.as_icu4x()?.month().standard_code.0;
404+
return Ok(MonthCode(mc));
407405
}
408-
409-
Err(TemporalError::range().with_message("Not yet implemented."))
406+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
407+
Ok(MonthCode(self.0.month(&calendar_date).standard_code.0))
410408
}
411409

412410
/// `CalendarDay`
413411
pub fn day(&self, iso_date: &IsoDate) -> TemporalResult<u8> {
414412
if self.is_iso() {
415413
return Ok(iso_date.day);
416414
}
417-
418-
Err(TemporalError::range().with_message("Not yet implemented."))
415+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
416+
Ok(self.0.day_of_month(&calendar_date).0)
419417
}
420418

421419
/// `CalendarDayOfWeek`
422420
pub fn day_of_week(&self, iso_date: &IsoDate) -> TemporalResult<u16> {
423421
if self.is_iso() {
424422
return Ok(iso_date.as_icu4x()?.day_of_week() as u16);
425423
}
426-
427-
Err(TemporalError::range().with_message("Not yet implemented."))
424+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
425+
// TODO: Understand ICU4X's decision for `IsoWeekDay` to be `i8`
426+
Ok(self.0.day_of_week(&calendar_date) as u16)
428427
}
429428

430429
/// `CalendarDayOfYear`
431430
pub fn day_of_year(&self, iso_date: &IsoDate) -> TemporalResult<u16> {
432431
if self.is_iso() {
433432
return Ok(iso_date.as_icu4x()?.day_of_year_info().day_of_year);
434433
}
435-
Err(TemporalError::range().with_message("Not yet implemented."))?
434+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
435+
Ok(self.0.day_of_year_info(&calendar_date).day_of_year)
436436
}
437437

438438
/// `CalendarWeekOfYear`
439439
pub fn week_of_year(&self, iso_date: &IsoDate) -> TemporalResult<Option<u16>> {
440440
if self.is_iso() {
441441
let date = iso_date.as_icu4x()?;
442-
443442
let week_calculator = WeekCalculator::default();
444-
445443
let week_of = date.week_of_year(&week_calculator);
446-
447444
return Ok(Some(week_of.week as u16));
448445
}
446+
// TODO: Research in ICU4X and determine best approach.
449447
Err(TemporalError::range().with_message("Not yet implemented."))
450448
}
451449

@@ -464,6 +462,7 @@ impl Calendar {
464462
RelativeUnit::Next => Ok(Some(date.year().extended_year + 1)),
465463
};
466464
}
465+
// TODO: Research in ICU4X and determine best approach.
467466
Err(TemporalError::range().with_message("Not yet implemented."))
468467
}
469468

@@ -472,6 +471,7 @@ impl Calendar {
472471
if self.is_iso() {
473472
return Ok(7);
474473
}
474+
// TODO: Research in ICU4X and determine best approach.
475475
Err(TemporalError::range().with_message("Not yet implemented."))
476476
}
477477

@@ -480,40 +480,35 @@ impl Calendar {
480480
if self.is_iso() {
481481
return Ok(iso_date.as_icu4x()?.days_in_month() as u16);
482482
}
483-
Err(TemporalError::range().with_message("Not yet implemented."))
483+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
484+
Ok(self.0.days_in_month(&calendar_date) as u16)
484485
}
485486

486487
/// `CalendarDaysInYear`
487488
pub fn days_in_year(&self, iso_date: &IsoDate) -> TemporalResult<u16> {
488489
if self.is_iso() {
489490
return Ok(iso_date.as_icu4x()?.days_in_year());
490491
}
491-
492-
Err(TemporalError::range().with_message("Not yet implemented."))
492+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
493+
Ok(self.0.days_in_year(&calendar_date))
493494
}
494495

495496
/// `CalendarMonthsInYear`
496-
pub fn months_in_year(&self, _iso_date: &IsoDate) -> TemporalResult<u16> {
497+
pub fn months_in_year(&self, iso_date: &IsoDate) -> TemporalResult<u16> {
497498
if self.is_iso() {
498499
return Ok(12);
499500
}
500-
Err(TemporalError::range().with_message("Not yet implemented."))
501+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
502+
Ok(self.0.months_in_year(&calendar_date) as u16)
501503
}
502504

503505
/// `CalendarInLeapYear`
504506
pub fn in_leap_year(&self, iso_date: &IsoDate) -> TemporalResult<bool> {
505507
if self.is_iso() {
506508
return Ok(iso_date.as_icu4x()?.is_in_leap_year());
507509
}
508-
Err(TemporalError::range().with_message("Not yet implemented."))
509-
}
510-
511-
/// `CalendarFields`
512-
pub fn fields(&self, fields: Vec<String>) -> TemporalResult<Vec<String>> {
513-
if self.is_iso() {
514-
return Ok(fields);
515-
}
516-
Err(TemporalError::range().with_message("Not yet implemented."))
510+
let calendar_date = self.0.date_from_iso(iso_date.as_icu4x()?);
511+
Ok(self.0.is_in_leap_year(&calendar_date))
517512
}
518513

519514
/// Returns the identifier of this calendar slot.

0 commit comments

Comments
 (0)