blob: 18f7e1d2ff7dea3e1fea3d373d3e33bcf7eeea8e [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "proto/ProtoHelpers.h"
#include "Locale.h"
namespace aapt {
void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool) {
BigBuffer buffer(1024);
StringPool::FlattenUtf8(&buffer, pool);
std::string* data = out_pb_pool->mutable_data();
data->reserve(buffer.size());
size_t offset = 0;
for (const BigBuffer::Block& block : buffer) {
data->insert(data->begin() + offset, block.buffer.get(), block.buffer.get() + block.size);
offset += block.size;
}
}
void SerializeSourceToPb(const Source& source, StringPool* src_pool, pb::Source* out_pb_source) {
StringPool::Ref ref = src_pool->MakeRef(source.path);
out_pb_source->set_path_idx(static_cast<uint32_t>(ref.index()));
if (source.line) {
out_pb_source->mutable_position()->set_line_number(static_cast<uint32_t>(source.line.value()));
}
}
void DeserializeSourceFromPb(const pb::Source& pb_source, const android::ResStringPool& src_pool,
Source* out_source) {
out_source->path = util::GetString(src_pool, pb_source.path_idx());
out_source->line = static_cast<size_t>(pb_source.position().line_number());
}
pb::SymbolStatus_Visibility SerializeVisibilityToPb(SymbolState state) {
switch (state) {
case SymbolState::kPrivate:
return pb::SymbolStatus_Visibility_PRIVATE;
case SymbolState::kPublic:
return pb::SymbolStatus_Visibility_PUBLIC;
default:
break;
}
return pb::SymbolStatus_Visibility_UNKNOWN;
}
SymbolState DeserializeVisibilityFromPb(pb::SymbolStatus_Visibility pb_visibility) {
switch (pb_visibility) {
case pb::SymbolStatus_Visibility_PRIVATE:
return SymbolState::kPrivate;
case pb::SymbolStatus_Visibility_PUBLIC:
return SymbolState::kPublic;
default:
break;
}
return SymbolState::kUndefined;
}
void SerializeConfig(const ConfigDescription& config, pb::Configuration* out_pb_config) {
out_pb_config->set_mcc(config.mcc);
out_pb_config->set_mnc(config.mnc);
out_pb_config->set_locale(config.GetBcp47LanguageTag());
switch (config.screenLayout & ConfigDescription::MASK_LAYOUTDIR) {
case ConfigDescription::LAYOUTDIR_LTR:
out_pb_config->set_layout_direction(pb::Configuration_LayoutDirection_LAYOUT_DIRECTION_LTR);
break;
case ConfigDescription::LAYOUTDIR_RTL:
out_pb_config->set_layout_direction(pb::Configuration_LayoutDirection_LAYOUT_DIRECTION_RTL);
break;
}
out_pb_config->set_screen_width(config.screenWidth);
out_pb_config->set_screen_height(config.screenHeight);
out_pb_config->set_screen_width_dp(config.screenWidthDp);
out_pb_config->set_screen_height_dp(config.screenHeightDp);
out_pb_config->set_smallest_screen_width_dp(config.smallestScreenWidthDp);
switch (config.screenLayout & ConfigDescription::MASK_SCREENSIZE) {
case ConfigDescription::SCREENSIZE_SMALL:
out_pb_config->set_screen_layout_size(
pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_SMALL);
break;
case ConfigDescription::SCREENSIZE_NORMAL:
out_pb_config->set_screen_layout_size(
pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_NORMAL);
break;
case ConfigDescription::SCREENSIZE_LARGE:
out_pb_config->set_screen_layout_size(
pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_LARGE);
break;
case ConfigDescription::SCREENSIZE_XLARGE:
out_pb_config->set_screen_layout_size(
pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_XLARGE);
break;
}
switch (config.screenLayout & ConfigDescription::MASK_SCREENLONG) {
case ConfigDescription::SCREENLONG_YES:
out_pb_config->set_screen_layout_long(
pb::Configuration_ScreenLayoutLong_SCREEN_LAYOUT_LONG_LONG);
break;
case ConfigDescription::SCREENLONG_NO:
out_pb_config->set_screen_layout_long(
pb::Configuration_ScreenLayoutLong_SCREEN_LAYOUT_LONG_NOTLONG);
break;
}
switch (config.screenLayout2 & ConfigDescription::MASK_SCREENROUND) {
case ConfigDescription::SCREENROUND_YES:
out_pb_config->set_screen_round(pb::Configuration_ScreenRound_SCREEN_ROUND_ROUND);
break;
case ConfigDescription::SCREENROUND_NO:
out_pb_config->set_screen_round(pb::Configuration_ScreenRound_SCREEN_ROUND_NOTROUND);
break;
}
switch (config.colorMode & ConfigDescription::MASK_WIDE_COLOR_GAMUT) {
case ConfigDescription::WIDE_COLOR_GAMUT_YES:
out_pb_config->set_wide_color_gamut(pb::Configuration_WideColorGamut_WIDE_COLOR_GAMUT_WIDECG);
break;
case ConfigDescription::WIDE_COLOR_GAMUT_NO:
out_pb_config->set_wide_color_gamut(
pb::Configuration_WideColorGamut_WIDE_COLOR_GAMUT_NOWIDECG);
break;
}
switch (config.colorMode & ConfigDescription::MASK_HDR) {
case ConfigDescription::HDR_YES:
out_pb_config->set_hdr(pb::Configuration_Hdr_HDR_HIGHDR);
break;
case ConfigDescription::HDR_NO:
out_pb_config->set_hdr(pb::Configuration_Hdr_HDR_LOWDR);
break;
}
switch (config.orientation) {
case ConfigDescription::ORIENTATION_PORT:
out_pb_config->set_orientation(pb::Configuration_Orientation_ORIENTATION_PORT);
break;
case ConfigDescription::ORIENTATION_LAND:
out_pb_config->set_orientation(pb::Configuration_Orientation_ORIENTATION_LAND);
break;
case ConfigDescription::ORIENTATION_SQUARE:
out_pb_config->set_orientation(pb::Configuration_Orientation_ORIENTATION_SQUARE);
break;
}
switch (config.uiMode & ConfigDescription::MASK_UI_MODE_TYPE) {
case ConfigDescription::UI_MODE_TYPE_NORMAL:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_NORMAL);
break;
case ConfigDescription::UI_MODE_TYPE_DESK:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_DESK);
break;
case ConfigDescription::UI_MODE_TYPE_CAR:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_CAR);
break;
case ConfigDescription::UI_MODE_TYPE_TELEVISION:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_TELEVISION);
break;
case ConfigDescription::UI_MODE_TYPE_APPLIANCE:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_APPLIANCE);
break;
case ConfigDescription::UI_MODE_TYPE_WATCH:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_WATCH);
break;
case ConfigDescription::UI_MODE_TYPE_VR_HEADSET:
out_pb_config->set_ui_mode_type(pb::Configuration_UiModeType_UI_MODE_TYPE_VRHEADSET);
break;
}
switch (config.uiMode & ConfigDescription::MASK_UI_MODE_NIGHT) {
case ConfigDescription::UI_MODE_NIGHT_YES:
out_pb_config->set_ui_mode_night(pb::Configuration_UiModeNight_UI_MODE_NIGHT_NIGHT);
break;
case ConfigDescription::UI_MODE_NIGHT_NO:
out_pb_config->set_ui_mode_night(pb::Configuration_UiModeNight_UI_MODE_NIGHT_NOTNIGHT);
break;
}
out_pb_config->set_density(config.density);
switch (config.touchscreen) {
case ConfigDescription::TOUCHSCREEN_NOTOUCH:
out_pb_config->set_touchscreen(pb::Configuration_Touchscreen_TOUCHSCREEN_NOTOUCH);
break;
case ConfigDescription::TOUCHSCREEN_STYLUS:
out_pb_config->set_touchscreen(pb::Configuration_Touchscreen_TOUCHSCREEN_STYLUS);
break;
case ConfigDescription::TOUCHSCREEN_FINGER:
out_pb_config->set_touchscreen(pb::Configuration_Touchscreen_TOUCHSCREEN_FINGER);
break;
}
switch (config.inputFlags & ConfigDescription::MASK_KEYSHIDDEN) {
case ConfigDescription::KEYSHIDDEN_NO:
out_pb_config->set_keys_hidden(pb::Configuration_KeysHidden_KEYS_HIDDEN_KEYSEXPOSED);
break;
case ConfigDescription::KEYSHIDDEN_YES:
out_pb_config->set_keys_hidden(pb::Configuration_KeysHidden_KEYS_HIDDEN_KEYSHIDDEN);
break;
case ConfigDescription::KEYSHIDDEN_SOFT:
out_pb_config->set_keys_hidden(pb::Configuration_KeysHidden_KEYS_HIDDEN_KEYSSOFT);
break;
}
switch (config.keyboard) {
case ConfigDescription::KEYBOARD_NOKEYS:
out_pb_config->set_keyboard(pb::Configuration_Keyboard_KEYBOARD_NOKEYS);
break;
case ConfigDescription::KEYBOARD_QWERTY:
out_pb_config->set_keyboard(pb::Configuration_Keyboard_KEYBOARD_QWERTY);
break;
case ConfigDescription::KEYBOARD_12KEY:
out_pb_config->set_keyboard(pb::Configuration_Keyboard_KEYBOARD_TWELVEKEY);
break;
}
switch (config.inputFlags & ConfigDescription::MASK_NAVHIDDEN) {
case ConfigDescription::NAVHIDDEN_NO:
out_pb_config->set_nav_hidden(pb::Configuration_NavHidden_NAV_HIDDEN_NAVEXPOSED);
break;
case ConfigDescription::NAVHIDDEN_YES:
out_pb_config->set_nav_hidden(pb::Configuration_NavHidden_NAV_HIDDEN_NAVHIDDEN);
break;
}
switch (config.navigation) {
case ConfigDescription::NAVIGATION_NONAV:
out_pb_config->set_navigation(pb::Configuration_Navigation_NAVIGATION_NONAV);
break;
case ConfigDescription::NAVIGATION_DPAD:
out_pb_config->set_navigation(pb::Configuration_Navigation_NAVIGATION_DPAD);
break;
case ConfigDescription::NAVIGATION_TRACKBALL:
out_pb_config->set_navigation(pb::Configuration_Navigation_NAVIGATION_TRACKBALL);
break;
case ConfigDescription::NAVIGATION_WHEEL:
out_pb_config->set_navigation(pb::Configuration_Navigation_NAVIGATION_WHEEL);
break;
}
out_pb_config->set_sdk_version(config.sdkVersion);
}
bool DeserializeConfigDescriptionFromPb(const pb::Configuration& pb_config,
ConfigDescription* out_config) {
out_config->mcc = static_cast<uint16_t>(pb_config.mcc());
out_config->mnc = static_cast<uint16_t>(pb_config.mnc());
if (!pb_config.locale().empty()) {
LocaleValue lv;
if (!lv.InitFromBcp47Tag(pb_config.locale())) {
return false;
}
lv.WriteTo(out_config);
}
switch (pb_config.layout_direction()) {
case pb::Configuration_LayoutDirection_LAYOUT_DIRECTION_LTR:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_LAYOUTDIR) |
ConfigDescription::LAYOUTDIR_LTR;
break;
case pb::Configuration_LayoutDirection_LAYOUT_DIRECTION_RTL:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_LAYOUTDIR) |
ConfigDescription::LAYOUTDIR_RTL;
break;
default:
break;
}
out_config->smallestScreenWidthDp = static_cast<uint16_t>(pb_config.smallest_screen_width_dp());
out_config->screenWidthDp = static_cast<uint16_t>(pb_config.screen_width_dp());
out_config->screenHeightDp = static_cast<uint16_t>(pb_config.screen_height_dp());
switch (pb_config.screen_layout_size()) {
case pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_SMALL:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_SCREENSIZE) |
ConfigDescription::SCREENSIZE_SMALL;
break;
case pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_NORMAL:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_SCREENSIZE) |
ConfigDescription::SCREENSIZE_NORMAL;
break;
case pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_LARGE:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_SCREENSIZE) |
ConfigDescription::SCREENSIZE_LARGE;
break;
case pb::Configuration_ScreenLayoutSize_SCREEN_LAYOUT_SIZE_XLARGE:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_SCREENSIZE) |
ConfigDescription::SCREENSIZE_XLARGE;
break;
default:
break;
}
switch (pb_config.screen_layout_long()) {
case pb::Configuration_ScreenLayoutLong_SCREEN_LAYOUT_LONG_LONG:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_SCREENLONG) |
ConfigDescription::SCREENLONG_YES;
break;
case pb::Configuration_ScreenLayoutLong_SCREEN_LAYOUT_LONG_NOTLONG:
out_config->screenLayout = (out_config->screenLayout & ~ConfigDescription::MASK_SCREENLONG) |
ConfigDescription::SCREENLONG_NO;
break;
default:
break;
}
switch (pb_config.screen_round()) {
case pb::Configuration_ScreenRound_SCREEN_ROUND_ROUND:
out_config->screenLayout2 =
(out_config->screenLayout2 & ~ConfigDescription::MASK_SCREENROUND) |
ConfigDescription::SCREENROUND_YES;
break;
case pb::Configuration_ScreenRound_SCREEN_ROUND_NOTROUND:
out_config->screenLayout2 =
(out_config->screenLayout2 & ~ConfigDescription::MASK_SCREENROUND) |
ConfigDescription::SCREENROUND_NO;
break;
default:
break;
}
switch (pb_config.wide_color_gamut()) {
case pb::Configuration_WideColorGamut_WIDE_COLOR_GAMUT_WIDECG:
out_config->colorMode = (out_config->colorMode & ~ConfigDescription::MASK_WIDE_COLOR_GAMUT) |
ConfigDescription::WIDE_COLOR_GAMUT_YES;
break;
case pb::Configuration_WideColorGamut_WIDE_COLOR_GAMUT_NOWIDECG:
out_config->colorMode = (out_config->colorMode & ~ConfigDescription::MASK_WIDE_COLOR_GAMUT) |
ConfigDescription::WIDE_COLOR_GAMUT_NO;
break;
default:
break;
}
switch (pb_config.hdr()) {
case pb::Configuration_Hdr_HDR_HIGHDR:
out_config->colorMode =
(out_config->colorMode & ~ConfigDescription::MASK_HDR) | ConfigDescription::HDR_YES;
break;
case pb::Configuration_Hdr_HDR_LOWDR:
out_config->colorMode =
(out_config->colorMode & ~ConfigDescription::MASK_HDR) | ConfigDescription::HDR_NO;
break;
default:
break;
}
switch (pb_config.orientation()) {
case pb::Configuration_Orientation_ORIENTATION_PORT:
out_config->orientation = ConfigDescription::ORIENTATION_PORT;
break;
case pb::Configuration_Orientation_ORIENTATION_LAND:
out_config->orientation = ConfigDescription::ORIENTATION_LAND;
break;
case pb::Configuration_Orientation_ORIENTATION_SQUARE:
out_config->orientation = ConfigDescription::ORIENTATION_SQUARE;
break;
default:
break;
}
switch (pb_config.ui_mode_type()) {
case pb::Configuration_UiModeType_UI_MODE_TYPE_NORMAL:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_NORMAL;
break;
case pb::Configuration_UiModeType_UI_MODE_TYPE_DESK:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_DESK;
break;
case pb::Configuration_UiModeType_UI_MODE_TYPE_CAR:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_CAR;
break;
case pb::Configuration_UiModeType_UI_MODE_TYPE_TELEVISION:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_TELEVISION;
break;
case pb::Configuration_UiModeType_UI_MODE_TYPE_APPLIANCE:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_APPLIANCE;
break;
case pb::Configuration_UiModeType_UI_MODE_TYPE_WATCH:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_WATCH;
break;
case pb::Configuration_UiModeType_UI_MODE_TYPE_VRHEADSET:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_TYPE) |
ConfigDescription::UI_MODE_TYPE_VR_HEADSET;
break;
default:
break;
}
switch (pb_config.ui_mode_night()) {
case pb::Configuration_UiModeNight_UI_MODE_NIGHT_NIGHT:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_NIGHT) |
ConfigDescription::UI_MODE_NIGHT_YES;
break;
case pb::Configuration_UiModeNight_UI_MODE_NIGHT_NOTNIGHT:
out_config->uiMode = (out_config->uiMode & ~ConfigDescription::MASK_UI_MODE_NIGHT) |
ConfigDescription::UI_MODE_NIGHT_NO;
break;
default:
break;
}
out_config->density = static_cast<uint16_t>(pb_config.density());
switch (pb_config.touchscreen()) {
case pb::Configuration_Touchscreen_TOUCHSCREEN_NOTOUCH:
out_config->touchscreen = ConfigDescription::TOUCHSCREEN_NOTOUCH;
break;
case pb::Configuration_Touchscreen_TOUCHSCREEN_STYLUS:
out_config->touchscreen = ConfigDescription::TOUCHSCREEN_STYLUS;
break;
case pb::Configuration_Touchscreen_TOUCHSCREEN_FINGER:
out_config->touchscreen = ConfigDescription::TOUCHSCREEN_FINGER;
break;
default:
break;
}
switch (pb_config.keys_hidden()) {
case pb::Configuration_KeysHidden_KEYS_HIDDEN_KEYSEXPOSED:
out_config->inputFlags = (out_config->inputFlags & ~ConfigDescription::MASK_KEYSHIDDEN) |
ConfigDescription::KEYSHIDDEN_NO;
break;
case pb::Configuration_KeysHidden_KEYS_HIDDEN_KEYSHIDDEN:
out_config->inputFlags = (out_config->inputFlags & ~ConfigDescription::MASK_KEYSHIDDEN) |
ConfigDescription::KEYSHIDDEN_YES;
break;
case pb::Configuration_KeysHidden_KEYS_HIDDEN_KEYSSOFT:
out_config->inputFlags = (out_config->inputFlags & ~ConfigDescription::MASK_KEYSHIDDEN) |
ConfigDescription::KEYSHIDDEN_SOFT;
break;
default:
break;
}
switch (pb_config.keyboard()) {
case pb::Configuration_Keyboard_KEYBOARD_NOKEYS:
out_config->keyboard = ConfigDescription::KEYBOARD_NOKEYS;
break;
case pb::Configuration_Keyboard_KEYBOARD_QWERTY:
out_config->keyboard = ConfigDescription::KEYBOARD_QWERTY;
break;
case pb::Configuration_Keyboard_KEYBOARD_TWELVEKEY:
out_config->keyboard = ConfigDescription::KEYBOARD_12KEY;
break;
default:
break;
}
switch (pb_config.nav_hidden()) {
case pb::Configuration_NavHidden_NAV_HIDDEN_NAVEXPOSED:
out_config->inputFlags = (out_config->inputFlags & ~ConfigDescription::MASK_NAVHIDDEN) |
ConfigDescription::NAVHIDDEN_NO;
break;
case pb::Configuration_NavHidden_NAV_HIDDEN_NAVHIDDEN:
out_config->inputFlags = (out_config->inputFlags & ~ConfigDescription::MASK_NAVHIDDEN) |
ConfigDescription::NAVHIDDEN_YES;
break;
default:
break;
}
switch (pb_config.navigation()) {
case pb::Configuration_Navigation_NAVIGATION_NONAV:
out_config->navigation = ConfigDescription::NAVIGATION_NONAV;
break;
case pb::Configuration_Navigation_NAVIGATION_DPAD:
out_config->navigation = ConfigDescription::NAVIGATION_DPAD;
break;
case pb::Configuration_Navigation_NAVIGATION_TRACKBALL:
out_config->navigation = ConfigDescription::NAVIGATION_TRACKBALL;
break;
case pb::Configuration_Navigation_NAVIGATION_WHEEL:
out_config->navigation = ConfigDescription::NAVIGATION_WHEEL;
break;
default:
break;
}
out_config->screenWidth = static_cast<uint16_t>(pb_config.screen_width());
out_config->screenHeight = static_cast<uint16_t>(pb_config.screen_height());
out_config->sdkVersion = static_cast<uint16_t>(pb_config.sdk_version());
return true;
}
pb::Reference_Type SerializeReferenceTypeToPb(Reference::Type type) {
switch (type) {
case Reference::Type::kResource:
return pb::Reference_Type_REFERENCE;
case Reference::Type::kAttribute:
return pb::Reference_Type_ATTRIBUTE;
default:
break;
}
return pb::Reference_Type_REFERENCE;
}
Reference::Type DeserializeReferenceTypeFromPb(pb::Reference_Type pb_type) {
switch (pb_type) {
case pb::Reference_Type_REFERENCE:
return Reference::Type::kResource;
case pb::Reference_Type_ATTRIBUTE:
return Reference::Type::kAttribute;
default:
break;
}
return Reference::Type::kResource;
}
pb::Plural_Arity SerializePluralEnumToPb(size_t plural_idx) {
switch (plural_idx) {
case Plural::Zero:
return pb::Plural_Arity_ZERO;
case Plural::One:
return pb::Plural_Arity_ONE;
case Plural::Two:
return pb::Plural_Arity_TWO;
case Plural::Few:
return pb::Plural_Arity_FEW;
case Plural::Many:
return pb::Plural_Arity_MANY;
default:
break;
}
return pb::Plural_Arity_OTHER;
}
size_t DeserializePluralEnumFromPb(pb::Plural_Arity arity) {
switch (arity) {
case pb::Plural_Arity_ZERO:
return Plural::Zero;
case pb::Plural_Arity_ONE:
return Plural::One;
case pb::Plural_Arity_TWO:
return Plural::Two;
case pb::Plural_Arity_FEW:
return Plural::Few;
case pb::Plural_Arity_MANY:
return Plural::Many;
default:
break;
}
return Plural::Other;
}
} // namespace aapt