1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 07:07:34 +00:00

LibLocale: Add a method to convert LocaleID to a String

This commit is contained in:
Timothy Flynn 2023-01-19 07:41:47 -05:00 committed by Linus Groh
parent f3c6510b83
commit 618714e29a
2 changed files with 32 additions and 22 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021-2022, Tim Flynn <trflynn89@serenityos.org> * Copyright (c) 2021-2023, Tim Flynn <trflynn89@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -933,53 +933,62 @@ DeprecatedString LanguageID::to_deprecated_string() const
return MUST(to_string()).to_deprecated_string(); return MUST(to_string()).to_deprecated_string();
} }
DeprecatedString LocaleID::to_deprecated_string() const ErrorOr<String> LocaleID::to_string() const
{ {
StringBuilder builder; StringBuilder builder;
auto append_segment = [&](Optional<DeprecatedString> const& segment) { auto append_segment = [&](Optional<DeprecatedString> const& segment) -> ErrorOr<void> {
if (!segment.has_value() || segment->is_empty()) if (!segment.has_value() || segment->is_empty())
return; return {};
if (!builder.is_empty()) if (!builder.is_empty())
builder.append('-'); TRY(builder.try_append('-'));
builder.append(*segment); TRY(builder.try_append(*segment));
return {};
}; };
append_segment(language_id.to_deprecated_string()); TRY(append_segment(language_id.to_deprecated_string()));
for (auto const& extension : extensions) { for (auto const& extension : extensions) {
extension.visit( TRY(extension.visit(
[&](LocaleExtension const& ext) { [&](LocaleExtension const& ext) -> ErrorOr<void> {
builder.append("-u"sv); builder.append("-u"sv);
for (auto const& attribute : ext.attributes) for (auto const& attribute : ext.attributes)
append_segment(attribute); TRY(append_segment(attribute));
for (auto const& keyword : ext.keywords) { for (auto const& keyword : ext.keywords) {
append_segment(keyword.key); TRY(append_segment(keyword.key));
append_segment(keyword.value); TRY(append_segment(keyword.value));
} }
return {};
}, },
[&](TransformedExtension const& ext) { [&](TransformedExtension const& ext) -> ErrorOr<void> {
builder.append("-t"sv); builder.append("-t"sv);
if (ext.language.has_value()) if (ext.language.has_value())
append_segment(ext.language->to_deprecated_string()); TRY(append_segment(ext.language->to_deprecated_string()));
for (auto const& field : ext.fields) { for (auto const& field : ext.fields) {
append_segment(field.key); TRY(append_segment(field.key));
append_segment(field.value); TRY(append_segment(field.value));
} }
return {};
}, },
[&](OtherExtension const& ext) { [&](OtherExtension const& ext) -> ErrorOr<void> {
builder.appendff("-{}", ext.key); builder.appendff("-{}", ext.key);
append_segment(ext.value); TRY(append_segment(ext.value));
}); return {};
}));
} }
if (!private_use_extensions.is_empty()) { if (!private_use_extensions.is_empty()) {
builder.append("-x"sv); builder.append("-x"sv);
for (auto const& extension : private_use_extensions) for (auto const& extension : private_use_extensions)
append_segment(extension); TRY(append_segment(extension));
} }
return builder.build(); return builder.to_string();
}
DeprecatedString LocaleID::to_deprecated_string() const
{
return MUST(to_string()).to_deprecated_string();
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021-2022, Tim Flynn <trflynn89@serenityos.org> * Copyright (c) 2021-2023, Tim Flynn <trflynn89@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -58,6 +58,7 @@ struct OtherExtension {
using Extension = AK::Variant<LocaleExtension, TransformedExtension, OtherExtension>; using Extension = AK::Variant<LocaleExtension, TransformedExtension, OtherExtension>;
struct LocaleID { struct LocaleID {
ErrorOr<String> to_string() const;
DeprecatedString to_deprecated_string() const; DeprecatedString to_deprecated_string() const;
template<typename ExtensionType> template<typename ExtensionType>