Parcourir la source

LibUnicode: Add helper lambda for appending canonicalized strings

Once canonical extensions are implemented, the number of:

    if (optional_string.has_value() {
        builder.append('-');
        builder.append(optional_string->to_lowercase_string());
    }

Will be quite large. This commit just adds a helper lambda to handle
this pattern to prevent this function from becoming even more enormous.
Timothy Flynn il y a 3 ans
Parent
commit
671eaa0c59
1 fichiers modifiés avec 26 ajouts et 15 suppressions
  1. 26 15
      Userland/Libraries/LibUnicode/Locale.cpp

+ 26 - 15
Userland/Libraries/LibUnicode/Locale.cpp

@@ -485,27 +485,38 @@ Optional<String> canonicalize_unicode_locale_id(LocaleID& locale_id)
     // https://unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers
     StringBuilder builder;
 
+    enum class Case {
+        Upper,
+        Lower,
+        Title,
+    };
+
+    auto append_sep_and_string = [&](Optional<StringView> const& string, Case case_ = Case::Lower) {
+        if (!string.has_value())
+            return;
+        switch (case_) {
+        case Case::Upper:
+            builder.appendff("-{}", string->to_uppercase_string());
+            break;
+        case Case::Lower:
+            builder.appendff("-{}", string->to_lowercase_string());
+            break;
+        case Case::Title:
+            builder.appendff("-{}", string->to_titlecase_string());
+            break;
+        }
+    };
+
     if (!locale_id.language_id.language.has_value())
         return {};
 
     builder.append(locale_id.language_id.language->to_lowercase_string());
-
-    if (locale_id.language_id.script.has_value()) {
-        builder.append('-');
-        builder.append(locale_id.language_id.script->to_titlecase_string());
-    }
-
-    if (locale_id.language_id.region.has_value()) {
-        builder.append('-');
-        builder.append(locale_id.language_id.region->to_uppercase_string());
-    }
+    append_sep_and_string(locale_id.language_id.script, Case::Title);
+    append_sep_and_string(locale_id.language_id.region, Case::Upper);
 
     quick_sort(locale_id.language_id.variants);
-
-    for (auto const& variant : locale_id.language_id.variants) {
-        builder.append('-');
-        builder.append(variant.to_lowercase_string());
-    }
+    for (auto const& variant : locale_id.language_id.variants)
+        append_sep_and_string(variant);
 
     // FIXME: Handle extensions and pu_extensions.