diff options
author | innokentii <innokentii@yandex-team.com> | 2023-09-29 00:02:43 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2023-09-29 00:22:17 +0300 |
commit | 95fac3fb8d054fb4f0b538d358e09bbadcffbc91 (patch) | |
tree | 78f954781759681d6793710cca8ea2e407bebbbd /library/cpp/protobuf/json/json2proto.cpp | |
parent | af047ff0da562d2220c693343306c4833e875040 (diff) | |
download | ydb-95fac3fb8d054fb4f0b538d358e09bbadcffbc91.tar.gz |
Add basic unknown fields collector
add basic unknown fields collector
Diffstat (limited to 'library/cpp/protobuf/json/json2proto.cpp')
-rw-r--r-- | library/cpp/protobuf/json/json2proto.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/library/cpp/protobuf/json/json2proto.cpp b/library/cpp/protobuf/json/json2proto.cpp index 3131b9779d..067e307146 100644 --- a/library/cpp/protobuf/json/json2proto.cpp +++ b/library/cpp/protobuf/json/json2proto.cpp @@ -275,6 +275,10 @@ Json2SingleField(const NJson::TJsonValue& json, const NJson::TJsonValue& fieldJson = name ? json[name] : json; + if (name && config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterMapItem(name); + } + switch (field.cpp_type()) { JSON_TO_FIELD(CPPTYPE_INT32, field.name(), fieldJson, IsInteger, SetInt32, GetInteger); JSON_TO_FIELD(CPPTYPE_INT64, field.name(), fieldJson, IsInteger, SetInt64, GetInteger); @@ -312,6 +316,10 @@ Json2SingleField(const NJson::TJsonValue& json, ythrow yexception() << "Unknown protobuf field type: " << static_cast<int>(field.cpp_type()) << "."; } + + if (name && config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveMapItem(); + } } static void @@ -414,6 +422,10 @@ Json2RepeatedField(const NJson::TJsonValue& json, if (fieldJson.GetType() == NJson::JSON_UNDEFINED || fieldJson.GetType() == NJson::JSON_NULL) return; + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterMapItem(name); + } + bool isMap = fieldJson.GetType() == NJson::JSON_MAP; if (isMap) { if (!config.MapAsObject) { @@ -438,7 +450,13 @@ Json2RepeatedField(const NJson::TJsonValue& json, for (const auto& x : jsonMap) { const TString& key = x.first; const NJson::TJsonValue& jsonValue = x.second; + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterMapItem(key); + } Json2RepeatedFieldValue(jsonValue, proto, field, config, reflection, key); + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveMapItem(); + } } } else { if (config.ReplaceRepeatedFields) { @@ -446,17 +464,37 @@ Json2RepeatedField(const NJson::TJsonValue& json, } if (fieldJson.GetType() == NJson::JSON_ARRAY) { const NJson::TJsonValue::TArray& jsonArray = fieldJson.GetArray(); + ui64 id = 0; for (const NJson::TJsonValue& jsonValue : jsonArray) { + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterArrayItem(id); + } Json2RepeatedFieldValue(jsonValue, proto, field, config, reflection); + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveArrayItem(); + } + ++id; } } else if (config.ValueVectorizer) { + ui64 id = 0; for (const NJson::TJsonValue& jsonValue : config.ValueVectorizer(fieldJson)) { + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterArrayItem(id); + } Json2RepeatedFieldValue(jsonValue, proto, field, config, reflection); + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveArrayItem(); + } + ++id; } } else if (config.VectorizeScalars) { Json2RepeatedFieldValue(fieldJson, proto, field, config, reflection); } } + + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveMapItem(); + } } namespace NProtobufJson { @@ -480,14 +518,18 @@ namespace NProtobufJson { } } - if (!config.AllowUnknownFields) { + if (!config.AllowUnknownFields || config.UnknownFieldsCollector) { THashMap<TString, bool> knownFields; for (int f = 0, endF = descriptor->field_count(); f < endF; ++f) { const google::protobuf::FieldDescriptor* field = descriptor->field(f); knownFields[GetFieldName(*field, config)] = 1; } for (const auto& f : json.GetMap()) { - Y_ENSURE(knownFields.contains(f.first), "unknown field \"" << f.first << "\" for \"" << descriptor->full_name() << "\""); + const bool isFieldKnown = knownFields.contains(f.first); + Y_ENSURE(config.AllowUnknownFields || isFieldKnown, "unknown field \"" << f.first << "\" for \"" << descriptor->full_name() << "\""); + if (!isFieldKnown) { + config.UnknownFieldsCollector->OnUnknownField(f.first, *descriptor); + } } } } |