mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 06:18:12 +00:00
LibLocale+LibJS: Make locale data APIs infallible
These APIs only perform small allocations, and are only used by LibJS. Callers which could only have failed from these APIs are also made to be infallible here.
This commit is contained in:
parent
a98201f889
commit
cd526813e6
20 changed files with 340 additions and 364 deletions
|
@ -2091,7 +2091,7 @@ Optional<@return_type@> get_regional_@lookup_type@(StringView region)
|
|||
append_regional_lookup("Weekday"sv, "weekend_end"sv);
|
||||
|
||||
generator.append(R"~~~(
|
||||
static ErrorOr<CalendarData const*> find_calendar_data(StringView locale, StringView calendar)
|
||||
static CalendarData const* find_calendar_data(StringView locale, StringView calendar)
|
||||
{
|
||||
auto locale_value = locale_from_string(locale);
|
||||
if (!locale_value.has_value())
|
||||
|
@ -2118,7 +2118,7 @@ static ErrorOr<CalendarData const*> find_calendar_data(StringView locale, String
|
|||
if (auto const* calendar_data = lookup_calendar(calendar))
|
||||
return calendar_data;
|
||||
|
||||
auto default_calendar = TRY(get_preferred_keyword_value_for_locale(locale, "ca"sv));
|
||||
auto default_calendar = get_preferred_keyword_value_for_locale(locale, "ca"sv);
|
||||
if (!default_calendar.has_value())
|
||||
return nullptr;
|
||||
|
||||
|
@ -2127,7 +2127,7 @@ static ErrorOr<CalendarData const*> find_calendar_data(StringView locale, String
|
|||
|
||||
ErrorOr<Optional<CalendarFormat>> get_calendar_date_format(StringView locale, StringView calendar)
|
||||
{
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
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());
|
||||
}
|
||||
|
@ -2136,7 +2136,7 @@ ErrorOr<Optional<CalendarFormat>> get_calendar_date_format(StringView locale, St
|
|||
|
||||
ErrorOr<Optional<CalendarFormat>> get_calendar_time_format(StringView locale, StringView calendar)
|
||||
{
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
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());
|
||||
}
|
||||
|
@ -2145,7 +2145,7 @@ ErrorOr<Optional<CalendarFormat>> get_calendar_time_format(StringView locale, St
|
|||
|
||||
ErrorOr<Optional<CalendarFormat>> get_calendar_date_time_format(StringView locale, StringView calendar)
|
||||
{
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
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());
|
||||
}
|
||||
|
@ -2156,7 +2156,7 @@ ErrorOr<Vector<CalendarPattern>> get_calendar_available_formats(StringView local
|
|||
{
|
||||
Vector<CalendarPattern> result {};
|
||||
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
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()));
|
||||
|
||||
|
@ -2169,7 +2169,7 @@ ErrorOr<Vector<CalendarPattern>> get_calendar_available_formats(StringView local
|
|||
|
||||
ErrorOr<Optional<CalendarRangePattern>> get_calendar_default_range_format(StringView locale, StringView calendar)
|
||||
{
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
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());
|
||||
}
|
||||
|
@ -2181,7 +2181,7 @@ ErrorOr<Vector<CalendarRangePattern>> get_calendar_range_formats(StringView loca
|
|||
{
|
||||
Vector<CalendarRangePattern> result {};
|
||||
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) {
|
||||
auto const& range_formats = s_calendar_range_pattern_lists.at(data->range_formats);
|
||||
|
||||
for (auto format : range_formats) {
|
||||
|
@ -2199,7 +2199,7 @@ ErrorOr<Vector<CalendarRangePattern>> get_calendar_range12_formats(StringView lo
|
|||
{
|
||||
Vector<CalendarRangePattern> result {};
|
||||
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) {
|
||||
auto const& range12_formats = s_calendar_range_pattern_lists.at(data->range12_formats);
|
||||
|
||||
for (auto format : range12_formats) {
|
||||
|
@ -2215,7 +2215,7 @@ ErrorOr<Vector<CalendarRangePattern>> get_calendar_range12_formats(StringView lo
|
|||
|
||||
static ErrorOr<ReadonlySpan<@string_index_type@>> find_calendar_symbols(StringView locale, StringView calendar, CalendarSymbol symbol, CalendarPatternStyle style)
|
||||
{
|
||||
if (auto const* data = TRY(find_calendar_data(locale, calendar)); data != nullptr) {
|
||||
if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) {
|
||||
auto const& symbols_list = s_calendar_symbol_lists[data->symbols];
|
||||
auto symbol_index = to_underlying(symbol);
|
||||
|
||||
|
|
|
@ -1351,18 +1351,18 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~");
|
|||
|
||||
struct CanonicalLanguageID
|
||||
{
|
||||
ErrorOr<LanguageID> to_unicode_language_id() const
|
||||
LanguageID to_unicode_language_id() const
|
||||
{
|
||||
LanguageID language_id {};
|
||||
TRY(language_id.variants.try_ensure_capacity(variants_size));
|
||||
language_id.variants.ensure_capacity(variants_size);
|
||||
|
||||
language_id.language = TRY(String::from_utf8(decode_string(language)));
|
||||
language_id.language = MUST(String::from_utf8(decode_string(language)));
|
||||
if (script != 0)
|
||||
language_id.script = TRY(String::from_utf8(decode_string(script)));
|
||||
language_id.script = MUST(String::from_utf8(decode_string(script)));
|
||||
if (region != 0)
|
||||
language_id.region = TRY(String::from_utf8(decode_string(region)));
|
||||
language_id.region = MUST(String::from_utf8(decode_string(region)));
|
||||
for (size_t i = 0; i < variants_size; ++i)
|
||||
language_id.variants.append(TRY(String::from_utf8(decode_string(variants[i]))));
|
||||
language_id.variants.append(MUST(String::from_utf8(decode_string(variants[i]))));
|
||||
|
||||
return language_id;
|
||||
}
|
||||
|
@ -1674,13 +1674,13 @@ static ReadonlySpan<@string_index_type@> find_keyword_indices(StringView locale,
|
|||
return s_keyword_lists.at(keywords_index);
|
||||
}
|
||||
|
||||
ErrorOr<Optional<StringView>> get_preferred_keyword_value_for_locale(StringView locale, StringView key)
|
||||
Optional<StringView> get_preferred_keyword_value_for_locale(StringView locale, StringView key)
|
||||
{
|
||||
// Hour cycle keywords are region-based rather than locale-based, so they need to be handled specially.
|
||||
// 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 = TRY(get_locale_hour_cycles(locale));
|
||||
auto hour_cycles = MUST(get_locale_hour_cycles(locale));
|
||||
if (hour_cycles.is_empty())
|
||||
return OptionalNone {};
|
||||
|
||||
|
@ -1703,16 +1703,16 @@ ErrorOr<Optional<StringView>> get_preferred_keyword_value_for_locale(StringView
|
|||
return Optional<StringView> { decode_string(keyword_indices[0]) };
|
||||
}
|
||||
|
||||
ErrorOr<Vector<StringView>> get_keywords_for_locale(StringView locale, StringView key)
|
||||
Vector<StringView> get_keywords_for_locale(StringView locale, StringView key)
|
||||
{
|
||||
// Hour cycle keywords are region-based rather than locale-based, so they need to be handled specially.
|
||||
// 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 = TRY(get_locale_hour_cycles(locale));
|
||||
auto hour_cycles = MUST(get_locale_hour_cycles(locale));
|
||||
|
||||
Vector<StringView> values;
|
||||
TRY(values.try_ensure_capacity(hour_cycles.size()));
|
||||
values.ensure_capacity(hour_cycles.size());
|
||||
|
||||
for (auto hour_cycle : hour_cycles)
|
||||
values.unchecked_append(hour_cycle_to_string(hour_cycle));
|
||||
|
@ -1727,7 +1727,7 @@ ErrorOr<Vector<StringView>> get_keywords_for_locale(StringView locale, StringVie
|
|||
auto keyword_indices = find_keyword_indices(locale, key);
|
||||
|
||||
Vector<StringView> keywords;
|
||||
TRY(keywords.try_ensure_capacity(keyword_indices.size()));
|
||||
keywords.ensure_capacity(keyword_indices.size());
|
||||
|
||||
for (auto keyword : keyword_indices)
|
||||
keywords.unchecked_append(decode_string(keyword));
|
||||
|
@ -1798,7 +1798,7 @@ Optional<CharacterOrder> character_order_for_locale(StringView locale)
|
|||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> resolve_complex_language_aliases(LanguageID& language_id)
|
||||
void resolve_complex_language_aliases(LanguageID& language_id)
|
||||
{
|
||||
for (auto const& map : s_complex_alias) {
|
||||
auto key_language = decode_string(map.key.language);
|
||||
|
@ -1814,7 +1814,7 @@ ErrorOr<void> resolve_complex_language_aliases(LanguageID& language_id)
|
|||
if (!map.key.matches_variants(language_id.variants))
|
||||
continue;
|
||||
|
||||
auto alias = TRY(map.alias.to_unicode_language_id());
|
||||
auto alias = map.alias.to_unicode_language_id();
|
||||
|
||||
if (alias.language == "und"sv)
|
||||
alias.language = move(language_id.language);
|
||||
|
@ -1828,11 +1828,9 @@ ErrorOr<void> resolve_complex_language_aliases(LanguageID& language_id)
|
|||
language_id = move(alias);
|
||||
break;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<Optional<LanguageID>> add_likely_subtags(LanguageID const& language_id)
|
||||
Optional<LanguageID> add_likely_subtags(LanguageID const& language_id)
|
||||
{
|
||||
// https://www.unicode.org/reports/tr35/#Likely_Subtags
|
||||
auto const* likely_subtag = resolve_likely_subtag(language_id);
|
||||
|
@ -1849,19 +1847,19 @@ ErrorOr<Optional<LanguageID>> add_likely_subtags(LanguageID const& language_id)
|
|||
auto alias_region = decode_string(likely_subtag->alias.region);
|
||||
|
||||
if (maximized.language == "und"sv)
|
||||
maximized.language = TRY(String::from_utf8(alias_language));
|
||||
maximized.language = MUST(String::from_utf8(alias_language));
|
||||
if (!maximized.script.has_value() || (!key_script.is_empty() && !alias_script.is_empty()))
|
||||
maximized.script = TRY(String::from_utf8(alias_script));
|
||||
maximized.script = MUST(String::from_utf8(alias_script));
|
||||
if (!maximized.region.has_value() || (!key_region.is_empty() && !alias_region.is_empty()))
|
||||
maximized.region = TRY(String::from_utf8(alias_region));
|
||||
maximized.region = MUST(String::from_utf8(alias_region));
|
||||
|
||||
return maximized;
|
||||
}
|
||||
|
||||
ErrorOr<Optional<String>> resolve_most_likely_territory(LanguageID const& language_id)
|
||||
Optional<String> resolve_most_likely_territory(LanguageID const& language_id)
|
||||
{
|
||||
if (auto const* likely_subtag = resolve_likely_subtag(language_id); likely_subtag != nullptr)
|
||||
return String::from_utf8(decode_string(likely_subtag->alias.region));
|
||||
return MUST(String::from_utf8(decode_string(likely_subtag->alias.region)));
|
||||
return OptionalNone {};
|
||||
}
|
||||
|
||||
|
|
|
@ -927,7 +927,7 @@ Optional<ReadonlySpan<u32>> get_digits_for_number_system(StringView system)
|
|||
return s_number_systems_digits[number_system_index];
|
||||
}
|
||||
|
||||
static ErrorOr<NumberSystemData const*> find_number_system(StringView locale, StringView system)
|
||||
static NumberSystemData const* find_number_system(StringView locale, StringView system)
|
||||
{
|
||||
auto locale_value = locale_from_string(locale);
|
||||
if (!locale_value.has_value())
|
||||
|
@ -957,44 +957,44 @@ static ErrorOr<NumberSystemData const*> find_number_system(StringView locale, St
|
|||
if (auto const* number_system = lookup_number_system(system))
|
||||
return number_system;
|
||||
|
||||
auto default_number_system = TRY(get_preferred_keyword_value_for_locale(locale, "nu"sv));
|
||||
auto default_number_system = get_preferred_keyword_value_for_locale(locale, "nu"sv);
|
||||
if (!default_number_system.has_value())
|
||||
return nullptr;
|
||||
|
||||
return lookup_number_system(*default_number_system);
|
||||
}
|
||||
|
||||
ErrorOr<Optional<StringView>> get_number_system_symbol(StringView locale, StringView system, NumericSymbol symbol)
|
||||
Optional<StringView> get_number_system_symbol(StringView locale, StringView system, NumericSymbol symbol)
|
||||
{
|
||||
if (auto const* number_system = TRY(find_number_system(locale, system)); number_system != nullptr) {
|
||||
if (auto const* number_system = find_number_system(locale, system); number_system != nullptr) {
|
||||
auto symbols = s_numeric_symbol_lists.at(number_system->symbols);
|
||||
|
||||
auto symbol_index = to_underlying(symbol);
|
||||
if (symbol_index >= symbols.size())
|
||||
return OptionalNone {};
|
||||
return {};
|
||||
|
||||
return Optional<StringView> { decode_string(symbols[symbol_index]) };
|
||||
return decode_string(symbols[symbol_index]);
|
||||
}
|
||||
|
||||
return OptionalNone {};
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<Optional<NumberGroupings>> get_number_system_groupings(StringView locale, StringView system)
|
||||
Optional<NumberGroupings> get_number_system_groupings(StringView locale, StringView system)
|
||||
{
|
||||
auto locale_value = locale_from_string(locale);
|
||||
if (!locale_value.has_value())
|
||||
return OptionalNone {};
|
||||
return {};
|
||||
|
||||
u8 minimum_grouping_digits = s_minimum_grouping_digits[to_underlying(*locale_value) - 1];
|
||||
|
||||
if (auto const* number_system = TRY(find_number_system(locale, system)); number_system != nullptr)
|
||||
if (auto const* number_system = find_number_system(locale, system); number_system != nullptr)
|
||||
return NumberGroupings { minimum_grouping_digits, number_system->primary_grouping_size, number_system->secondary_grouping_size };
|
||||
return OptionalNone {};
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<Optional<NumberFormat>> get_standard_number_system_format(StringView locale, StringView system, StandardNumberFormatType type)
|
||||
{
|
||||
if (auto const* number_system = TRY(find_number_system(locale, system)); number_system != nullptr) {
|
||||
if (auto const* number_system = find_number_system(locale, system); number_system != nullptr) {
|
||||
@number_format_index_type@ format_index = 0;
|
||||
|
||||
switch (type) {
|
||||
|
@ -1025,7 +1025,7 @@ ErrorOr<Vector<NumberFormat>> get_compact_number_system_formats(StringView local
|
|||
{
|
||||
Vector<NumberFormat> formats;
|
||||
|
||||
if (auto const* number_system = TRY(find_number_system(locale, system)); number_system != nullptr) {
|
||||
if (auto const* number_system = find_number_system(locale, system); number_system != nullptr) {
|
||||
@number_format_list_index_type@ number_format_list_index { 0 };
|
||||
|
||||
switch (type) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue