diff options
author | dimastark <dimastark@yandex-team.com> | 2024-09-30 16:58:58 +0300 |
---|---|---|
committer | dimastark <dimastark@yandex-team.com> | 2024-09-30 17:11:11 +0300 |
commit | 4cd5d4661db60c7f096ec51f08bca0ed7aba8f9b (patch) | |
tree | 03a54adef9e505da807b2456aeadfc29a2b1ece6 /library/cpp/protobuf/json/proto2json_printer.cpp | |
parent | 334072c7351043236bdca34f2ede8ed1cb4a6d79 (diff) | |
download | ydb-4cd5d4661db60c7f096ec51f08bca0ed7aba8f9b.tar.gz |
SortMapKeys in proto2json for deterministic seriarialization
commit_hash:e64dedae589fa2d16347be4d80e2596f46566b38
Diffstat (limited to 'library/cpp/protobuf/json/proto2json_printer.cpp')
-rw-r--r-- | library/cpp/protobuf/json/proto2json_printer.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/library/cpp/protobuf/json/proto2json_printer.cpp b/library/cpp/protobuf/json/proto2json_printer.cpp index 5d0e140615..a9f8c3fce9 100644 --- a/library/cpp/protobuf/json/proto2json_printer.cpp +++ b/library/cpp/protobuf/json/proto2json_printer.cpp @@ -8,6 +8,7 @@ #include <library/cpp/protobuf/json/proto/enum_options.pb.h> +#include <util/generic/map.h> #include <util/generic/yexception.h> #include <util/string/ascii.h> #include <util/string/cast.h> @@ -394,8 +395,22 @@ namespace NProtobufJson { case FieldDescriptor::CPPTYPE_MESSAGE: { if (isMap) { - for (size_t i = 0, endI = reflection->FieldSize(proto, &field); i < endI; ++i) { - PrintKeyValue(reflection->GetRepeatedMessage(proto, &field, i), json); + if (GetConfig().SortMapKeys) { + TMap<TString, size_t> keyToIndex; + for (size_t i = 0, endI = reflection->FieldSize(proto, &field); i < endI; ++i) { + const Message& fieldMessage = reflection->GetRepeatedMessage(proto, &field, i); + const FieldDescriptor* keyField = fieldMessage.GetDescriptor()->map_key(); + Y_ABORT_UNLESS(keyField, "Map entry key field not found."); + TString key = MakeKey(fieldMessage, *keyField); + keyToIndex[key] = i; + } + for (const auto& [_, i] : keyToIndex) { + PrintKeyValue(reflection->GetRepeatedMessage(proto, &field, i), json); + } + } else { + for (size_t i = 0, endI = reflection->FieldSize(proto, &field); i < endI; ++i) { + PrintKeyValue(reflection->GetRepeatedMessage(proto, &field, i), json); + } } } else { for (size_t i = 0, endI = reflection->FieldSize(proto, &field); i < endI; ++i) { |