From 75366484983f9de77b39a4f97ee7435983908ba4 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 22 Aug 2023 16:41:36 -0400 Subject: [PATCH] LibLocale+LibJS+ClockSettings: Make date time format APIs infallible These APIs only perform small allocations, and are only used by LibJS and the time zone settings widget. Callers which could only have failed from these APIs are also made to be infallible here. --- .../LibLocale/GenerateDateTimeFormatData.cpp | 108 +++++++++--------- .../LibLocale/GenerateLocaleData.cpp | 4 +- Tests/LibLocale/TestDateTimeFormat.cpp | 6 +- .../ClockSettings/TimeZoneSettingsWidget.cpp | 4 +- .../LibJS/Runtime/Intl/DateTimeFormat.cpp | 87 +++++++------- .../Intl/DateTimeFormatConstructor.cpp | 8 +- .../Libraries/LibJS/Runtime/Intl/Locale.cpp | 8 +- .../Libraries/LibLocale/DateTimeFormat.cpp | 104 ++++++++--------- Userland/Libraries/LibLocale/DateTimeFormat.h | 45 ++++---- 9 files changed, 183 insertions(+), 191 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp index 56f7ed98cc..9eb5fb687a 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp @@ -1793,13 +1793,13 @@ static void convert_calendar_fields(SourceType const& source, TargetType& target } struct CalendarPatternImpl { - ErrorOr to_unicode_calendar_pattern() const { + CalendarPattern to_unicode_calendar_pattern() const { CalendarPattern calendar_pattern {}; - calendar_pattern.skeleton = TRY(String::from_utf8(decode_string(skeleton))); - calendar_pattern.pattern = TRY(String::from_utf8(decode_string(pattern))); + calendar_pattern.skeleton = MUST(String::from_utf8(decode_string(skeleton))); + calendar_pattern.pattern = MUST(String::from_utf8(decode_string(pattern))); if (pattern12 != 0) - calendar_pattern.pattern12 = TRY(String::from_utf8(decode_string(pattern12))); + calendar_pattern.pattern12 = MUST(String::from_utf8(decode_string(pattern12))); convert_calendar_fields(*this, calendar_pattern); return calendar_pattern; @@ -1823,14 +1823,14 @@ struct CalendarPatternImpl { }; struct CalendarRangePatternImpl { - ErrorOr to_unicode_calendar_range_pattern() const { + CalendarRangePattern to_unicode_calendar_range_pattern() const { CalendarRangePattern calendar_range_pattern {}; if (field != -1) calendar_range_pattern.field = static_cast(field); - calendar_range_pattern.start_range = TRY(String::from_utf8(decode_string(start_range))); + calendar_range_pattern.start_range = MUST(String::from_utf8(decode_string(start_range))); calendar_range_pattern.separator = decode_string(separator); - calendar_range_pattern.end_range = TRY(String::from_utf8(decode_string(end_range))); + calendar_range_pattern.end_range = MUST(String::from_utf8(decode_string(end_range))); convert_calendar_fields(*this, calendar_range_pattern); return calendar_range_pattern; @@ -1863,13 +1863,13 @@ struct CalendarRangePatternImpl { generator.append(R"~~~( struct CalendarFormatImpl { - ErrorOr to_unicode_calendar_format() const { + CalendarFormat to_unicode_calendar_format() const { CalendarFormat calendar_format {}; - calendar_format.full_format = TRY(s_calendar_patterns[full_format].to_unicode_calendar_pattern()); - calendar_format.long_format = TRY(s_calendar_patterns[long_format].to_unicode_calendar_pattern()); - calendar_format.medium_format = TRY(s_calendar_patterns[medium_format].to_unicode_calendar_pattern()); - calendar_format.short_format = TRY(s_calendar_patterns[short_format].to_unicode_calendar_pattern()); + calendar_format.full_format = s_calendar_patterns[full_format].to_unicode_calendar_pattern(); + calendar_format.long_format = s_calendar_patterns[long_format].to_unicode_calendar_pattern(); + calendar_format.medium_format = s_calendar_patterns[medium_format].to_unicode_calendar_pattern(); + calendar_format.short_format = s_calendar_patterns[short_format].to_unicode_calendar_pattern(); return calendar_format; } @@ -2045,11 +2045,11 @@ static Optional keyword_to_calendar(KeywordCalendar keyword) } } -ErrorOr> get_regional_hour_cycles(StringView region) +Vector get_regional_hour_cycles(StringView region) { auto region_value = hour_cycle_region_from_string(region); if (!region_value.has_value()) - return Vector {}; + return {}; auto region_index = to_underlying(*region_value); @@ -2057,7 +2057,7 @@ ErrorOr> get_regional_hour_cycles(StringView region) auto const& regional_hour_cycles = s_hour_cycle_lists.at(regional_hour_cycles_index); Vector hour_cycles; - TRY(hour_cycles.try_ensure_capacity(regional_hour_cycles.size())); + hour_cycles.ensure_capacity(regional_hour_cycles.size()); for (auto hour_cycle : regional_hour_cycles) hour_cycles.unchecked_append(static_cast(hour_cycle)); @@ -2125,59 +2125,59 @@ static CalendarData const* find_calendar_data(StringView locale, StringView cale return lookup_calendar(*default_calendar); } -ErrorOr> get_calendar_date_format(StringView locale, StringView calendar) +Optional get_calendar_date_format(StringView locale, StringView calendar) { if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { auto const& formats = s_calendar_formats.at(data->date_formats); - return TRY(formats.to_unicode_calendar_format()); + return formats.to_unicode_calendar_format(); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_time_format(StringView locale, StringView calendar) +Optional get_calendar_time_format(StringView locale, StringView calendar) { if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { auto const& formats = s_calendar_formats.at(data->time_formats); - return TRY(formats.to_unicode_calendar_format()); + return formats.to_unicode_calendar_format(); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_date_time_format(StringView locale, StringView calendar) +Optional get_calendar_date_time_format(StringView locale, StringView calendar) { if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { auto const& formats = s_calendar_formats.at(data->date_time_formats); - return TRY(formats.to_unicode_calendar_format()); + return formats.to_unicode_calendar_format(); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_available_formats(StringView locale, StringView calendar) +Vector get_calendar_available_formats(StringView locale, StringView calendar) { Vector result {}; if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { auto const& available_formats = s_calendar_pattern_lists.at(data->available_formats); - TRY(result.try_ensure_capacity(available_formats.size())); + result.ensure_capacity(available_formats.size()); for (auto const& format : available_formats) - result.unchecked_append(TRY(s_calendar_patterns[format].to_unicode_calendar_pattern())); + result.unchecked_append(s_calendar_patterns[format].to_unicode_calendar_pattern()); } return result; } -ErrorOr> get_calendar_default_range_format(StringView locale, StringView calendar) +Optional get_calendar_default_range_format(StringView locale, StringView calendar) { if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { auto const& pattern = s_calendar_range_patterns[data->default_range_format]; - return TRY(pattern.to_unicode_calendar_range_pattern()); + return pattern.to_unicode_calendar_range_pattern(); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton) +Vector get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton) { Vector result {}; @@ -2188,14 +2188,14 @@ ErrorOr> get_calendar_range_formats(StringView loca auto const& pattern = s_calendar_range_patterns[format]; if (skeleton == decode_string(pattern.skeleton)) - TRY(result.try_append(TRY(pattern.to_unicode_calendar_range_pattern()))); + result.append(pattern.to_unicode_calendar_range_pattern()); } } return result; } -ErrorOr> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton) +Vector get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton) { Vector result {}; @@ -2206,14 +2206,14 @@ ErrorOr> get_calendar_range12_formats(StringView lo auto const& pattern = s_calendar_range_patterns[format]; if (skeleton == decode_string(pattern.skeleton)) - TRY(result.try_append(TRY(pattern.to_unicode_calendar_range_pattern()))); + result.append(pattern.to_unicode_calendar_range_pattern()); } } return result; } -static ErrorOr> find_calendar_symbols(StringView locale, StringView calendar, CalendarSymbol symbol, CalendarPatternStyle style) +static ReadonlySpan<@string_index_type@> find_calendar_symbols(StringView locale, StringView calendar, CalendarSymbol symbol, CalendarPatternStyle style) { if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { auto const& symbols_list = s_calendar_symbol_lists[data->symbols]; @@ -2241,62 +2241,62 @@ static ErrorOr> find_calendar_symbols(StringVi return s_symbol_lists.at(symbol_list_index); } - return ReadonlySpan<@string_index_type@> {}; + return {}; } -ErrorOr> get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Era value) +Optional get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Era value) { - auto symbols = TRY(find_calendar_symbols(locale, calendar, CalendarSymbol::Era, style)); + auto symbols = find_calendar_symbols(locale, calendar, CalendarSymbol::Era, style); if (auto value_index = to_underlying(value); value_index < symbols.size()) { if (auto symbol_index = symbols.at(value_index); symbol_index != 0) - return Optional { decode_string(symbol_index) }; + return decode_string(symbol_index); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Month value) +Optional get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Month value) { - auto symbols = TRY(find_calendar_symbols(locale, calendar, CalendarSymbol::Month, style)); + auto symbols = find_calendar_symbols(locale, calendar, CalendarSymbol::Month, style); if (auto value_index = to_underlying(value); value_index < symbols.size()) { if (auto symbol_index = symbols.at(value_index); symbol_index != 0) - return Optional { decode_string(symbol_index) }; + return decode_string(symbol_index); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Weekday value) +Optional get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Weekday value) { - auto symbols = TRY(find_calendar_symbols(locale, calendar, CalendarSymbol::Weekday, style)); + auto symbols = find_calendar_symbols(locale, calendar, CalendarSymbol::Weekday, style); if (auto value_index = to_underlying(value); value_index < symbols.size()) { if (auto symbol_index = symbols.at(value_index); symbol_index != 0) - return Optional { decode_string(symbol_index) }; + return decode_string(symbol_index); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, DayPeriod value) +Optional get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, DayPeriod value) { - auto symbols = TRY(find_calendar_symbols(locale, calendar, CalendarSymbol::DayPeriod, style)); + auto symbols = find_calendar_symbols(locale, calendar, CalendarSymbol::DayPeriod, style); if (auto value_index = to_underlying(value); value_index < symbols.size()) { if (auto symbol_index = symbols.at(value_index); symbol_index != 0) - return Optional { decode_string(symbol_index) }; + return decode_string(symbol_index); } - return OptionalNone {}; + return {}; } -ErrorOr> get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour) +Optional get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour) { auto locale_value = locale_from_string(locale); if (!locale_value.has_value()) - return OptionalNone {}; + return {}; auto locale_index = to_underlying(*locale_value) - 1; // Subtract 1 because 0 == Locale::None. diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp index 23495e31e6..4937170dc2 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateLocaleData.cpp @@ -1680,7 +1680,7 @@ Optional get_preferred_keyword_value_for_locale(StringView locale, S // FIXME: Calendar keywords are also region-based, and will need to be handled here when we support non-Gregorian calendars: // https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-core/supplemental/calendarPreferenceData.json if (key == "hc"sv) { - auto hour_cycles = MUST(get_locale_hour_cycles(locale)); + auto hour_cycles = get_locale_hour_cycles(locale); if (hour_cycles.is_empty()) return OptionalNone {}; @@ -1709,7 +1709,7 @@ Vector get_keywords_for_locale(StringView locale, StringView key) // FIXME: Calendar keywords are also region-based, and will need to be handled here when we support non-Gregorian calendars: // https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-core/supplemental/calendarPreferenceData.json if (key == "hc"sv) { - auto hour_cycles = MUST(get_locale_hour_cycles(locale)); + auto hour_cycles = get_locale_hour_cycles(locale); Vector values; values.ensure_capacity(hour_cycles.size()); diff --git a/Tests/LibLocale/TestDateTimeFormat.cpp b/Tests/LibLocale/TestDateTimeFormat.cpp index 62a8b7f557..0941fdb492 100644 --- a/Tests/LibLocale/TestDateTimeFormat.cpp +++ b/Tests/LibLocale/TestDateTimeFormat.cpp @@ -75,7 +75,7 @@ TEST_CASE(time_zone_name) constexpr auto jan_1_2022 = AK::UnixDateTime::from_seconds_since_epoch(1640995200); // Saturday, January 1, 2022 12:00:00 AM for (auto const& test : test_data) { - auto time_zone = MUST(Locale::format_time_zone(test.locale, test.time_zone, test.style, jan_1_2022)); + auto time_zone = Locale::format_time_zone(test.locale, test.time_zone, test.style, jan_1_2022); EXPECT_EQ(time_zone, test.expected_result); } } @@ -125,7 +125,7 @@ TEST_CASE(time_zone_name_dst) constexpr auto sep_19_2022 = AK::UnixDateTime::from_seconds_since_epoch(1663553728); // Monday, September 19, 2022 2:15:28 AM for (auto const& test : test_data) { - auto time_zone = MUST(Locale::format_time_zone(test.locale, test.time_zone, test.style, sep_19_2022)); + auto time_zone = Locale::format_time_zone(test.locale, test.time_zone, test.style, sep_19_2022); EXPECT_EQ(time_zone, test.expected_result); } } @@ -182,7 +182,7 @@ TEST_CASE(format_time_zone_offset) }; for (auto const& test : test_data) { - auto time_zone = MUST(Locale::format_time_zone(test.locale, test.time_zone, test.style, test.time)); + auto time_zone = Locale::format_time_zone(test.locale, test.time_zone, test.style, test.time); EXPECT_EQ(time_zone, test.expected_result); } } diff --git a/Userland/Applications/ClockSettings/TimeZoneSettingsWidget.cpp b/Userland/Applications/ClockSettings/TimeZoneSettingsWidget.cpp index 6e18da766f..4cffade8c3 100644 --- a/Userland/Applications/ClockSettings/TimeZoneSettingsWidget.cpp +++ b/Userland/Applications/ClockSettings/TimeZoneSettingsWidget.cpp @@ -135,8 +135,8 @@ void TimeZoneSettingsWidget::set_time_zone_location() auto locale = Locale::default_locale(); auto now = AK::UnixDateTime::now(); - auto name = Locale::format_time_zone(locale, m_time_zone, Locale::CalendarPatternStyle::Long, now).release_value_but_fixme_should_propagate_errors(); - auto offset = Locale::format_time_zone(locale, m_time_zone, Locale::CalendarPatternStyle::LongOffset, now).release_value_but_fixme_should_propagate_errors(); + auto name = Locale::format_time_zone(locale, m_time_zone, Locale::CalendarPatternStyle::Long, now); + auto offset = Locale::format_time_zone(locale, m_time_zone, Locale::CalendarPatternStyle::LongOffset, now); m_time_zone_text = DeprecatedString::formatted("{}\n({})", name, offset); } diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp index 99a1cd91fe..4a2e8aaddb 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp @@ -73,8 +73,8 @@ ThrowCompletionOr> date_time_style_format(VM ::Locale::CalendarPattern time_format {}; ::Locale::CalendarPattern date_format {}; - auto get_pattern = [&](auto type, auto style) -> ThrowCompletionOr> { - auto formats = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_format(data_locale, date_time_format.calendar(), type)); + auto get_pattern = [&](auto type, auto style) -> Optional<::Locale::CalendarPattern> { + auto formats = ::Locale::get_calendar_format(data_locale, date_time_format.calendar(), type); if (formats.has_value()) { switch (style) { @@ -89,14 +89,14 @@ ThrowCompletionOr> date_time_style_format(VM } } - return OptionalNone {}; + return {}; }; // 1. If timeStyle is not undefined, then if (date_time_format.has_time_style()) { // a. Assert: timeStyle is one of "full", "long", "medium", or "short". // b. Let timeFormat be styles.[[TimeFormat]].[[]]. - auto pattern = MUST_OR_THROW_OOM(get_pattern(::Locale::CalendarFormatType::Time, date_time_format.time_style())); + auto pattern = get_pattern(::Locale::CalendarFormatType::Time, date_time_format.time_style()); if (!pattern.has_value()) return OptionalNone {}; @@ -107,7 +107,7 @@ ThrowCompletionOr> date_time_style_format(VM if (date_time_format.has_date_style()) { // a. Assert: dateStyle is one of "full", "long", "medium", or "short". // b. Let dateFormat be styles.[[DateFormat]].[[]]. - auto pattern = MUST_OR_THROW_OOM(get_pattern(::Locale::CalendarFormatType::Date, date_time_format.date_style())); + auto pattern = get_pattern(::Locale::CalendarFormatType::Date, date_time_format.date_style()); if (!pattern.has_value()) return OptionalNone {}; @@ -131,7 +131,7 @@ ThrowCompletionOr> date_time_style_format(VM }); // d. Let connector be styles.[[DateTimeFormat]].[[]]. - auto connector = MUST_OR_THROW_OOM(get_pattern(::Locale::CalendarFormatType::DateTime, date_time_format.date_style())); + auto connector = get_pattern(::Locale::CalendarFormatType::DateTime, date_time_format.date_style()); if (!connector.has_value()) return OptionalNone {}; @@ -155,7 +155,7 @@ ThrowCompletionOr> date_time_style_format(VM // NOTE: Our implementation of steps h-j differ from the spec. LibUnicode does not attach range patterns to the // format pattern; rather, lookups for range patterns are performed separately based on the format pattern's // skeleton. So we form a new skeleton here and defer the range pattern lookups. - format.skeleton = TRY_OR_THROW_OOM(vm, ::Locale::combine_skeletons(date_format.skeleton, time_format.skeleton)); + format.skeleton = ::Locale::combine_skeletons(date_format.skeleton, time_format.skeleton); // k. Return format. return format; @@ -424,7 +424,7 @@ static Optional find_calendar_field(StringView name, ::Locale::Ca return {}; } -static ThrowCompletionOr> resolve_day_period(VM& vm, StringView locale, StringView calendar, ::Locale::CalendarPatternStyle style, ReadonlySpan pattern_parts, LocalTime local_time) +static Optional resolve_day_period(StringView locale, StringView calendar, ::Locale::CalendarPatternStyle style, ReadonlySpan pattern_parts, LocalTime local_time) { // Use the "noon" day period if the locale has it, but only if the time is either exactly 12:00.00 or would be displayed as such. if (local_time.hour == 12) { @@ -439,13 +439,13 @@ static ThrowCompletionOr> resolve_day_period(VM& vm, String }); if (it == pattern_parts.end()) { - auto noon_symbol = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_day_period_symbol(locale, calendar, style, ::Locale::DayPeriod::Noon)); + auto noon_symbol = ::Locale::get_calendar_day_period_symbol(locale, calendar, style, ::Locale::DayPeriod::Noon); if (noon_symbol.has_value()) return *noon_symbol; } } - return TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_day_period_symbol_for_hour(locale, calendar, style, local_time.hour)); + return ::Locale::get_calendar_day_period_symbol_for_hour(locale, calendar, style, local_time.hour); } // 11.5.5 FormatDateTimePattern ( dateTimeFormat, patternParts, x, rangeFormatOptions ), https://tc39.es/ecma402/#sec-formatdatetimepattern @@ -552,7 +552,7 @@ ThrowCompletionOr> format_date_time_pattern(VM& vm, Dat auto style = date_time_format.day_period(); // ii. Let fv be a String value representing the day period of tm in the form given by f; the String value depends upon the implementation and the effective locale of dateTimeFormat. - auto symbol = MUST_OR_THROW_OOM(resolve_day_period(vm, data_locale, date_time_format.calendar(), style, pattern_parts, local_time)); + auto symbol = resolve_day_period(data_locale, date_time_format.calendar(), style, pattern_parts, local_time); if (symbol.has_value()) formatted_value = TRY_OR_THROW_OOM(vm, String::from_utf8(*symbol)); @@ -571,7 +571,7 @@ ThrowCompletionOr> format_date_time_pattern(VM& vm, Dat // iii. Let fv be a String value representing v in the form given by f; the String value depends upon the implementation and the effective locale of dateTimeFormat. // The String value may also depend on the value of the [[InDST]] field of tm if f is "short", "long", "shortOffset", or "longOffset". // If the implementation does not have a localized representation of f, then use the String value of v itself. - auto formatted_value = TRY_OR_THROW_OOM(vm, ::Locale::format_time_zone(data_locale, value, style, local_time.time_since_epoch())); + auto formatted_value = ::Locale::format_time_zone(data_locale, value, style, local_time.time_since_epoch()); // iv. Append a new Record { [[Type]]: p, [[Value]]: fv } as the last element of the list result. TRY_OR_THROW_OOM(vm, result.try_append({ "timeZoneName"sv, move(formatted_value) })); @@ -652,11 +652,11 @@ ThrowCompletionOr> format_date_time_pattern(VM& vm, Dat Optional symbol; if (part == "era"sv) - symbol = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_era_symbol(data_locale, date_time_format.calendar(), style, static_cast<::Locale::Era>(value))); + symbol = ::Locale::get_calendar_era_symbol(data_locale, date_time_format.calendar(), style, static_cast<::Locale::Era>(value)); else if (part == "month"sv) - symbol = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_month_symbol(data_locale, date_time_format.calendar(), style, static_cast<::Locale::Month>(value - 1))); + symbol = ::Locale::get_calendar_month_symbol(data_locale, date_time_format.calendar(), style, static_cast<::Locale::Month>(value - 1)); else if (part == "weekday"sv) - symbol = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_weekday_symbol(data_locale, date_time_format.calendar(), style, static_cast<::Locale::Weekday>(value))); + symbol = ::Locale::get_calendar_weekday_symbol(data_locale, date_time_format.calendar(), style, static_cast<::Locale::Weekday>(value)); if (symbol.has_value()) formatted_value = TRY_OR_THROW_OOM(vm, String::from_utf8(*symbol)); @@ -684,13 +684,13 @@ ThrowCompletionOr> format_date_time_pattern(VM& vm, Dat // ii. If v is greater than 11, then if (value > 11) { // 1. Let fv be an implementation and locale dependent String value representing "post meridiem". - auto symbol = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_day_period_symbol(data_locale, date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, ::Locale::DayPeriod::PM)); + auto symbol = ::Locale::get_calendar_day_period_symbol(data_locale, date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, ::Locale::DayPeriod::PM); formatted_value = TRY_OR_THROW_OOM(vm, String::from_utf8(symbol.value_or("PM"sv))); } // iii. Else, else { // 1. Let fv be an implementation and locale dependent String value representing "ante meridiem". - auto symbol = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_day_period_symbol(data_locale, date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, ::Locale::DayPeriod::AM)); + auto symbol = ::Locale::get_calendar_day_period_symbol(data_locale, date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, ::Locale::DayPeriod::AM); formatted_value = TRY_OR_THROW_OOM(vm, String::from_utf8(symbol.value_or("AM"sv))); } @@ -806,30 +806,29 @@ ThrowCompletionOr format_date_time_to_parts(VM& vm, DateTimeFormat& date } template -ThrowCompletionOr for_each_range_pattern_field(LocalTime const& time1, LocalTime const& time2, Callback&& callback) +void for_each_range_pattern_field(LocalTime const& time1, LocalTime const& time2, Callback&& callback) { // Table 4: Range pattern fields, https://tc39.es/ecma402/#table-datetimeformat-rangepatternfields - if (TRY(callback(static_cast(time1.era), static_cast(time2.era), ::Locale::CalendarRangePattern::Field::Era)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.year, time2.year, ::Locale::CalendarRangePattern::Field::Year)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.month, time2.month, ::Locale::CalendarRangePattern::Field::Month)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.day, time2.day, ::Locale::CalendarRangePattern::Field::Day)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.hour, time2.hour, ::Locale::CalendarRangePattern::Field::AmPm)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.hour, time2.hour, ::Locale::CalendarRangePattern::Field::DayPeriod)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.hour, time2.hour, ::Locale::CalendarRangePattern::Field::Hour)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.minute, time2.minute, ::Locale::CalendarRangePattern::Field::Minute)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.second, time2.second, ::Locale::CalendarRangePattern::Field::Second)) == IterationDecision::Break) - return {}; - if (TRY(callback(time1.millisecond, time2.millisecond, ::Locale::CalendarRangePattern::Field::FractionalSecondDigits)) == IterationDecision::Break) - return {}; - return {}; + if (callback(static_cast(time1.era), static_cast(time2.era), ::Locale::CalendarRangePattern::Field::Era) == IterationDecision::Break) + return; + if (callback(time1.year, time2.year, ::Locale::CalendarRangePattern::Field::Year) == IterationDecision::Break) + return; + if (callback(time1.month, time2.month, ::Locale::CalendarRangePattern::Field::Month) == IterationDecision::Break) + return; + if (callback(time1.day, time2.day, ::Locale::CalendarRangePattern::Field::Day) == IterationDecision::Break) + return; + if (callback(time1.hour, time2.hour, ::Locale::CalendarRangePattern::Field::AmPm) == IterationDecision::Break) + return; + if (callback(time1.hour, time2.hour, ::Locale::CalendarRangePattern::Field::DayPeriod) == IterationDecision::Break) + return; + if (callback(time1.hour, time2.hour, ::Locale::CalendarRangePattern::Field::Hour) == IterationDecision::Break) + return; + if (callback(time1.minute, time2.minute, ::Locale::CalendarRangePattern::Field::Minute) == IterationDecision::Break) + return; + if (callback(time1.second, time2.second, ::Locale::CalendarRangePattern::Field::Second) == IterationDecision::Break) + return; + if (callback(time1.millisecond, time2.millisecond, ::Locale::CalendarRangePattern::Field::FractionalSecondDigits) == IterationDecision::Break) + return; } template @@ -879,7 +878,7 @@ ThrowCompletionOr> partition_date_time_range_ bool pattern_contains_larger_date_field = false; // 11. While dateFieldsPracticallyEqual is true and patternContainsLargerDateField is false, repeat for each row of Table 4 in order, except the header row: - TRY(for_each_range_pattern_field(start_local_time, end_local_time, [&](auto start_value, auto end_value, auto field_name) -> ThrowCompletionOr { + for_each_range_pattern_field(start_local_time, end_local_time, [&](auto start_value, auto end_value, auto field_name) { // a. Let fieldName be the name given in the Range Pattern Field column of the row. // b. If rangePatterns has a field [[]], let rp be rangePatterns.[[]]; else let rp be undefined. @@ -918,10 +917,10 @@ ThrowCompletionOr> partition_date_time_range_ // iii. Else if fieldName is equal to [[DayPeriod]], then case ::Locale::CalendarRangePattern::Field::DayPeriod: { // 1. Let v1 be a String value representing the day period of tm1; the String value depends upon the implementation and the effective locale of dateTimeFormat. - auto start_period = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_day_period_symbol_for_hour(date_time_format.data_locale(), date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, start_value)); + auto start_period = ::Locale::get_calendar_day_period_symbol_for_hour(date_time_format.data_locale(), date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, start_value); // 2. Let v2 be a String value representing the day period of tm2; the String value depends upon the implementation and the effective locale of dateTimeFormat. - auto end_period = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_day_period_symbol_for_hour(date_time_format.data_locale(), date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, end_value)); + auto end_period = ::Locale::get_calendar_day_period_symbol_for_hour(date_time_format.data_locale(), date_time_format.calendar(), ::Locale::CalendarPatternStyle::Short, end_value); // 3. If v1 is not equal to v2, then if (start_period != end_period) { @@ -981,7 +980,7 @@ ThrowCompletionOr> partition_date_time_range_ if (date_fields_practically_equal && !pattern_contains_larger_date_field) return IterationDecision::Continue; return IterationDecision::Break; - })); + }); // 12. If dateFieldsPracticallyEqual is true, then if (date_fields_practically_equal) { @@ -1011,7 +1010,7 @@ ThrowCompletionOr> partition_date_time_range_ // 14. If rangePattern is undefined, then if (!range_pattern.has_value()) { // a. Let rangePattern be rangePatterns.[[Default]]. - range_pattern = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_default_range_format(date_time_format.data_locale(), date_time_format.calendar())); + range_pattern = ::Locale::get_calendar_default_range_format(date_time_format.data_locale(), date_time_format.calendar()); // Non-standard, range_pattern will be empty if Unicode data generation is disabled. if (!range_pattern.has_value()) diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp index bcc6b0d7dc..ce2f3ad2c8 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp @@ -166,7 +166,7 @@ ThrowCompletionOr> create_date_time_format(VM& vm, // 24. Let dataLocaleData be localeData.[[]]. // 25. Let hcDefault be dataLocaleData.[[hourCycle]]. - auto default_hour_cycle = TRY_OR_THROW_OOM(vm, ::Locale::get_default_regional_hour_cycle(data_locale)); + auto default_hour_cycle = ::Locale::get_default_regional_hour_cycle(data_locale); // Non-standard, default_hour_cycle will be empty if Unicode data generation is disabled. if (!default_hour_cycle.has_value()) { @@ -394,7 +394,7 @@ ThrowCompletionOr> create_date_time_format(VM& vm, } // f. Let formats be dataLocaleData.[[formats]].[[]]. - auto formats = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_available_formats(data_locale, date_time_format->calendar())); + auto formats = ::Locale::get_calendar_available_formats(data_locale, date_time_format->calendar()); // g. If matcher is "basic", then if (matcher.as_string().utf8_string_view() == "basic"sv) { @@ -440,7 +440,7 @@ ThrowCompletionOr> create_date_time_format(VM& vm, } // b. Let rangePatterns be bestFormat.[[rangePatterns12]]. - range_patterns = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_range12_formats(data_locale, date_time_format->calendar(), best_format->skeleton)); + range_patterns = ::Locale::get_calendar_range12_formats(data_locale, date_time_format->calendar(), best_format->skeleton); } // 48. Else, else { @@ -448,7 +448,7 @@ ThrowCompletionOr> create_date_time_format(VM& vm, pattern = move(best_format->pattern); // b. Let rangePatterns be bestFormat.[[rangePatterns]]. - range_patterns = TRY_OR_THROW_OOM(vm, ::Locale::get_calendar_range_formats(data_locale, date_time_format->calendar(), best_format->skeleton)); + range_patterns = ::Locale::get_calendar_range_formats(data_locale, date_time_format->calendar(), best_format->skeleton); } // 49. Set dateTimeFormat.[[Pattern]] to pattern. diff --git a/Userland/Libraries/LibJS/Runtime/Intl/Locale.cpp b/Userland/Libraries/LibJS/Runtime/Intl/Locale.cpp index 682bc53633..cd74aabc0c 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/Locale.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/Locale.cpp @@ -208,8 +208,8 @@ static u8 weekday_to_integer(Optional<::Locale::Weekday> weekday, ::Locale::Week static ThrowCompletionOr> weekend_of_locale(VM& vm, StringView locale) { - auto weekend_start = weekday_to_integer(TRY_OR_THROW_OOM(vm, ::Locale::get_locale_weekend_start(locale)), ::Locale::Weekday::Saturday); - auto weekend_end = weekday_to_integer(TRY_OR_THROW_OOM(vm, ::Locale::get_locale_weekend_end(locale)), ::Locale::Weekday::Sunday); + auto weekend_start = weekday_to_integer(::Locale::get_locale_weekend_start(locale), ::Locale::Weekday::Saturday); + auto weekend_end = weekday_to_integer(::Locale::get_locale_weekend_end(locale), ::Locale::Weekday::Sunday); // There currently aren't any regions in the CLDR which wrap around from Sunday (7) to Monday (1). // If this changes, this logic will need to be updated to handle that. @@ -235,8 +235,8 @@ ThrowCompletionOr week_info_of_locale(VM& vm, Locale const& locale_obj // 3. Return a record whose fields are defined by Table 1, with values based on locale. WeekInfo week_info {}; - week_info.minimal_days = TRY_OR_THROW_OOM(vm, ::Locale::get_locale_minimum_days(locale)).value_or(1); - week_info.first_day = weekday_to_integer(TRY_OR_THROW_OOM(vm, ::Locale::get_locale_first_day(locale)), ::Locale::Weekday::Monday); + week_info.minimal_days = ::Locale::get_locale_minimum_days(locale).value_or(1); + week_info.first_day = weekday_to_integer(::Locale::get_locale_first_day(locale), ::Locale::Weekday::Monday); week_info.weekend = MUST_OR_THROW_OOM(weekend_of_locale(vm, locale)); return week_info; diff --git a/Userland/Libraries/LibLocale/DateTimeFormat.cpp b/Userland/Libraries/LibLocale/DateTimeFormat.cpp index fa128b321e..4a8d78fe80 100644 --- a/Userland/Libraries/LibLocale/DateTimeFormat.cpp +++ b/Userland/Libraries/LibLocale/DateTimeFormat.cpp @@ -92,10 +92,10 @@ StringView calendar_pattern_style_to_string(CalendarPatternStyle style) } Optional __attribute__((weak)) hour_cycle_region_from_string(StringView) { return {}; } -ErrorOr> __attribute__((weak)) get_regional_hour_cycles(StringView) { return Vector {}; } +Vector __attribute__((weak)) get_regional_hour_cycles(StringView) { return {}; } -template GetRegionalValues> -static ErrorOr find_regional_values_for_locale(StringView locale, GetRegionalValues&& get_regional_values) +template +static T find_regional_values_for_locale(StringView locale, GetRegionalValues&& get_regional_values) { auto has_value = [](auto const& container) { if constexpr (requires { container.has_value(); }) @@ -104,7 +104,7 @@ static ErrorOr find_regional_values_for_locale(StringView locale, GetRegional return !container.is_empty(); }; - if (auto regional_values = TRY(get_regional_values(locale)); has_value(regional_values)) + if (auto regional_values = get_regional_values(locale); has_value(regional_values)) return regional_values; auto return_default_values = [&]() { return get_regional_values("001"sv); }; @@ -118,35 +118,29 @@ static ErrorOr find_regional_values_for_locale(StringView locale, GetRegional if (!language.has_value() || !language->region.has_value()) return return_default_values(); - if (auto regional_values = TRY(get_regional_values(*language->region)); has_value(regional_values)) + if (auto regional_values = get_regional_values(*language->region); has_value(regional_values)) return regional_values; return return_default_values(); } -template -static ErrorOr find_regional_values_for_locale(StringView locale, GetRegionalValues&& get_regional_values) -{ - return find_regional_values_for_locale(locale, [&](auto region) -> ErrorOr { return get_regional_values(region); }); -} - // https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table -ErrorOr> get_locale_hour_cycles(StringView locale) +Vector get_locale_hour_cycles(StringView locale) { return find_regional_values_for_locale>(locale, get_regional_hour_cycles); } -ErrorOr> get_default_regional_hour_cycle(StringView locale) +Optional get_default_regional_hour_cycle(StringView locale) { - if (auto hour_cycles = TRY(get_locale_hour_cycles(locale)); !hour_cycles.is_empty()) + if (auto hour_cycles = get_locale_hour_cycles(locale); !hour_cycles.is_empty()) return hour_cycles.first(); - return OptionalNone {}; + return {}; } Optional __attribute__((weak)) minimum_days_region_from_string(StringView) { return {}; } Optional __attribute__((weak)) get_regional_minimum_days(StringView) { return {}; } -ErrorOr> get_locale_minimum_days(StringView locale) +Optional get_locale_minimum_days(StringView locale) { return find_regional_values_for_locale>(locale, get_regional_minimum_days); } @@ -154,7 +148,7 @@ ErrorOr> get_locale_minimum_days(StringView locale) Optional __attribute__((weak)) first_day_region_from_string(StringView) { return {}; } Optional __attribute__((weak)) get_regional_first_day(StringView) { return {}; } -ErrorOr> get_locale_first_day(StringView locale) +Optional get_locale_first_day(StringView locale) { return find_regional_values_for_locale>(locale, get_regional_first_day); } @@ -162,7 +156,7 @@ ErrorOr> get_locale_first_day(StringView locale) Optional __attribute__((weak)) weekend_start_region_from_string(StringView) { return {}; } Optional __attribute__((weak)) get_regional_weekend_start(StringView) { return {}; } -ErrorOr> get_locale_weekend_start(StringView locale) +Optional get_locale_weekend_start(StringView locale) { return find_regional_values_for_locale>(locale, get_regional_weekend_start); } @@ -170,12 +164,12 @@ ErrorOr> get_locale_weekend_start(StringView locale) Optional __attribute__((weak)) weekend_end_region_from_string(StringView) { return {}; } Optional __attribute__((weak)) get_regional_weekend_end(StringView) { return {}; } -ErrorOr> get_locale_weekend_end(StringView locale) +Optional get_locale_weekend_end(StringView locale) { return find_regional_values_for_locale>(locale, get_regional_weekend_end); } -ErrorOr combine_skeletons(StringView first, StringView second) +String combine_skeletons(StringView first, StringView second) { // https://unicode.org/reports/tr35/tr35-dates.html#availableFormats_appendItems constexpr auto field_order = Array { @@ -193,34 +187,34 @@ ErrorOr combine_skeletons(StringView first, StringView second) StringBuilder builder; - auto append_from_skeleton = [&](auto skeleton, auto ch) -> ErrorOr { + auto append_from_skeleton = [&](auto skeleton, auto ch) { auto first_index = skeleton.find(ch); if (!first_index.has_value()) return false; auto last_index = skeleton.find_last(ch); - TRY(builder.try_append(skeleton.substring_view(*first_index, *last_index - *first_index + 1))); + builder.append(skeleton.substring_view(*first_index, *last_index - *first_index + 1)); return true; }; for (auto fields : field_order) { for (auto ch : fields) { - if (TRY(append_from_skeleton(first, ch))) + if (append_from_skeleton(first, ch)) break; - if (TRY(append_from_skeleton(second, ch))) + if (append_from_skeleton(second, ch)) break; } } - return builder.to_string(); + return MUST(builder.to_string()); } -ErrorOr> __attribute__((weak)) get_calendar_date_format(StringView, StringView) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_time_format(StringView, StringView) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_date_time_format(StringView, StringView) { return OptionalNone {}; } +Optional __attribute__((weak)) get_calendar_date_format(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_calendar_time_format(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_calendar_date_time_format(StringView, StringView) { return {}; } -ErrorOr> get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type) +Optional get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type) { switch (type) { case CalendarFormatType::Date: @@ -234,31 +228,31 @@ ErrorOr> get_calendar_format(StringView locale, StringV } } -ErrorOr> __attribute__((weak)) get_calendar_available_formats(StringView, StringView) { return Vector {}; } -ErrorOr> __attribute__((weak)) get_calendar_default_range_format(StringView, StringView) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_range_formats(StringView, StringView, StringView) { return Vector {}; } -ErrorOr> __attribute__((weak)) get_calendar_range12_formats(StringView, StringView, StringView) { return Vector {}; } -ErrorOr> __attribute__((weak)) get_calendar_era_symbol(StringView, StringView, CalendarPatternStyle, Era) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_month_symbol(StringView, StringView, CalendarPatternStyle, Month) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_weekday_symbol(StringView, StringView, CalendarPatternStyle, Weekday) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_day_period_symbol(StringView, StringView, CalendarPatternStyle, DayPeriod) { return OptionalNone {}; } -ErrorOr> __attribute__((weak)) get_calendar_day_period_symbol_for_hour(StringView, StringView, CalendarPatternStyle, u8) { return OptionalNone {}; } +Vector __attribute__((weak)) get_calendar_available_formats(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_calendar_default_range_format(StringView, StringView) { return {}; } +Vector __attribute__((weak)) get_calendar_range_formats(StringView, StringView, StringView) { return {}; } +Vector __attribute__((weak)) get_calendar_range12_formats(StringView, StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_calendar_era_symbol(StringView, StringView, CalendarPatternStyle, Era) { return {}; } +Optional __attribute__((weak)) get_calendar_month_symbol(StringView, StringView, CalendarPatternStyle, Month) { return {}; } +Optional __attribute__((weak)) get_calendar_weekday_symbol(StringView, StringView, CalendarPatternStyle, Weekday) { return {}; } +Optional __attribute__((weak)) get_calendar_day_period_symbol(StringView, StringView, CalendarPatternStyle, DayPeriod) { return {}; } +Optional __attribute__((weak)) get_calendar_day_period_symbol_for_hour(StringView, StringView, CalendarPatternStyle, u8) { return {}; } Optional __attribute__((weak)) get_time_zone_name(StringView, StringView, CalendarPatternStyle, TimeZone::InDST) { return {}; } Optional __attribute__((weak)) get_time_zone_format(StringView) { return {}; } -static ErrorOr> format_time_zone_offset(StringView locale, CalendarPatternStyle style, i64 offset_seconds) +static Optional format_time_zone_offset(StringView locale, CalendarPatternStyle style, i64 offset_seconds) { auto formats = get_time_zone_format(locale); if (!formats.has_value()) - return OptionalNone {}; + return {}; auto number_system = get_preferred_keyword_value_for_locale(locale, "nu"sv); if (!number_system.has_value()) - return OptionalNone {}; + return {}; if (offset_seconds == 0) - return String::from_utf8(formats->gmt_zero_format); + return MUST(String::from_utf8(formats->gmt_zero_format)); auto sign = offset_seconds > 0 ? formats->symbol_ahead_sign : formats->symbol_behind_sign; auto separator = offset_seconds > 0 ? formats->symbol_ahead_separator : formats->symbol_behind_separator; @@ -271,23 +265,23 @@ static ErrorOr> format_time_zone_offset(StringView locale, Cale offset_seconds %= 60; StringBuilder builder; - TRY(builder.try_append(sign)); + builder.append(sign); switch (style) { // The long format always uses 2-digit hours field and minutes field, with optional 2-digit seconds field. case CalendarPatternStyle::LongOffset: - TRY(builder.try_appendff("{:02}{}{:02}", offset_hours, separator, offset_minutes)); + builder.appendff("{:02}{}{:02}", offset_hours, separator, offset_minutes); if (offset_seconds > 0) - TRY(builder.try_appendff("{}{:02}", separator, offset_seconds)); + builder.appendff("{}{:02}", separator, offset_seconds); break; // The short format is intended for the shortest representation and uses hour fields without leading zero, with optional 2-digit minutes and seconds fields. case CalendarPatternStyle::ShortOffset: - TRY(builder.try_appendff("{}", offset_hours)); + builder.appendff("{}", offset_hours); if (offset_minutes > 0) { - TRY(builder.try_appendff("{}{:02}", separator, offset_minutes)); + builder.appendff("{}{:02}", separator, offset_minutes); if (offset_seconds > 0) - TRY(builder.try_appendff("{}{:02}", separator, offset_seconds)); + builder.appendff("{}{:02}", separator, offset_seconds); } break; @@ -296,16 +290,16 @@ static ErrorOr> format_time_zone_offset(StringView locale, Cale } // The digits used for hours, minutes and seconds fields in this format are the locale's default decimal digits. - auto result = replace_digits_for_number_system(*number_system, TRY(builder.to_string())); - return TRY(String::from_utf8(formats->gmt_format)).replace("{0}"sv, result, ReplaceMode::FirstOnly); + auto result = replace_digits_for_number_system(*number_system, builder.string_view()); + return MUST(MUST(String::from_utf8(formats->gmt_format)).replace("{0}"sv, result, ReplaceMode::FirstOnly)); } // https://unicode.org/reports/tr35/tr35-dates.html#Time_Zone_Format_Terminology -ErrorOr format_time_zone(StringView locale, StringView time_zone, CalendarPatternStyle style, AK::UnixDateTime time) +String format_time_zone(StringView locale, StringView time_zone, CalendarPatternStyle style, AK::UnixDateTime time) { auto offset = TimeZone::get_time_zone_offset(time_zone, time); if (!offset.has_value()) - return String::from_utf8(time_zone); + return MUST(String::from_utf8(time_zone)); switch (style) { case CalendarPatternStyle::Short: @@ -313,14 +307,14 @@ ErrorOr format_time_zone(StringView locale, StringView time_zone, Calend case CalendarPatternStyle::ShortGeneric: case CalendarPatternStyle::LongGeneric: if (auto name = get_time_zone_name(locale, time_zone, style, offset->in_dst); name.has_value()) - return String::from_utf8(*name); + return MUST(String::from_utf8(*name)); break; case CalendarPatternStyle::ShortOffset: case CalendarPatternStyle::LongOffset: - if (auto formatted_offset = TRY(format_time_zone_offset(locale, style, offset->seconds)); formatted_offset.has_value()) + if (auto formatted_offset = format_time_zone_offset(locale, style, offset->seconds); formatted_offset.has_value()) return formatted_offset.release_value(); - return String::from_utf8(time_zone); + return MUST(String::from_utf8(time_zone)); default: VERIFY_NOT_REACHED(); diff --git a/Userland/Libraries/LibLocale/DateTimeFormat.h b/Userland/Libraries/LibLocale/DateTimeFormat.h index 7fe86a8432..91b84b1815 100644 --- a/Userland/Libraries/LibLocale/DateTimeFormat.h +++ b/Userland/Libraries/LibLocale/DateTimeFormat.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include #include @@ -189,44 +188,44 @@ CalendarPatternStyle calendar_pattern_style_from_string(StringView style); StringView calendar_pattern_style_to_string(CalendarPatternStyle style); Optional hour_cycle_region_from_string(StringView hour_cycle_region); -ErrorOr> get_regional_hour_cycles(StringView region); -ErrorOr> get_locale_hour_cycles(StringView locale); -ErrorOr> get_default_regional_hour_cycle(StringView locale); +Vector get_regional_hour_cycles(StringView region); +Vector get_locale_hour_cycles(StringView locale); +Optional get_default_regional_hour_cycle(StringView locale); Optional minimum_days_region_from_string(StringView minimum_days_region); Optional get_regional_minimum_days(StringView region); -ErrorOr> get_locale_minimum_days(StringView locale); +Optional get_locale_minimum_days(StringView locale); Optional first_day_region_from_string(StringView first_day_region); Optional get_regional_first_day(StringView region); -ErrorOr> get_locale_first_day(StringView locale); +Optional get_locale_first_day(StringView locale); Optional weekend_start_region_from_string(StringView weekend_start_region); Optional get_regional_weekend_start(StringView region); -ErrorOr> get_locale_weekend_start(StringView locale); +Optional get_locale_weekend_start(StringView locale); Optional weekend_end_region_from_string(StringView weekend_end_region); Optional get_regional_weekend_end(StringView region); -ErrorOr> get_locale_weekend_end(StringView locale); +Optional get_locale_weekend_end(StringView locale); -ErrorOr combine_skeletons(StringView first, StringView second); +String combine_skeletons(StringView first, StringView second); -ErrorOr> get_calendar_date_format(StringView locale, StringView calendar); -ErrorOr> get_calendar_time_format(StringView locale, StringView calendar); -ErrorOr> get_calendar_date_time_format(StringView locale, StringView calendar); -ErrorOr> get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type); -ErrorOr> get_calendar_available_formats(StringView locale, StringView calendar); -ErrorOr> get_calendar_default_range_format(StringView locale, StringView calendar); -ErrorOr> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton); -ErrorOr> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton); +Optional get_calendar_date_format(StringView locale, StringView calendar); +Optional get_calendar_time_format(StringView locale, StringView calendar); +Optional get_calendar_date_time_format(StringView locale, StringView calendar); +Optional get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type); +Vector get_calendar_available_formats(StringView locale, StringView calendar); +Optional get_calendar_default_range_format(StringView locale, StringView calendar); +Vector get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton); +Vector get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton); -ErrorOr> get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Era value); -ErrorOr> get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Month value); -ErrorOr> get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Weekday value); -ErrorOr> get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, DayPeriod value); -ErrorOr> get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour); +Optional get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Era value); +Optional get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Month value); +Optional get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Weekday value); +Optional get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, DayPeriod value); +Optional get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour); -ErrorOr format_time_zone(StringView locale, StringView time_zone, CalendarPatternStyle style, AK::UnixDateTime time); +String format_time_zone(StringView locale, StringView time_zone, CalendarPatternStyle style, AK::UnixDateTime time); Optional get_time_zone_name(StringView locale, StringView time_zone, CalendarPatternStyle style, TimeZone::InDST in_dst); Optional get_time_zone_format(StringView locale);