aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/protobuf/json/json2proto.cpp
diff options
context:
space:
mode:
authormalkovskynv <malkovskynv@yandex-team.com>2023-08-03 13:42:05 +0300
committermalkovskynv <malkovskynv@yandex-team.com>2023-08-03 13:42:05 +0300
commit29af40f86c4159175acf78d57de7cd39e44c0dab (patch)
tree016948d29c43f651dd64d5a9f2d9cbdd4a827bfc /library/cpp/protobuf/json/json2proto.cpp
parentfef1ffbaef82af08b6201f41c2ed15723a4fe1cf (diff)
downloadydb-29af40f86c4159175acf78d57de7cd39e44c0dab.tar.gz
MARKETRECOM-8673_json_enum_value
Diffstat (limited to 'library/cpp/protobuf/json/json2proto.cpp')
-rw-r--r--library/cpp/protobuf/json/json2proto.cpp27
1 files changed, 22 insertions, 5 deletions
diff --git a/library/cpp/protobuf/json/json2proto.cpp b/library/cpp/protobuf/json/json2proto.cpp
index be8682e239..3131b9779d 100644
--- a/library/cpp/protobuf/json/json2proto.cpp
+++ b/library/cpp/protobuf/json/json2proto.cpp
@@ -2,6 +2,7 @@
#include "util.h"
#include <library/cpp/json/json_value.h>
+#include <library/cpp/protobuf/json/proto/enum_options.pb.h>
#include <google/protobuf/util/time_util.h>
#include <google/protobuf/message.h>
@@ -187,6 +188,18 @@ FindEnumValue(const NProtoBuf::EnumDescriptor* enumField,
return nullptr;
}
+static const NProtoBuf::EnumValueDescriptor*
+FindEnumValueByJsonName(const NProtoBuf::EnumDescriptor* enumField, TStringBuf target) {
+ for (int i = 0; i < enumField->value_count(); i++) {
+ auto* valueDescriptor = enumField->value(i);
+ if (valueDescriptor->options().GetExtension(json_enum_value) == target) {
+ return valueDescriptor;
+ }
+ }
+ return nullptr;
+}
+
+
static void
JsonEnum2Field(const NJson::TJsonValue& json,
google::protobuf::Message& proto,
@@ -211,12 +224,16 @@ JsonEnum2Field(const NJson::TJsonValue& json,
}
} else if (json.IsString()) {
const auto& value = json.GetString();
- if (config.EnumValueMode == NProtobufJson::TJson2ProtoConfig::EnumCaseInsensetive) {
- enumFieldValue = FindEnumValue(enumField, value, AsciiEqualsIgnoreCase);
- } else if (config.EnumValueMode == NProtobufJson::TJson2ProtoConfig::EnumSnakeCaseInsensitive) {
- enumFieldValue = FindEnumValue(enumField, value, NProtobufJson::EqualsIgnoringCaseAndUnderscores);
+ if (config.UseJsonEnumValue) {
+ enumFieldValue = FindEnumValueByJsonName(enumField, value);
} else {
- enumFieldValue = enumField->FindValueByName(value);
+ if (config.EnumValueMode == NProtobufJson::TJson2ProtoConfig::EnumCaseInsensetive) {
+ enumFieldValue = FindEnumValue(enumField, value, AsciiEqualsIgnoreCase);
+ } else if (config.EnumValueMode == NProtobufJson::TJson2ProtoConfig::EnumSnakeCaseInsensitive) {
+ enumFieldValue = FindEnumValue(enumField, value, NProtobufJson::EqualsIgnoringCaseAndUnderscores);
+ } else {
+ enumFieldValue = enumField->FindValueByName(value);
+ }
}
if (!enumFieldValue) {
ythrow yexception() << "Invalid string value of JSON enum field: " << TStringBuf(value).Head(100) << ".";