summaryrefslogtreecommitdiff
path: root/Meta/Lagom
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2023-01-27 10:18:11 -0500
committerLinus Groh <mail@linusgroh.de>2023-01-27 18:00:17 +0000
commitb2097f4059625a6bc8c757c5f6cb3b3fb04644a7 (patch)
tree3fa03f6776bf5d97c73b3522c3206023b8ecdb75 /Meta/Lagom
parent970e9df245627f666307db27728dec39e55752cc (diff)
downloadserenity-b2097f4059625a6bc8c757c5f6cb3b3fb04644a7.zip
LibJS+LibLocale: Port Intl.DateTimeFormat to String
Diffstat (limited to 'Meta/Lagom')
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp207
1 files changed, 112 insertions, 95 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp
index 67ab671002..83d5655e31 100644
--- a/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp
+++ b/Meta/Lagom/Tools/CodeGenerators/LibLocale/GenerateDateTimeFormatData.cpp
@@ -715,7 +715,7 @@ static constexpr auto is_char(char ch)
// "{hour}:{minute} {ampm}" becomes "{hour}:{minute}" (remove the space before {ampm})
// "{ampm} {hour}" becomes "{hour}" (remove the space after {ampm})
// "{hour}:{minute} {ampm} {timeZoneName}" becomes "{hour}:{minute} {timeZoneName}" (remove one of the spaces around {ampm})
-static DeprecatedString remove_period_from_pattern(DeprecatedString pattern)
+static ErrorOr<String> remove_period_from_pattern(String pattern)
{
auto is_surrounding_space = [&](auto code_point_iterator) {
if (code_point_iterator.done())
@@ -738,7 +738,7 @@ static DeprecatedString remove_period_from_pattern(DeprecatedString pattern)
};
for (auto remove : AK::Array { "({ampm})"sv, "{ampm}"sv, "({dayPeriod})"sv, "{dayPeriod}"sv }) {
- auto index = pattern.find(remove);
+ auto index = pattern.find_byte_offset(remove);
if (!index.has_value())
continue;
@@ -751,25 +751,27 @@ static DeprecatedString remove_period_from_pattern(DeprecatedString pattern)
if (auto it = utf8_pattern.iterator_at_byte_offset(*index + remove.length()); it != utf8_pattern.end())
after_removal = it;
+ auto pattern_view = pattern.bytes_as_string_view();
+
if (is_surrounding_space(before_removal) && !is_opening(after_removal)) {
- pattern = DeprecatedString::formatted("{}{}",
- pattern.substring_view(0, *index - before_removal.underlying_code_point_length_in_bytes()),
- pattern.substring_view(*index + remove.length()));
+ pattern = TRY(String::formatted("{}{}",
+ pattern_view.substring_view(0, *index - before_removal.underlying_code_point_length_in_bytes()),
+ pattern_view.substring_view(*index + remove.length())));
} else if (is_surrounding_space(after_removal) && !is_closing(before_removal)) {
- pattern = DeprecatedString::formatted("{}{}",
- pattern.substring_view(0, *index),
- pattern.substring_view(*index + remove.length() + after_removal.underlying_code_point_length_in_bytes()));
+ pattern = TRY(String::formatted("{}{}",
+ pattern_view.substring_view(0, *index),
+ pattern_view.substring_view(*index + remove.length() + after_removal.underlying_code_point_length_in_bytes())));
} else {
- pattern = DeprecatedString::formatted("{}{}",
- pattern.substring_view(0, *index),
- pattern.substring_view(*index + remove.length()));
+ pattern = TRY(String::formatted("{}{}",
+ pattern_view.substring_view(0, *index),
+ pattern_view.substring_view(*index + remove.length())));
}
}
return pattern;
}
-static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pattern, DeprecatedString skeleton, CLDR& cldr)
+static ErrorOr<Optional<CalendarPattern>> parse_date_time_pattern_raw(DeprecatedString pattern, DeprecatedString skeleton, CLDR& cldr)
{
// https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
using Locale::CalendarPatternStyle;
@@ -819,7 +821,7 @@ static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pa
// Quarter
else if (all_of(segment, is_any_of("qQ"sv))) {
// Intl.DateTimeFormat does not support quarter formatting, so drop these patterns.
- return {};
+ return OptionalNone {};
}
// Month
@@ -838,13 +840,13 @@ static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pa
format.month = CalendarPatternStyle::Narrow;
} else if (all_of(segment, is_char('l'))) {
// Using 'l' for month formatting is deprecated by TR-35, ensure it is not used.
- return {};
+ return OptionalNone {};
}
// Week
else if (all_of(segment, is_any_of("wW"sv))) {
// Intl.DateTimeFormat does not support week formatting, so drop these patterns.
- return {};
+ return OptionalNone {};
}
// Day
@@ -876,7 +878,7 @@ static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pa
// TR-35 defines "e", "c", and "cc" as as numeric, and "ee" as 2-digit, but those
// pattern styles are not supported by Intl.DateTimeFormat.
if (segment.length() <= 2)
- return {};
+ return OptionalNone {};
if (segment.length() == 4)
format.weekday = CalendarPatternStyle::Long;
@@ -915,7 +917,7 @@ static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pa
format.hour = CalendarPatternStyle::TwoDigit;
} else if (all_of(segment, is_any_of("jJC"sv))) {
// TR-35 indicates these should not be used.
- return {};
+ return OptionalNone {};
}
// Minute
@@ -943,7 +945,7 @@ static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pa
format.fractional_second_digits = static_cast<u8>(segment.length());
} else if (all_of(segment, is_char('A'))) {
// Intl.DateTimeFormat does not support millisecond formatting, so drop these patterns.
- return {};
+ return OptionalNone {};
}
// Zone
@@ -976,30 +978,30 @@ static Optional<CalendarPattern> parse_date_time_pattern_raw(DeprecatedString pa
}
}
- pattern = builder.build();
+ auto parsed_pattern = TRY(builder.to_string());
if (hour12) {
- format.pattern = remove_period_from_pattern(pattern);
- format.pattern12 = move(pattern);
+ format.pattern = TRY(remove_period_from_pattern(parsed_pattern));
+ format.pattern12 = move(parsed_pattern);
} else {
- format.pattern = move(pattern);
+ format.pattern = move(parsed_pattern);
}
return format;
}
-static Optional<size_t> parse_date_time_pattern(DeprecatedString pattern, DeprecatedString skeleton, CLDR& cldr)
+static ErrorOr<Optional<size_t>> parse_date_time_pattern(DeprecatedString pattern, DeprecatedString skeleton, CLDR& cldr)
{
- auto format = parse_date_time_pattern_raw(move(pattern), move(skeleton), cldr);
+ auto format = TRY(parse_date_time_pattern_raw(move(pattern), move(skeleton), cldr));
if (!format.has_value())
- return {};
+ return OptionalNone {};
- format->pattern_index = cldr.unique_strings.ensure(move(format->pattern));
+ format->pattern_index = cldr.unique_strings.ensure(format->pattern.to_deprecated_string());
if (format->pattern12.has_value())
- format->pattern12_index = cldr.unique_strings.ensure(format->pattern12.release_value());
+ format->pattern12_index = cldr.unique_strings.ensure(format->pattern12->to_deprecated_string());
- return cldr.unique_patterns.ensure(format.release_value());
+ return Optional<size_t> { cldr.unique_patterns.ensure(format.release_value()) };
}
template<typename... Chars>
@@ -1008,7 +1010,7 @@ static constexpr bool char_is_one_of(char ch, Chars&&... chars)
return ((ch == chars) || ...);
}
-static void parse_interval_patterns(Calendar& calendar, JsonObject const& interval_formats_object, CLDR& cldr)
+static ErrorOr<void> parse_interval_patterns(Calendar& calendar, JsonObject const& interval_formats_object, CLDR& cldr)
{
// https://unicode.org/reports/tr35/tr35-dates.html#intervalFormats
CalendarRangePatternList range_formats {};
@@ -1060,28 +1062,29 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv
HashMap<StringView, size_t> partitions;
StringView last_partition;
- auto begin_index = pattern.find('{');
+ auto begin_index = pattern.find_byte_offset('{');
size_t end_index = 0;
while (begin_index.has_value()) {
- end_index = pattern.find('}', *begin_index).value();
+ end_index = pattern.find_byte_offset('}', *begin_index).value();
- auto partition = pattern.substring_view(*begin_index, end_index - *begin_index);
+ auto partition = pattern.bytes_as_string_view().substring_view(*begin_index, end_index - *begin_index);
if (partitions.contains(partition))
break;
partitions.set(partition, *begin_index);
last_partition = partition;
- begin_index = pattern.find('{', end_index + 1);
+ begin_index = pattern.find_byte_offset('{', end_index + 1);
}
VERIFY(begin_index.has_value() && !last_partition.is_empty());
auto start_range_end = partitions.get(last_partition).value() + last_partition.length() + 1;
- auto start_range = pattern.substring_view(0, start_range_end);
- auto separator = pattern.substring_view(start_range_end, *begin_index - start_range_end);
- auto end_range = pattern.substring_view(*begin_index);
+ auto pattern_view = pattern.bytes_as_string_view();
+ auto start_range = pattern_view.substring_view(0, start_range_end);
+ auto separator = pattern_view.substring_view(start_range_end, *begin_index - start_range_end);
+ auto end_range = pattern_view.substring_view(*begin_index);
CalendarRangePattern format {};
format.skeleton_index = cldr.unique_strings.ensure(skeleton);
@@ -1097,21 +1100,21 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv
return format;
};
- interval_formats_object.for_each_member([&](auto const& skeleton, auto const& value) {
+ TRY(interval_formats_object.try_for_each_member([&](auto const& skeleton, auto const& value) -> ErrorOr<void> {
if (skeleton == "intervalFormatFallback"sv) {
auto range_format = split_default_range_pattern(skeleton, value.as_string());
calendar.default_range_format = cldr.unique_range_patterns.ensure(move(range_format));
- return;
+ return {};
}
- value.as_object().for_each_member([&](auto const& field, auto const& pattern) {
+ TRY(value.as_object().try_for_each_member([&](auto const& field, auto const& pattern) -> ErrorOr<void> {
if (field.ends_with("alt-variant"sv))
- return;
+ return {};
VERIFY(field.length() == 1);
auto name = name_of_field(field[0]);
- auto format = parse_date_time_pattern_raw(pattern.as_string(), skeleton, cldr).release_value();
+ auto format = TRY(parse_date_time_pattern_raw(pattern.as_string(), skeleton, cldr)).release_value();
auto range_format = split_range_pattern(skeleton, name, format.pattern, format);
range_formats.append(cldr.unique_range_patterns.ensure(move(range_format)));
@@ -1122,26 +1125,34 @@ static void parse_interval_patterns(Calendar& calendar, JsonObject const& interv
} else {
range12_formats.append(range_formats.last());
}
- });
- });
+
+ return {};
+ }));
+
+ return {};
+ }));
calendar.range_formats = cldr.unique_range_pattern_lists.ensure(move(range_formats));
calendar.range12_formats = cldr.unique_range_pattern_lists.ensure(move(range12_formats));
+
+ return {};
}
-static void generate_default_patterns(CalendarPatternList& formats, CLDR& cldr)
+static ErrorOr<void> generate_default_patterns(CalendarPatternList& formats, CLDR& cldr)
{
// For compatibility with ICU, we generate a list of default patterns for every locale:
// https://github.com/unicode-org/icu/blob/release-71-1/icu4c/source/i18n/dtptngen.cpp#L1343-L1354=
static constexpr auto default_patterns = Array { "G"sv, "y"sv, "M"sv, "E"sv, "D"sv, "F"sv, "d"sv, "a"sv, "B"sv, "H"sv, "mm"sv, "ss"sv, "SS"sv, "v"sv };
for (auto pattern : default_patterns) {
- auto index = parse_date_time_pattern(pattern, pattern, cldr);
+ auto index = TRY(parse_date_time_pattern(pattern, pattern, cldr));
VERIFY(index.has_value());
if (!formats.contains_slow(*index))
formats.append(*index);
}
+
+ return {};
}
static void generate_missing_patterns(Calendar& calendar, CalendarPatternList& formats, Vector<CalendarPattern> date_formats, Vector<CalendarPattern> time_formats, CLDR& cldr)
@@ -1390,12 +1401,12 @@ static ErrorOr<void> parse_calendars(DeprecatedString locale_calendars_path, CLD
auto const& dates_object = locale_object.get_object("dates"sv).value();
auto const& calendars_object = dates_object.get_object("calendars"sv).value();
- auto parse_patterns = [&](auto const& patterns_object, auto const& skeletons_object, Vector<CalendarPattern>* patterns) {
- auto parse_pattern = [&](auto name) {
+ auto parse_patterns = [&](auto const& patterns_object, auto const& skeletons_object, Vector<CalendarPattern>* patterns) -> ErrorOr<size_t> {
+ auto parse_pattern = [&](auto name) -> ErrorOr<size_t> {
auto format = patterns_object.get_deprecated_string(name);
auto skeleton = skeletons_object.get_deprecated_string(name);
- auto format_index = parse_date_time_pattern(format.value(), skeleton.value_or(DeprecatedString::empty()), cldr).value();
+ auto format_index = TRY(parse_date_time_pattern(format.value(), skeleton.value_or(DeprecatedString::empty()), cldr)).value();
if (patterns)
patterns->append(cldr.unique_patterns.get(format_index));
@@ -1404,19 +1415,19 @@ static ErrorOr<void> parse_calendars(DeprecatedString locale_calendars_path, CLD
};
CalendarFormat formats {};
- formats.full_format = parse_pattern("full"sv);
- formats.long_format = parse_pattern("long"sv);
- formats.medium_format = parse_pattern("medium"sv);
- formats.short_format = parse_pattern("short"sv);
+ formats.full_format = TRY(parse_pattern("full"sv));
+ formats.long_format = TRY(parse_pattern("long"sv));
+ formats.medium_format = TRY(parse_pattern("medium"sv));
+ formats.short_format = TRY(parse_pattern("short"sv));
return cldr.unique_formats.ensure(move(formats));
};
- calendars_object.for_each_member([&](auto const& calendar_name, JsonValue const& value) {
+ TRY(calendars_object.try_for_each_member([&](auto const& calendar_name, JsonValue const& value) -> ErrorOr<void> {
// The generic calendar is not a supported Unicode calendar key, so skip it:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#unicode_calendar_keys
if (calendar_name == "generic"sv)
- return;
+ return {};
Calendar calendar {};
CalendarPatternList available_formats {};
@@ -1429,21 +1440,21 @@ static ErrorOr<void> parse_calendars(DeprecatedString locale_calendars_path, CLD
auto const& date_formats_object = value.as_object().get_object("dateFormats"sv).value();
auto const& date_skeletons_object = value.as_object().get_object("dateSkeletons"sv).value();
- calendar.date_formats = parse_patterns(date_formats_object, date_skeletons_object, &date_formats);
+ calendar.date_formats = TRY(parse_patterns(date_formats_object, date_skeletons_object, &date_formats));
auto const& time_formats_object = value.as_object().get_object("timeFormats"sv).value();
auto const& time_skeletons_object = value.as_object().get_object("timeSkeletons"sv).value();
- calendar.time_formats = parse_patterns(time_formats_object, time_skeletons_object, &time_formats);
+ calendar.time_formats = TRY(parse_patterns(time_formats_object, time_skeletons_object, &time_formats));
auto const& standard_date_time_formats_object = value.as_object().get_object("dateTimeFormats-atTime"sv)->get_object("standard"sv).value();
- calendar.date_time_formats = parse_patterns(standard_date_time_formats_object, JsonObject {}, nullptr);
+ calendar.date_time_formats = TRY(parse_patterns(standard_date_time_formats_object, JsonObject {}, nullptr));
auto const& date_time_formats_object = value.as_object().get_object("dateTimeFormats"sv).value();
auto const& available_formats_object = date_time_formats_object.get_object("availableFormats"sv).value();
- available_formats_object.for_each_member([&](auto const& skeleton, JsonValue const& pattern) {
- auto pattern_index = parse_date_time_pattern(pattern.as_string(), skeleton, cldr);
+ TRY(available_formats_object.try_for_each_member([&](auto const& skeleton, JsonValue const& pattern) -> ErrorOr<void> {
+ auto pattern_index = TRY(parse_date_time_pattern(pattern.as_string(), skeleton, cldr));
if (!pattern_index.has_value())
- return;
+ return {};
auto const& format = cldr.unique_patterns.get(*pattern_index);
if (format.contains_only_date_fields())
@@ -1453,18 +1464,22 @@ static ErrorOr<void> parse_calendars(DeprecatedString locale_calendars_path, CLD
if (!available_formats.contains_slow(*pattern_index))
available_formats.append(*pattern_index);
- });
+
+ return {};
+ }));
auto const& interval_formats_object = date_time_formats_object.get_object("intervalFormats"sv).value();
- parse_interval_patterns(calendar, interval_formats_object, cldr);
+ TRY(parse_interval_patterns(calendar, interval_formats_object, cldr));
- generate_default_patterns(available_formats, cldr);
+ TRY(generate_default_patterns(available_formats, cldr));
generate_missing_patterns(calendar, available_formats, move(date_formats), move(time_formats), cldr);
parse_calendar_symbols(calendar, value.as_object(), cldr);
calendar.available_formats = cldr.unique_pattern_lists.ensure(move(available_formats));
locale.calendars.set(calendar_name, cldr.unique_calendars.ensure(move(calendar)));
- });
+
+ return {};
+ }));
return {};
}
@@ -1736,7 +1751,9 @@ static ErrorOr<void> generate_unicode_locale_implementation(Core::Stream::Buffer
generator.append(R"~~~(
#include <AK/Array.h>
#include <AK/BinarySearch.h>
+#include <AK/Error.h>
#include <AK/Optional.h>
+#include <AK/String.h>
#include <AK/StringView.h>
#include <LibLocale/DateTimeFormat.h>
#include <LibLocale/DateTimeFormatData.h>
@@ -1778,13 +1795,13 @@ static void convert_calendar_fields(SourceType const& source, TargetType& target
}
struct CalendarPatternImpl {
- CalendarPattern to_unicode_calendar_pattern() const {
+ ErrorOr<CalendarPattern> to_unicode_calendar_pattern() const {
CalendarPattern calendar_pattern {};
- calendar_pattern.skeleton = decode_string(skeleton);
- calendar_pattern.pattern = decode_string(pattern);
+ calendar_pattern.skeleton = TRY(String::from_utf8(decode_string(skeleton)));
+ calendar_pattern.pattern = TRY(String::from_utf8(decode_string(pattern)));
if (pattern12 != 0)
- calendar_pattern.pattern12 = decode_string(pattern12);
+ calendar_pattern.pattern12 = TRY(String::from_utf8(decode_string(pattern12)));
convert_calendar_fields(*this, calendar_pattern);
return calendar_pattern;
@@ -1808,14 +1825,14 @@ struct CalendarPatternImpl {
};
struct CalendarRangePatternImpl {
- CalendarRangePattern to_unicode_calendar_range_pattern() const {
+ ErrorOr<CalendarRangePattern> to_unicode_calendar_range_pattern() const {
CalendarRangePattern calendar_range_pattern {};
if (field != -1)
calendar_range_pattern.field = static_cast<CalendarRangePattern::Field>(field);
- calendar_range_pattern.start_range = decode_string(start_range);
+ calendar_range_pattern.start_range = TRY(String::from_utf8(decode_string(start_range)));
calendar_range_pattern.separator = decode_string(separator);
- calendar_range_pattern.end_range = decode_string(end_range);
+ calendar_range_pattern.end_range = TRY(String::from_utf8(decode_string(end_range)));
convert_calendar_fields(*this, calendar_range_pattern);
return calendar_range_pattern;
@@ -1848,13 +1865,13 @@ struct CalendarRangePatternImpl {
generator.append(R"~~~(
struct CalendarFormatImpl {
- CalendarFormat to_unicode_calendar_format() const {
+ ErrorOr<CalendarFormat> to_unicode_calendar_format() const {
CalendarFormat calendar_format {};
- 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();
+ 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());
return calendar_format;
}
@@ -2110,59 +2127,59 @@ static CalendarData const* find_calendar_data(StringView locale, StringView cale
return lookup_calendar(*default_calendar);
}
-Optional<CalendarFormat> get_calendar_date_format(StringView locale, StringView calendar)
+ErrorOr<Optional<CalendarFormat>> 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 formats.to_unicode_calendar_format();
+ return TRY(formats.to_unicode_calendar_format());
}
- return {};
+ return OptionalNone {};
}
-Optional<CalendarFormat> get_calendar_time_format(StringView locale, StringView calendar)
+ErrorOr<Optional<CalendarFormat>> 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 formats.to_unicode_calendar_format();
+ return TRY(formats.to_unicode_calendar_format());
}
- return {};
+ return OptionalNone {};
}
-Optional<CalendarFormat> get_calendar_date_time_format(StringView locale, StringView calendar)
+ErrorOr<Optional<CalendarFormat>> 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 formats.to_unicode_calendar_format();
+ return TRY(formats.to_unicode_calendar_format());
}
- return {};
+ return OptionalNone {};
}
-Vector<CalendarPattern> get_calendar_available_formats(StringView locale, StringView calendar)
+ErrorOr<Vector<CalendarPattern>> get_calendar_available_formats(StringView locale, StringView calendar)
{
Vector<CalendarPattern> result {};
if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) {
auto const& available_formats = s_calendar_pattern_lists.at(data->available_formats);
- result.ensure_capacity(available_formats.size());
+ TRY(result.try_ensure_capacity(available_formats.size()));
for (auto const& format : available_formats)
- result.unchecked_append(s_calendar_patterns[format].to_unicode_calendar_pattern());
+ result.unchecked_append(TRY(s_calendar_patterns[format].to_unicode_calendar_pattern()));
}
return result;
}
-Optional<CalendarRangePattern> get_calendar_default_range_format(StringView locale, StringView calendar)
+ErrorOr<Optional<CalendarRangePattern>> 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 pattern.to_unicode_calendar_range_pattern();
+ return TRY(pattern.to_unicode_calendar_range_pattern());
}
- return {};
+ return OptionalNone {};
}
-Vector<CalendarRangePattern> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton)
+ErrorOr<Vector<CalendarRangePattern>> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton)
{
Vector<CalendarRangePattern> result {};
@@ -2173,14 +2190,14 @@ Vector<CalendarRangePattern> get_calendar_range_formats(StringView locale, Strin
auto const& pattern = s_calendar_range_patterns[format];
if (skeleton == decode_string(pattern.skeleton))
- result.append(pattern.to_unicode_calendar_range_pattern());
+ TRY(result.try_append(TRY(pattern.to_unicode_calendar_range_pattern())));
}
}
return result;
}
-Vector<CalendarRangePattern> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton)
+ErrorOr<Vector<CalendarRangePattern>> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton)
{
Vector<CalendarRangePattern> result {};
@@ -2191,7 +2208,7 @@ Vector<CalendarRangePattern> get_calendar_range12_formats(StringView locale, Str
auto const& pattern = s_calendar_range_patterns[format];
if (skeleton == decode_string(pattern.skeleton))
- result.append(pattern.to_unicode_calendar_range_pattern());
+ TRY(result.try_append(TRY(pattern.to_unicode_calendar_range_pattern())));
}
}