Skip to content

Commit 551873a

Browse files
author
pananton
committed
feat userver: protobuf library with ProtoJSON implementation
ProtoJSON spec implementation for conversion between `formats::json::Value` and protobuf messages. Old functions from `ugrpc/proto_json.hpp` are deprecated from now. Simple benchmarks show that new implementation may be 8-10x faster then the old naive one. commit_hash:6ed5bcd6ed0a1c0285f86a4fd2867f9a373f294d
1 parent 0dcbcde commit 551873a

File tree

85 files changed

+12555
-9
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+12555
-9
lines changed

.mapping.json

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2964,6 +2964,83 @@
29642964
"libraries/proto-structs/tests/structs.hpp":"taxi/uservices/userver/libraries/proto-structs/tests/structs.hpp",
29652965
"libraries/proto-structs/tests/time_of_day_test.cpp":"taxi/uservices/userver/libraries/proto-structs/tests/time_of_day_test.cpp",
29662966
"libraries/proto-structs/tests/timestamp_test.cpp":"taxi/uservices/userver/libraries/proto-structs/tests/timestamp_test.cpp",
2967+
"libraries/protobuf/include/userver/protobuf/datetime.hpp":"taxi/uservices/userver/libraries/protobuf/include/userver/protobuf/datetime.hpp",
2968+
"libraries/protobuf/include/userver/protobuf/exceptions.hpp":"taxi/uservices/userver/libraries/protobuf/include/userver/protobuf/exceptions.hpp",
2969+
"libraries/protobuf/include/userver/protobuf/json/convert.hpp":"taxi/uservices/userver/libraries/protobuf/include/userver/protobuf/json/convert.hpp",
2970+
"libraries/protobuf/include/userver/protobuf/json/convert_options.hpp":"taxi/uservices/userver/libraries/protobuf/include/userver/protobuf/json/convert_options.hpp",
2971+
"libraries/protobuf/include/userver/protobuf/json/exceptions.hpp":"taxi/uservices/userver/libraries/protobuf/include/userver/protobuf/json/exceptions.hpp",
2972+
"libraries/protobuf/src/protobuf/datetime.cpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/datetime.cpp",
2973+
"libraries/protobuf/src/protobuf/json/convert.cpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/convert.cpp",
2974+
"libraries/protobuf/src/protobuf/json/exceptions.cpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/exceptions.cpp",
2975+
"libraries/protobuf/src/protobuf/json/impl/convert_utils.cpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/convert_utils.cpp",
2976+
"libraries/protobuf/src/protobuf/json/impl/convert_utils.hpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/convert_utils.hpp",
2977+
"libraries/protobuf/src/protobuf/json/impl/field_error.hpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/field_error.hpp",
2978+
"libraries/protobuf/src/protobuf/json/impl/read.cpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/read.cpp",
2979+
"libraries/protobuf/src/protobuf/json/impl/read.hpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/read.hpp",
2980+
"libraries/protobuf/src/protobuf/json/impl/write.cpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/write.cpp",
2981+
"libraries/protobuf/src/protobuf/json/impl/write.hpp":"taxi/uservices/userver/libraries/protobuf/src/protobuf/json/impl/write.hpp",
2982+
"libraries/protobuf/tests/datetime_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/datetime_test.cpp",
2983+
"libraries/protobuf/tests/json/any_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/any_from_json_test.cpp",
2984+
"libraries/protobuf/tests/json/any_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/any_to_json_test.cpp",
2985+
"libraries/protobuf/tests/json/bool_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/bool_from_json_test.cpp",
2986+
"libraries/protobuf/tests/json/bool_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/bool_to_json_test.cpp",
2987+
"libraries/protobuf/tests/json/bytes_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/bytes_from_json_test.cpp",
2988+
"libraries/protobuf/tests/json/bytes_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/bytes_to_json_test.cpp",
2989+
"libraries/protobuf/tests/json/complex_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/complex_from_json_test.cpp",
2990+
"libraries/protobuf/tests/json/complex_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/complex_to_json_test.cpp",
2991+
"libraries/protobuf/tests/json/custom_name_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/custom_name_test.cpp",
2992+
"libraries/protobuf/tests/json/double_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/double_from_json_test.cpp",
2993+
"libraries/protobuf/tests/json/double_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/double_to_json_test.cpp",
2994+
"libraries/protobuf/tests/json/duration_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/duration_from_json_test.cpp",
2995+
"libraries/protobuf/tests/json/duration_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/duration_to_json_test.cpp",
2996+
"libraries/protobuf/tests/json/empty_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/empty_from_json_test.cpp",
2997+
"libraries/protobuf/tests/json/empty_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/empty_to_json_test.cpp",
2998+
"libraries/protobuf/tests/json/enum_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/enum_from_json_test.cpp",
2999+
"libraries/protobuf/tests/json/enum_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/enum_to_json_test.cpp",
3000+
"libraries/protobuf/tests/json/exceptions_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/exceptions_test.cpp",
3001+
"libraries/protobuf/tests/json/field_mask_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/field_mask_from_json_test.cpp",
3002+
"libraries/protobuf/tests/json/field_mask_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/field_mask_to_json_test.cpp",
3003+
"libraries/protobuf/tests/json/float_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/float_from_json_test.cpp",
3004+
"libraries/protobuf/tests/json/float_special_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/float_special_from_json_test.cpp",
3005+
"libraries/protobuf/tests/json/float_special_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/float_special_to_json_test.cpp",
3006+
"libraries/protobuf/tests/json/float_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/float_to_json_test.cpp",
3007+
"libraries/protobuf/tests/json/int32_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/int32_from_json_test.cpp",
3008+
"libraries/protobuf/tests/json/int32_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/int32_to_json_test.cpp",
3009+
"libraries/protobuf/tests/json/int64_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/int64_from_json_test.cpp",
3010+
"libraries/protobuf/tests/json/int64_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/int64_to_json_test.cpp",
3011+
"libraries/protobuf/tests/json/map_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/map_from_json_test.cpp",
3012+
"libraries/protobuf/tests/json/map_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/map_to_json_test.cpp",
3013+
"libraries/protobuf/tests/json/nested_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/nested_from_json_test.cpp",
3014+
"libraries/protobuf/tests/json/nested_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/nested_to_json_test.cpp",
3015+
"libraries/protobuf/tests/json/null_value_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/null_value_from_json_test.cpp",
3016+
"libraries/protobuf/tests/json/null_value_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/null_value_to_json_test.cpp",
3017+
"libraries/protobuf/tests/json/oneof_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/oneof_from_json_test.cpp",
3018+
"libraries/protobuf/tests/json/oneof_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/oneof_to_json_test.cpp",
3019+
"libraries/protobuf/tests/json/presence_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/presence_test.cpp",
3020+
"libraries/protobuf/tests/json/repeated_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/repeated_from_json_test.cpp",
3021+
"libraries/protobuf/tests/json/repeated_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/repeated_to_json_test.cpp",
3022+
"libraries/protobuf/tests/json/string_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/string_from_json_test.cpp",
3023+
"libraries/protobuf/tests/json/string_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/string_to_json_test.cpp",
3024+
"libraries/protobuf/tests/json/timestamp_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/timestamp_from_json_test.cpp",
3025+
"libraries/protobuf/tests/json/timestamp_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/timestamp_to_json_test.cpp",
3026+
"libraries/protobuf/tests/json/uint32_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/uint32_from_json_test.cpp",
3027+
"libraries/protobuf/tests/json/uint32_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/uint32_to_json_test.cpp",
3028+
"libraries/protobuf/tests/json/uint64_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/uint64_from_json_test.cpp",
3029+
"libraries/protobuf/tests/json/uint64_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/uint64_to_json_test.cpp",
3030+
"libraries/protobuf/tests/json/unknown_field_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/unknown_field_test.cpp",
3031+
"libraries/protobuf/tests/json/utils.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/utils.cpp",
3032+
"libraries/protobuf/tests/json/utils.hpp":"taxi/uservices/userver/libraries/protobuf/tests/json/utils.hpp",
3033+
"libraries/protobuf/tests/json/value_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/value_from_json_test.cpp",
3034+
"libraries/protobuf/tests/json/value_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/value_to_json_test.cpp",
3035+
"libraries/protobuf/tests/json/wrapper_from_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/wrapper_from_json_test.cpp",
3036+
"libraries/protobuf/tests/json/wrapper_to_json_test.cpp":"taxi/uservices/userver/libraries/protobuf/tests/json/wrapper_to_json_test.cpp",
3037+
"libraries/protobuf/tests/json/ya.make":"taxi/uservices/userver/libraries/protobuf/tests/json/ya.make",
3038+
"libraries/protobuf/tests/proto/proto_json/messages.proto":"taxi/uservices/userver/libraries/protobuf/tests/proto/proto_json/messages.proto",
3039+
"libraries/protobuf/tests/proto/proto_json/ya.make":"taxi/uservices/userver/libraries/protobuf/tests/proto/proto_json/ya.make",
3040+
"libraries/protobuf/tests/proto/ya.make":"taxi/uservices/userver/libraries/protobuf/tests/proto/ya.make",
3041+
"libraries/protobuf/tests/ya.make":"taxi/uservices/userver/libraries/protobuf/tests/ya.make",
3042+
"libraries/protobuf/ya.make":"taxi/uservices/userver/libraries/protobuf/ya.make",
3043+
"libraries/protobuf/ya.make.ext":"taxi/uservices/userver/libraries/protobuf/ya.make.ext",
29673044
"libraries/s3api/CMakeLists.txt":"taxi/uservices/userver/libraries/s3api/CMakeLists.txt",
29683045
"libraries/s3api/include/userver/s3api/authenticators/access_key.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/authenticators/access_key.hpp",
29693046
"libraries/s3api/include/userver/s3api/authenticators/interface.hpp":"taxi/uservices/userver/libraries/s3api/include/userver/s3api/authenticators/interface.hpp",

grpc/include/userver/ugrpc/proto_json.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ void FromJsonStringImpl(
2929

3030
/// @brief Returns formats::json::Value representation of protobuf message
3131
/// @throws formats::json::Exception
32+
/// @warning This function is **deprecated** and will be removed, use @ref protobuf::json::MessageToJson .
3233
formats::json::Value MessageToJson(const google::protobuf::Message& message);
3334

3435
/// @brief Returns formats::json::Value representation of protobuf message
3536
/// @throws formats::json::Exception
37+
/// @warning This function is **deprecated** and will be removed, use @ref protobuf::json::MessageToJson .
3638
formats::json::Value MessageToJson(
3739
const google::protobuf::Message& message,
3840
const google::protobuf::util::JsonPrintOptions& options
@@ -51,6 +53,7 @@ std::string ToJsonString(
5153

5254
/// @brief Parses Json to a protobuf message. Throws on unknown enum values and unknown fields by default.
5355
/// @throws formats::json::Exception on field type mismatch, unknown enum values and unknown fields.
56+
/// @warning This function is **deprecated** and will be removed, use @ref protobuf::json::JsonToMessage .
5457
template <typename Message>
5558
Message JsonToMessage(const formats::json::Value& json) {
5659
Message message;
@@ -60,6 +63,7 @@ Message JsonToMessage(const formats::json::Value& json) {
6063

6164
/// @brief Parses Json to a protobuf message. Throws on unknown enum values.
6265
/// @throws formats::json::Exception on field type mismatch and unknown enum values.
66+
/// @warning This function is **deprecated** and will be removed, use @ref protobuf::json::JsonToMessage .
6367
template <typename Message>
6468
Message JsonToMessage(const formats::json::Value& json, const google::protobuf::util::JsonParseOptions& options) {
6569
Message message;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
5+
/// @file userver/protobuf/utils.hpp
6+
/// @brief Date and time protobuf utilities.
7+
8+
USERVER_NAMESPACE_BEGIN
9+
10+
namespace protobuf {
11+
12+
constexpr inline std::int64_t kMinDurationSeconds = -315'576'000'000LL;
13+
constexpr inline std::int64_t kMaxDurationSeconds = 315'576'000'000LL;
14+
constexpr inline std::int32_t kMinDurationNanos = -999'999'999;
15+
constexpr inline std::int32_t kMaxDurationNanos = 999'999'999;
16+
constexpr inline std::int64_t kMinTimestampSeconds = -62'135'596'800LL;
17+
constexpr inline std::int64_t kMaxTimestampSeconds = 253'402'300'799LL;
18+
constexpr inline std::int32_t kMinTimestampNanos = 0;
19+
constexpr inline std::int32_t kMaxTimestampNanos = 999'999'999;
20+
21+
/// @brief Returns @c true if combination of @a seconds and @a nanos represent a valid `google.protobuf.Duration`.
22+
[[nodiscard]] bool IsValidDuration(std::int64_t seconds, std::int32_t nanos) noexcept;
23+
24+
/// @brief Returns @c true if combination of @a seconds and @a nanos represent a valid `google.protobuf.Timestamp`.
25+
[[nodiscard]] bool IsValidTimestamp(std::int64_t seconds, std::int32_t nanos) noexcept;
26+
27+
} // namespace protobuf
28+
29+
USERVER_NAMESPACE_END
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
/// @file userver/protobuf/exceptions.hpp
4+
/// @brief Exceptions thrown by the library.
5+
6+
#include <stdexcept>
7+
8+
USERVER_NAMESPACE_BEGIN
9+
10+
/// @brief Top namespace for the userver protobuf library.
11+
namespace protobuf {
12+
13+
/// @brief Library base exception type.
14+
class Error : public std::runtime_error {
15+
public:
16+
using std::runtime_error::runtime_error;
17+
};
18+
19+
} // namespace protobuf
20+
21+
USERVER_NAMESPACE_END

0 commit comments

Comments
 (0)