diff --git a/Cargo.lock b/Cargo.lock index 2115b83c3..4ca81da30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,9 +157,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "calendrical_calculations" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a0b39595c6ee54a8d0900204ba4c401d0ab4eb45adaf07178e8d017541529e7" +checksum = "5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26" dependencies = [ "core_maths", "displaydoc", @@ -431,9 +431,9 @@ dependencies = [ [[package]] name = "icu_calendar" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1012b9ecfa510672c9920645a1247e0ab4037ad149fba52f0daec4c7d07505" +checksum = "baf11bd83ebd0cd319e23a9a9c9a25b564a1fadc3bbc93069b8abc9d8df812bf" dependencies = [ "calendrical_calculations", "displaydoc", @@ -448,18 +448,19 @@ dependencies = [ [[package]] name = "icu_calendar_data" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e28bac68c36104316001a16a5a0ce1822dda530e6ee2e30ca566013a62863c" +checksum = "118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d" [[package]] name = "icu_collections" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f578a71f2bfaf7ceb30b519a645ae48024b45f9eecbe060a31a004d7b4ba9462" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -467,9 +468,9 @@ dependencies = [ [[package]] name = "icu_locale" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77d60c94a44c2eb07640e7b9094e6fa052b6cc1b7ad14c309ae346c7108722e" +checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" dependencies = [ "icu_collections", "icu_locale_core", @@ -482,9 +483,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c219b62bf5a06801012446193fdfcbd7970e876823aba4c62def2ce957dcb44" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -496,15 +497,15 @@ dependencies = [ [[package]] name = "icu_locale_data" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e4b9cb2fa24a06fd4996f38a18a18ae4d5d27b3d1ed98af83dcbb7ee6e914" +checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" [[package]] name = "icu_provider" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64958e359123591ae1f17a27b5fc9ebdb50c98b04e0401146154de1d8fe3e44" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -519,9 +520,9 @@ dependencies = [ [[package]] name = "icu_time" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed0e4cff0e300a0eb97a2962c03425de34a1aba9857ac283794104c46790856" +checksum = "ec3af0c141da0a61d4f6970cd1d5f4b388b17ea22f8124f8f6049d3d5147586a" dependencies = [ "calendrical_calculations", "displaydoc", @@ -536,9 +537,9 @@ dependencies = [ [[package]] name = "icu_time_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e10b0e5e87a2c84bd5fa407705732052edebe69291d347d0c3033785470edbf" +checksum = "6f2f8aeca682d874a5247084aa4fb7d1cef9ba45d889c21209a8818dcaaa0ec9" [[package]] name = "indenter" @@ -579,9 +580,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "ixdtf" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84de9d95a6d2547d9b77ee3f25fa0ee32e3c3a6484d47a55adebc0439c077992" +checksum = "2ceaf4c6c48465bead8cb6a0b7c4ee0c86ecbb31239032b9c66ab9a08d2f3ee1" [[package]] name = "jiff-tzdb" @@ -709,9 +710,9 @@ checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" [[package]] name = "quote" -version = "1.0.40" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -880,6 +881,7 @@ dependencies = [ name = "temporal_rs" version = "0.2.1" dependencies = [ + "calendrical_calculations", "core_maths", "iana-time-zone", "icu_calendar", @@ -917,13 +919,13 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "databake", "displaydoc", - "serde", + "serde_core", "zerovec", ] @@ -1005,6 +1007,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -1228,11 +1236,10 @@ checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -1240,9 +1247,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -1273,9 +1280,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "databake", "displaydoc", @@ -1288,9 +1295,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "databake", "serde", @@ -1301,9 +1308,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 935d7b8fb..e8d8789ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ [workspace.package] edition = "2021" version = "0.2.1" -rust-version = "1.83.0" +rust-version = "1.86.0" authors = ["boa-dev"] license = "MIT OR Apache-2.0" repository = "https://github.com/boa-dev/temporal" @@ -45,7 +45,7 @@ web-time = "1.1.0" # ICU4X tinystr = "0.8.0" -icu_calendar = { version = "~2.1.0", default-features = false, features = ["unstable"] } +icu_calendar = { version = "2.2.0", default-features = false } icu_locale_core = "2.1.0" zerovec = "0.11.0" databake = "0.2.0" @@ -93,6 +93,7 @@ timezone_provider = { workspace = true } # System time feature web-time = { workspace = true, optional = true } iana-time-zone = { workspace = true, optional = true } +calendrical_calculations = "0.2.4" [dev-dependencies] timezone_provider = { workspace = true, features = ["zoneinfo64", "experimental_tzif"] } diff --git a/src/builtins/core/calendar.rs b/src/builtins/core/calendar.rs index 7c0109108..9d9c1ab46 100644 --- a/src/builtins/core/calendar.rs +++ b/src/builtins/core/calendar.rs @@ -18,19 +18,19 @@ use core::str::FromStr; use icu_calendar::{ cal::{ Buddhist, ChineseTraditional, Coptic, Ethiopian, EthiopianEraStyle, Hebrew, Hijri, Indian, - Japanese, JapaneseExtended, KoreanTraditional, Persian, Roc, + Japanese, KoreanTraditional, Persian, Roc, }, AnyCalendar, AnyCalendarKind, Calendar as IcuCalendar, Iso, Ref, }; use icu_calendar::{ cal::{HijriTabularEpoch, HijriTabularLeapYears}, + options::DateDurationUnit as IcuUnit, options::{ DateAddOptions, DateDifferenceOptions, DateFromFieldsOptions, MissingFieldsStrategy, Overflow as IcuOverflow, }, preferences::CalendarAlgorithm, types::DateDuration as IcuDateDuration, - types::DateDurationUnit as IcuUnit, types::DateFields, Gregorian, }; @@ -152,9 +152,12 @@ impl Calendar { const { &AnyCalendar::HijriUmmAlQura(Hijri::new_umm_al_qura()) } } AnyCalendarKind::Iso => &AnyCalendar::Iso(Iso), - AnyCalendarKind::Japanese => const { &AnyCalendar::Japanese(Japanese::new()) }, - AnyCalendarKind::JapaneseExtended => { - const { &AnyCalendar::JapaneseExtended(JapaneseExtended::new()) } + #[allow( + deprecated, + reason = "need to match on JapaneseExtended for exhaustiveness" + )] + AnyCalendarKind::Japanese | AnyCalendarKind::JapaneseExtended => { + const { &AnyCalendar::Japanese(Japanese::new()) } } AnyCalendarKind::Persian => &AnyCalendar::Persian(Persian), AnyCalendarKind::Roc => &AnyCalendar::Roc(Roc), @@ -280,7 +283,7 @@ fn early_constrain_date_duration(duration: &IcuDateDuration) -> Result<(), Tempo if duration.weeks > WEEK_DURATION { return err; } - if duration.days > DAY_DURATION.into() { + if duration.days > DAY_DURATION { return err; } @@ -410,7 +413,7 @@ impl Calendar { let calendar_date = self.0.from_fields(date_fields, options)?; fields = CalendarFields { - month_code: Some(MonthCode(self.0.month(&calendar_date).standard_code.0)), + month_code: Some(MonthCode(self.0.month(&calendar_date).to_input().code().0)), day: Some(self.0.day_of_month(&calendar_date).0), ..Default::default() }; @@ -445,7 +448,7 @@ impl Calendar { if fields.era_year.is_some() || fields.extended_year.is_some() { let mut fields2 = DateFields::default(); fields2.day = Some(self.0.day_of_month(&calendar_date).0); - let code = self.0.month(&calendar_date).standard_code; + let code = self.0.month(&calendar_date).to_input().code(); fields2.month_code = Some(code.0.as_bytes()); calendar_date = self.0.from_fields(fields2, options)?; @@ -527,13 +530,13 @@ impl Calendar { years: u32::try_from(duration.years.abs()).map_err(|_| invalid)?, months: u32::try_from(duration.months.abs()).map_err(|_| invalid)?, weeks: u32::try_from(duration.weeks.abs()).map_err(|_| invalid)?, - days: u64::try_from(duration.days.abs()).map_err(|_| invalid)?, + days: u32::try_from(duration.days.abs()).map_err(|_| invalid)?, }; early_constrain_date_duration(&duration)?; let mut options = DateAddOptions::default(); options.overflow = Some(overflow.into()); - let calendar_date = self.0.from_iso(*date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(date.to_rd()); let added = self.0.add(&calendar_date, duration, options)?; @@ -560,15 +563,12 @@ impl Calendar { } let mut options = DateDifferenceOptions::default(); options.largest_unit = Some(largest_unit.try_into()?); - let calendar_date1 = self.0.from_iso(*one.to_icu4x().inner()); - let calendar_date2 = self.0.from_iso(*two.to_icu4x().inner()); + let calendar_date1 = self.0.from_rata_die(one.to_rd()); + let calendar_date2 = self.0.from_rata_die(two.to_rd()); - let added = self.0.until(&calendar_date1, &calendar_date2, options)?; + let added = self.0.until(&calendar_date1, &calendar_date2, options); - let days = added - .days - .try_into() - .map_err(|_| TemporalError::range().with_enum(ErrorMessage::DurationNotValid))?; + let days = added.days.into(); let mut duration = DateDuration::new( added.years.into(), added.months.into(), @@ -587,7 +587,7 @@ impl Calendar { if self.is_iso() { return None; } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0 .year_info(&calendar_date) .era() @@ -599,7 +599,7 @@ impl Calendar { if self.is_iso() { return None; } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0 .year_info(&calendar_date) .era() @@ -611,7 +611,7 @@ impl Calendar { if self.is_iso() { return iso_date.year; } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.extended_year(&calendar_date) } @@ -620,18 +620,14 @@ impl Calendar { if self.is_iso() { return iso_date.month; } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.month(&calendar_date).ordinal } /// `CalendarMonthCode` pub fn month_code(&self, iso_date: &IsoDate) -> MonthCode { - if self.is_iso() { - let mc = iso_date.to_icu4x().month().standard_code.0; - return MonthCode(mc); - } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); - MonthCode(self.0.month(&calendar_date).standard_code.0) + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); + MonthCode(self.0.month(&calendar_date).to_input().code().0) } /// `CalendarDay` @@ -639,28 +635,25 @@ impl Calendar { if self.is_iso() { return iso_date.day; } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.day_of_month(&calendar_date).0 } /// `CalendarDayOfWeek` pub fn day_of_week(&self, iso_date: &IsoDate) -> u16 { - iso_date.to_icu4x().day_of_week() as u16 + iso_date.to_icu4x_iso().weekday() as u16 } /// `CalendarDayOfYear` pub fn day_of_year(&self, iso_date: &IsoDate) -> u16 { - if self.is_iso() { - return iso_date.to_icu4x().day_of_year().0; - } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.day_of_year(&calendar_date).0 } /// `CalendarWeekOfYear` pub fn week_of_year(&self, iso_date: &IsoDate) -> Option { if self.is_iso() { - return Some(iso_date.to_icu4x().week_of_year().week_number); + return Some(iso_date.to_icu4x_iso().week_of_year().week_number); } // TODO: Research in ICU4X and determine best approach. None @@ -669,7 +662,7 @@ impl Calendar { /// `CalendarYearOfWeek` pub fn year_of_week(&self, iso_date: &IsoDate) -> Option { if self.is_iso() { - return Some(iso_date.to_icu4x().week_of_year().iso_year); + return Some(iso_date.to_icu4x_iso().week_of_year().iso_year); } // TODO: Research in ICU4X and determine best approach. None @@ -682,19 +675,13 @@ impl Calendar { /// `CalendarDaysInMonth` pub fn days_in_month(&self, iso_date: &IsoDate) -> u16 { - if self.is_iso() { - return iso_date.to_icu4x().days_in_month() as u16; - } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.days_in_month(&calendar_date) as u16 } /// `CalendarDaysInYear` pub fn days_in_year(&self, iso_date: &IsoDate) -> u16 { - if self.is_iso() { - return iso_date.to_icu4x().days_in_year(); - } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.days_in_year(&calendar_date) } @@ -703,16 +690,13 @@ impl Calendar { if self.is_iso() { return 12; } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.months_in_year(&calendar_date) as u16 } /// `CalendarInLeapYear` pub fn in_leap_year(&self, iso_date: &IsoDate) -> bool { - if self.is_iso() { - return iso_date.to_icu4x().is_in_leap_year(); - } - let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + let calendar_date = self.0.from_rata_die(iso_date.to_rd()); self.0.is_in_leap_year(&calendar_date) } diff --git a/src/error.rs b/src/error.rs index da7c30d3a..b9c2955cd 100644 --- a/src/error.rs +++ b/src/error.rs @@ -4,8 +4,7 @@ use core::fmt; use ixdtf::ParseError; use timezone_provider::TimeZoneProviderError; -use icu_calendar::cal::AnyCalendarDifferenceError; -use icu_calendar::error::{DateError, DateFromFieldsError, RangeError}; +use icu_calendar::error::{DateAddError, DateFromFieldsError}; /// `TemporalError`'s error type. #[derive(Debug, Default, Clone, Copy, PartialEq)] @@ -150,12 +149,6 @@ impl fmt::Display for TemporalError { } } -impl From for TemporalError { - fn from(error: DateError) -> Self { - TemporalError::range().with_enum(ErrorMessage::Icu4xDate(error)) - } -} - impl From for TemporalError { fn from(error: DateFromFieldsError) -> Self { let kind = if error == DateFromFieldsError::NotEnoughFields { @@ -167,9 +160,9 @@ impl From for TemporalError { } } -impl From for TemporalError { - fn from(error: AnyCalendarDifferenceError) -> Self { - TemporalError::range().with_enum(ErrorMessage::Icu4xUntil(error)) +impl From for TemporalError { + fn from(error: DateAddError) -> Self { + TemporalError::range().with_enum(ErrorMessage::Icu4xDateAdd(error)) } } @@ -227,9 +220,8 @@ pub(crate) enum ErrorMessage { None, String(&'static str), Ixdtf(ParseError), - Icu4xDate(DateError), Icu4xDateFromFields(DateFromFieldsError), - Icu4xUntil(AnyCalendarDifferenceError), + Icu4xDateAdd(DateAddError), } impl ErrorMessage { @@ -276,27 +268,21 @@ impl ErrorMessage { Self::None => "", Self::String(s) => s, Self::Ixdtf(s) => ixdtf_error_to_static_string(s), - Self::Icu4xDate(DateError::Range { field, .. }) - | Self::Icu4xDateFromFields(DateFromFieldsError::Range(RangeError { field, .. })) => { - match field { - "year" => "Year out of range.", - "month" => "Month out of range.", - "day" => "Day out of range.", - _ => "Field out of range.", - } + + Self::Icu4xDateFromFields(DateFromFieldsError::InvalidEra) => "Unknown era.", + Self::Icu4xDateFromFields(DateFromFieldsError::InvalidDay { .. }) + | Self::Icu4xDateAdd(DateAddError::InvalidDay { .. }) => "Day out of range", + Self::Icu4xDateFromFields(DateFromFieldsError::InvalidOrdinalMonth { .. }) => { + "Month out of range" } - Self::Icu4xDate(DateError::UnknownEra) - | Self::Icu4xDateFromFields(DateFromFieldsError::UnknownEra) => "Unknown era.", - Self::Icu4xDate(DateError::UnknownMonthCode(..)) => "Unknown month code.", Self::Icu4xDateFromFields(DateFromFieldsError::MonthCodeInvalidSyntax) => { "Invalid month code." } - Self::Icu4xDateFromFields(DateFromFieldsError::MonthCodeNotInCalendar) => { + Self::Icu4xDateFromFields(DateFromFieldsError::MonthNotInCalendar) => { "Month code not in calendar." } - Self::Icu4xDateFromFields(DateFromFieldsError::MonthCodeNotInYear) => { - "Month code not in year." - } + Self::Icu4xDateFromFields(DateFromFieldsError::MonthNotInYear) + | Self::Icu4xDateAdd(DateAddError::MonthNotInYear) => "Month code not in year.", Self::Icu4xDateFromFields(DateFromFieldsError::InconsistentYear) => { "Inconsistent year." } @@ -306,12 +292,8 @@ impl ErrorMessage { Self::Icu4xDateFromFields(DateFromFieldsError::NotEnoughFields) => { "Insufficient fields." } - Self::Icu4xDate(_) => "Date error.", - Self::Icu4xDateFromFields(_) => "Date error.", - Self::Icu4xUntil(AnyCalendarDifferenceError::MismatchedCalendars) => { - "Mismatched calendars." - } - Self::Icu4xUntil(_) => "Arithmetic error.", + Self::Icu4xDateAdd(DateAddError::Overflow) => "Overflow during addition.", + Self::Icu4xDateFromFields(_) | Self::Icu4xDateAdd(_) => "Date error.", } } } diff --git a/src/iso.rs b/src/iso.rs index f8b383e39..1771a7b34 100644 --- a/src/iso.rs +++ b/src/iso.rs @@ -506,10 +506,12 @@ impl IsoDate { impl IsoDate { /// Creates `[[ISOYear]]`, `[[isoMonth]]`, `[[isoDay]]` fields from `ICU4X`'s `Date` struct. - pub(crate) fn to_icu4x(self) -> IcuDate { - let d = IcuDate::try_new_iso(self.year, self.month, self.day); - debug_assert!(d.is_ok(), "ICU4X ISODate conversion must not fail"); - d.unwrap_or_else(|_| IcuDate::from_rata_die(icu_calendar::types::RataDie::new(0), Iso)) + pub(crate) fn to_icu4x_iso(self) -> IcuDate { + IcuDate::from_rata_die(self.to_rd(), Iso) + } + + pub(crate) fn to_rd(self) -> icu_calendar::types::RataDie { + calendrical_calculations::gregorian::fixed_from_gregorian(self.year, self.month, self.day) } pub(crate) fn from_icu4x(date: ::DateInner) -> Self { @@ -1066,9 +1068,9 @@ mod tests { #[test] fn icu4x_max_conversion_test() { // Test that the max ISO date does not panic on conversion - let _ = IsoDate::new_unchecked(275_760, 9, 13).to_icu4x(); + let _ = IsoDate::new_unchecked(275_760, 9, 13).to_icu4x_iso(); // Test that the min ISO date does not panic on conversion - let _ = IsoDate::new_unchecked(-271_821, 4, 20).to_icu4x(); + let _ = IsoDate::new_unchecked(-271_821, 4, 20).to_icu4x_iso(); } #[test] diff --git a/tools/depcheck/src/main.rs b/tools/depcheck/src/main.rs index 86da7f9d6..c6da9b025 100644 --- a/tools/depcheck/src/main.rs +++ b/tools/depcheck/src/main.rs @@ -180,6 +180,7 @@ pub const BASIC_RUNTIME_DEPS: &[&str] = &[ "libm", "num-traits", "stable_deref_trait", + "utf8_iter", ]; // Most of these should be removed