3#include <gtest/gtest.h>
5#include <google/protobuf/util/time_util.h>
7#include <userver/proto-structs/io/impl/read.hpp>
8#include <userver/proto-structs/io/impl/write.hpp>
9#include <userver/proto-structs/io/supported_types_conv.hpp>
11#include "messages.pb.h"
16ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<ConversionFailure>,
const messages::ConversionFailure& msg) {
17 if (msg.error_type() == messages::ConversionFailure::TYPE_EXCEPTION) {
18 throw std::runtime_error(
"conversion_failure_exception");
19 }
else if (msg.error_type() == messages::ConversionFailure::TYPE_ERROR) {
20 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber,
"conversion_failure_error");
22 ctx.AddError(1001,
"conversion_failure_error_with_unknown_field");
28void WriteProtoStruct(ups::io::WriteContext& ctx,
const ConversionFailure& obj, messages::ConversionFailure&) {
29 if (obj.error_type == ConversionFailureType::kException) {
30 throw std::runtime_error(
"conversion_failure_exception");
31 }
else if (obj.error_type == ConversionFailureType::kError) {
32 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber,
"conversion_failure_error");
34 ctx.AddError(1001,
"conversion_failure_error_with_unknown_field");
38Scalar ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Scalar>,
const messages::Scalar& msg) {
40 .f1 = ups::io::impl::ReadField<
bool>(
41 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::f1)
43 .f2 = ups::io::impl::ReadField<int32_t>(
44 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::f2)
46 .f3 = ups::io::impl::ReadField<uint32_t>(
47 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::f3)
49 .f4 = ups::io::impl::ReadField<int64_t>(
50 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::f4)
52 .f5 = ups::io::impl::ReadField<uint64_t>(
53 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::f5)
55 .f6 = ups::io::impl::ReadField<
float>(
56 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::f6)
58 .f7 = ups::io::impl::ReadField<
double>(
59 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::f7)
61 .f8 = ups::io::impl::ReadField<std::string>(
62 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF8FieldNumber, &messages::Scalar::f8)
64 .f9 = ups::io::impl::ReadField<std::string>(
65 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF9FieldNumber, &messages::Scalar::f9)
67 .f10 = ups::io::impl::ReadField<TestEnum>(
68 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::f10)
70 .f11 = ups::io::impl::ReadField<std::size_t>(
71 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::f11)
76void WriteScalarStruct(ups::io::WriteContext& ctx, T&& obj, messages::Scalar& msg) {
77 ups::io::impl::WriteField(
79 std::forward<T>(obj).f1,
80 ups::io::impl::CreateFieldSetter(
81 msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::set_f1, &messages::Scalar::clear_f1
84 ups::io::impl::WriteField(
86 std::forward<T>(obj).f2,
87 ups::io::impl::CreateFieldSetter(
88 msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::set_f2, &messages::Scalar::clear_f2
91 ups::io::impl::WriteField(
93 std::forward<T>(obj).f3,
94 ups::io::impl::CreateFieldSetter(
95 msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::set_f3, &messages::Scalar::clear_f3
98 ups::io::impl::WriteField(
100 std::forward<T>(obj).f4,
101 ups::io::impl::CreateFieldSetter(
102 msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::set_f4, &messages::Scalar::clear_f4
105 ups::io::impl::WriteField(
107 std::forward<T>(obj).f5,
108 ups::io::impl::CreateFieldSetter(
109 msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::set_f5, &messages::Scalar::clear_f5
112 ups::io::impl::WriteField(
114 std::forward<T>(obj).f6,
115 ups::io::impl::CreateFieldSetter(
116 msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::set_f6, &messages::Scalar::clear_f6
119 ups::io::impl::WriteField(
121 std::forward<T>(obj).f7,
122 ups::io::impl::CreateFieldSetter(
123 msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::set_f7, &messages::Scalar::clear_f7
126 ups::io::impl::WriteField(
128 std::forward<T>(obj).f8,
129 ups::io::impl::CreateFieldSetter(
131 messages::Scalar::kF8FieldNumber,
132 &messages::Scalar::set_f8<
const std::string&>,
133 &messages::Scalar::set_f8<std::string>,
134 &messages::Scalar::clear_f8
137 ups::io::impl::WriteField(
139 std::forward<T>(obj).f9,
140 ups::io::impl::CreateFieldSetter(
142 messages::Scalar::kF9FieldNumber,
143 &messages::Scalar::set_f9<
const std::string&>,
144 &messages::Scalar::set_f9<std::string>,
145 &messages::Scalar::clear_f9
148 ups::io::impl::WriteField(
150 std::forward<T>(obj).f10,
151 ups::io::impl::CreateFieldSetter(
152 msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::set_f10, &messages::Scalar::clear_f10
155 ups::io::impl::WriteField(
157 std::forward<T>(obj).f11,
158 ups::io::impl::CreateFieldSetter(
159 msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::set_f11, &messages::Scalar::clear_f11
164void WriteProtoStruct(ups::io::WriteContext& ctx,
const Scalar& obj, messages::Scalar& msg) {
165 WriteScalarStruct(ctx, obj, msg);
168void WriteProtoStruct(ups::io::WriteContext& ctx, Scalar&& obj, messages::Scalar& msg) {
169 WriteScalarStruct(ctx, std::move(obj), msg);
172WellKnownStd ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownStd>,
const messages::WellKnownStd& msg) {
174 .f1 = ups::io::impl::ReadField<std::chrono::time_point<std::chrono::system_clock>>(
176 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF1FieldNumber, &messages::WellKnownStd::f1)
178 .f2 = ups::io::impl::ReadField<std::chrono::milliseconds>(
180 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF2FieldNumber, &messages::WellKnownStd::f2)
182 .f3 = ups::io::impl::ReadField<std::chrono::year_month_day>(
184 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF3FieldNumber, &messages::WellKnownStd::f3)
186 .f4 = ups::io::impl::ReadField<std::chrono::hh_mm_ss<std::chrono::microseconds>>(
188 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF4FieldNumber, &messages::WellKnownStd::f4)
193void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownStd& msg) {
194 ups::io::impl::WriteField(
196 std::forward<T>(obj).f1,
197 ups::io::impl::CreateFieldSetter(
199 messages::WellKnownStd::kF1FieldNumber,
200 &messages::WellKnownStd::mutable_f1,
201 &messages::WellKnownStd::clear_f1
204 ups::io::impl::WriteField(
206 std::forward<T>(obj).f2,
207 ups::io::impl::CreateFieldSetter(
209 messages::WellKnownStd::kF2FieldNumber,
210 &messages::WellKnownStd::mutable_f2,
211 &messages::WellKnownStd::clear_f2
214 ups::io::impl::WriteField(
216 std::forward<T>(obj).f3,
217 ups::io::impl::CreateFieldSetter(
219 messages::WellKnownStd::kF3FieldNumber,
220 &messages::WellKnownStd::mutable_f3,
221 &messages::WellKnownStd::clear_f3
224 ups::io::impl::WriteField(
226 std::forward<T>(obj).f4,
227 ups::io::impl::CreateFieldSetter(
229 messages::WellKnownStd::kF4FieldNumber,
230 &messages::WellKnownStd::mutable_f4,
231 &messages::WellKnownStd::clear_f4
236void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownStd& obj, messages::WellKnownStd& msg) {
237 WriteWellKnownStruct(ctx, obj, msg);
240void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownStd&& obj, messages::WellKnownStd& msg) {
241 WriteWellKnownStruct(ctx, std::move(obj), msg);
245ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownUsrv>,
const messages::WellKnownUsrv& msg) {
247 .f1 = ups::io::impl::ReadField<ups::Any>(
249 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF1FieldNumber, &messages::WellKnownUsrv::f1)
251 .f2 = ups::io::impl::ReadField<ups::Timestamp>(
253 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF2FieldNumber, &messages::WellKnownUsrv::f2)
255 .f3 = ups::io::impl::ReadField<ups::Duration>(
257 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF3FieldNumber, &messages::WellKnownUsrv::f3)
259 .f4 = ups::io::impl::ReadField<ups::Date>(
261 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF4FieldNumber, &messages::WellKnownUsrv::f4)
263 .f5 = ups::io::impl::ReadField<ups::TimeOfDay>(
265 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF5FieldNumber, &messages::WellKnownUsrv::f5)
267 .f6 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::datetime::TimeOfDay<std::chrono::microseconds>>(
269 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF6FieldNumber, &messages::WellKnownUsrv::f6)
271 .f7 = ups::io::impl::ReadField<USERVER_NAMESPACE::decimal64::Decimal<3>>(
273 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF7FieldNumber, &messages::WellKnownUsrv::f7)
278void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownUsrv& msg) {
279 ups::io::impl::WriteField(
281 std::forward<T>(obj).f1,
282 ups::io::impl::CreateFieldSetter(
284 messages::WellKnownUsrv::kF1FieldNumber,
285 &messages::WellKnownUsrv::mutable_f1,
286 &messages::WellKnownUsrv::clear_f1
289 ups::io::impl::WriteField(
291 std::forward<T>(obj).f2,
292 ups::io::impl::CreateFieldSetter(
294 messages::WellKnownUsrv::kF2FieldNumber,
295 &messages::WellKnownUsrv::mutable_f2,
296 &messages::WellKnownUsrv::clear_f2
299 ups::io::impl::WriteField(
301 std::forward<T>(obj).f3,
302 ups::io::impl::CreateFieldSetter(
304 messages::WellKnownUsrv::kF3FieldNumber,
305 &messages::WellKnownUsrv::mutable_f3,
306 &messages::WellKnownUsrv::clear_f3
309 ups::io::impl::WriteField(
311 std::forward<T>(obj).f4,
312 ups::io::impl::CreateFieldSetter(
314 messages::WellKnownUsrv::kF4FieldNumber,
315 &messages::WellKnownUsrv::mutable_f4,
316 &messages::WellKnownUsrv::clear_f4
319 ups::io::impl::WriteField(
321 std::forward<T>(obj).f5,
322 ups::io::impl::CreateFieldSetter(
324 messages::WellKnownUsrv::kF5FieldNumber,
325 &messages::WellKnownUsrv::mutable_f5,
326 &messages::WellKnownUsrv::clear_f5
329 ups::io::impl::WriteField(
331 std::forward<T>(obj).f6,
332 ups::io::impl::CreateFieldSetter(
334 messages::WellKnownUsrv::kF6FieldNumber,
335 &messages::WellKnownUsrv::mutable_f6,
336 &messages::WellKnownUsrv::clear_f6
339 ups::io::impl::WriteField(
341 std::forward<T>(obj).f7,
342 ups::io::impl::CreateFieldSetter(
344 messages::WellKnownUsrv::kF7FieldNumber,
345 &messages::WellKnownUsrv::mutable_f7,
346 &messages::WellKnownUsrv::clear_f7
351void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownUsrv& obj, messages::WellKnownUsrv& msg) {
352 WriteWellKnownStruct(ctx, obj, msg);
355void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownUsrv&& obj, messages::WellKnownUsrv& msg) {
356 WriteWellKnownStruct(ctx, std::move(obj), msg);
359Optional ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Optional>,
const messages::Optional& msg) {
361 .f1 = ups::io::impl::ReadField<std::optional<int32_t>>(
363 ups::io::impl::CreateFieldGetter(
364 msg, messages::Optional::kF1FieldNumber, &messages::Optional::f1, &messages::Optional::has_f1
367 .f2 = ups::io::impl::ReadField<std::optional<std::string>>(
369 ups::io::impl::CreateFieldGetter(
370 msg, messages::Optional::kF2FieldNumber, &messages::Optional::f2, &messages::Optional::has_f2
373 .f3 = ups::io::impl::ReadField<std::optional<TestEnum>>(
375 ups::io::impl::CreateFieldGetter(
376 msg, messages::Optional::kF3FieldNumber, &messages::Optional::f3, &messages::Optional::has_f3
379 .f4 = ups::io::impl::ReadField<std::optional<Simple>>(
381 ups::io::impl::CreateFieldGetter(
382 msg, messages::Optional::kF4FieldNumber, &messages::Optional::f4, &messages::Optional::has_f4
388void WriteOptionalStruct(ups::io::WriteContext& ctx, T&& obj, messages::Optional& msg) {
389 ups::io::impl::WriteField(
391 std::forward<T>(obj).f1,
392 ups::io::impl::CreateFieldSetter(
393 msg, messages::Optional::kF1FieldNumber, &messages::Optional::set_f1, &messages::Optional::clear_f1
396 ups::io::impl::WriteField(
398 std::forward<T>(obj).f2,
399 ups::io::impl::CreateFieldSetter(
401 messages::Optional::kF2FieldNumber,
402 &messages::Optional::set_f2<
const std::string&>,
403 &messages::Optional::set_f2<std::string>,
404 &messages::Optional::clear_f2
407 ups::io::impl::WriteField(
409 std::forward<T>(obj).f3,
410 ups::io::impl::CreateFieldSetter(
411 msg, messages::Optional::kF3FieldNumber, &messages::Optional::set_f3, &messages::Optional::clear_f3
414 ups::io::impl::WriteField(
416 std::forward<T>(obj).f4,
417 ups::io::impl::CreateFieldSetter(
418 msg, messages::Optional::kF4FieldNumber, &messages::Optional::mutable_f4, &messages::Optional::clear_f4
423void WriteProtoStruct(ups::io::WriteContext& ctx,
const Optional& obj, messages::Optional& msg) {
424 WriteOptionalStruct(ctx, obj, msg);
426void WriteProtoStruct(ups::io::WriteContext& ctx, Optional&& obj, messages::Optional& msg) {
427 WriteOptionalStruct(ctx, std::move(obj), msg);
430Repeated ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Repeated>,
const messages::Repeated& msg) {
432 .f1 = ups::io::impl::ReadField<std::vector<int32_t>>(
433 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::f1)
435 .f2 = ups::io::impl::ReadField<std::vector<std::string>>(
436 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::f2)
438 .f3 = ups::io::impl::ReadField<std::vector<TestEnum>>(
439 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::f3)
441 .f4 = ups::io::impl::ReadField<std::vector<Simple>>(
442 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::f4)
447void WriteRepeatedStruct(ups::io::WriteContext& ctx, T&& obj, messages::Repeated& msg) {
448 ups::io::impl::WriteField(
450 std::forward<T>(obj).f1,
451 ups::io::impl::CreateFieldSetter(
452 msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::mutable_f1, &messages::Repeated::clear_f1
455 ups::io::impl::WriteField(
457 std::forward<T>(obj).f2,
458 ups::io::impl::CreateFieldSetter(
459 msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::mutable_f2, &messages::Repeated::clear_f2
462 ups::io::impl::WriteField(
464 std::forward<T>(obj).f3,
465 ups::io::impl::CreateFieldSetter(
466 msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::mutable_f3, &messages::Repeated::clear_f3
469 ups::io::impl::WriteField(
471 std::forward<T>(obj).f4,
472 ups::io::impl::CreateFieldSetter(
473 msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::mutable_f4, &messages::Repeated::clear_f4
478void WriteProtoStruct(ups::io::WriteContext& ctx,
const Repeated& obj, messages::Repeated& msg) {
479 WriteRepeatedStruct(ctx, obj, msg);
482void WriteProtoStruct(ups::io::WriteContext& ctx, Repeated&& obj, messages::Repeated& msg) {
483 WriteRepeatedStruct(ctx, std::move(obj), msg);
486Map ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Map>,
const messages::Map& msg) {
488 .f1 = ups::io::impl::ReadField<std::map<int32_t, int32_t>>(
489 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF1FieldNumber, &messages::Map::f1)
491 .f2 = ups::io::impl::ReadField<std::unordered_map<std::string, std::string>>(
492 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF2FieldNumber, &messages::Map::f2)
494 .f3 = ups::io::impl::ReadField<std::map<
bool, TestEnum>>(
495 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF3FieldNumber, &messages::Map::f3)
497 .f4 = ups::io::impl::ReadField<std::unordered_map<std::string, Simple, USERVER_NAMESPACE::utils::StrCaseHash>>(
498 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF4FieldNumber, &messages::Map::f4)
503void WriteMapStruct(ups::io::WriteContext& ctx, T&& obj, messages::Map& msg) {
504 ups::io::impl::WriteField(
506 std::forward<T>(obj).f1,
507 ups::io::impl::CreateFieldSetter(
508 msg, messages::Map::kF1FieldNumber, &messages::Map::mutable_f1, &messages::Map::clear_f1
511 ups::io::impl::WriteField(
513 std::forward<T>(obj).f2,
514 ups::io::impl::CreateFieldSetter(
515 msg, messages::Map::kF2FieldNumber, &messages::Map::mutable_f2, &messages::Map::clear_f2
518 ups::io::impl::WriteField(
520 std::forward<T>(obj).f3,
521 ups::io::impl::CreateFieldSetter(
522 msg, messages::Map::kF3FieldNumber, &messages::Map::mutable_f3, &messages::Map::clear_f3
525 ups::io::impl::WriteField(
527 std::forward<T>(obj).f4,
528 ups::io::impl::CreateFieldSetter(
529 msg, messages::Map::kF4FieldNumber, &messages::Map::mutable_f4, &messages::Map::clear_f4
534void WriteProtoStruct(ups::io::WriteContext& ctx,
const Map& obj, messages::Map& msg) { WriteMapStruct(ctx, obj, msg); }
536void WriteProtoStruct(ups::io::WriteContext& ctx, Map&& obj, messages::Map& msg) {
537 WriteMapStruct(ctx, std::move(obj), msg);
540Oneof ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Oneof>,
const messages::Oneof& msg) {
542 .test_oneof = ups::io::impl::ReadField<Oneof::Type>(
544 ups::io::impl::CreateFieldGetter(
545 msg, messages::Oneof::kF1FieldNumber, &messages::Oneof::f1, &messages::Oneof::has_f1
547 ups::io::impl::CreateFieldGetter(
548 msg, messages::Oneof::kF2FieldNumber, &messages::Oneof::f2, &messages::Oneof::has_f2
550 ups::io::impl::CreateFieldGetter(
551 msg, messages::Oneof::kF3FieldNumber, &messages::Oneof::f3, &messages::Oneof::has_f3
553 ups::io::impl::CreateFieldGetter(
554 msg, messages::Oneof::kF4FieldNumber, &messages::Oneof::f4, &messages::Oneof::has_f4
560void WriteOneofStruct(ups::io::WriteContext& ctx, T&& obj, messages::Oneof& msg) {
561 ups::io::impl::WriteField(
563 std::forward<T>(obj).test_oneof,
564 ups::io::impl::CreateFieldSetter(
565 msg, messages::Oneof::kF1FieldNumber, &messages::Oneof::set_f1, &messages::Oneof::clear_f1
567 ups::io::impl::CreateFieldSetter(
569 messages::Oneof::kF2FieldNumber,
570 &messages::Oneof::set_f2<
const std::string&>,
571 &messages::Oneof::set_f2<std::string>,
572 &messages::Oneof::clear_f2
574 ups::io::impl::CreateFieldSetter(
575 msg, messages::Oneof::kF3FieldNumber, &messages::Oneof::set_f3, &messages::Oneof::clear_f3
577 ups::io::impl::CreateFieldSetter(
578 msg, messages::Oneof::kF4FieldNumber, &messages::Oneof::mutable_f4, &messages::Oneof::clear_f4
583void WriteProtoStruct(ups::io::WriteContext& ctx,
const Oneof& obj, messages::Oneof& msg) {
584 WriteOneofStruct(ctx, obj, msg);
587void WriteProtoStruct(ups::io::WriteContext& ctx, Oneof&& obj, messages::Oneof& msg) {
588 WriteOneofStruct(ctx, std::move(obj), msg);
591Indirect ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Indirect>,
const messages::Indirect& msg) {
593 .f1 = ups::io::impl::ReadField<Indirect::Box<Simple>>(
594 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::f1)
596 .f2 = ups::io::impl::ReadField<std::optional<Indirect::Box<ups::Duration>>>(
598 ups::io::impl::CreateFieldGetter(
599 msg, messages::Indirect::kF2FieldNumber, &messages::Indirect::f2, &messages::Indirect::has_f2
602 .f3 = ups::io::impl::ReadField<std::vector<Indirect::Box<Simple>>>(
603 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::f3)
605 .f4 = ups::io::impl::ReadField<std::map<int32_t, Indirect::Box<Simple>>>(
606 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::f4)
608 .test_oneof = ups::io::impl::ReadField<Indirect::OneofType>(
610 ups::io::impl::CreateFieldGetter(
611 msg, messages::Indirect::kF5FieldNumber, &messages::Indirect::f5, &messages::Indirect::has_f5
613 ups::io::impl::CreateFieldGetter(
614 msg, messages::Indirect::kF6FieldNumber, &messages::Indirect::f6, &messages::Indirect::has_f6
617 .f7 = ups::io::impl::ReadField<Indirect::Box<int32_t>>(
618 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::f7)
620 .f8 = ups::io::impl::ReadField<Indirect::Box<std::vector<Indirect::Box<TestEnum>>>>(
621 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::f8)
623 .f9 = ups::io::impl::ReadField<Indirect::Box<std::map<std::string, Indirect::Box<Simple>>>>(
624 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::f9)
629void WriteIndirectStruct(ups::io::WriteContext& ctx, T&& obj, messages::Indirect& msg) {
630 ups::io::impl::WriteField(
632 std::forward<T>(obj).f1,
633 ups::io::impl::CreateFieldSetter(
634 msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::mutable_f1, &messages::Indirect::clear_f1
637 ups::io::impl::WriteField(
639 std::forward<T>(obj).f2,
640 ups::io::impl::CreateFieldSetter(
641 msg, messages::Indirect::kF2FieldNumber, &messages::Indirect::mutable_f2, &messages::Indirect::clear_f2
644 ups::io::impl::WriteField(
646 std::forward<T>(obj).f3,
647 ups::io::impl::CreateFieldSetter(
648 msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::mutable_f3, &messages::Indirect::clear_f3
651 ups::io::impl::WriteField(
653 std::forward<T>(obj).f4,
654 ups::io::impl::CreateFieldSetter(
655 msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::mutable_f4, &messages::Indirect::clear_f4
658 ups::io::impl::WriteField(
660 std::forward<T>(obj).test_oneof,
661 ups::io::impl::CreateFieldSetter(
662 msg, messages::Indirect::kF5FieldNumber, &messages::Indirect::mutable_f5, &messages::Indirect::clear_f5
664 ups::io::impl::CreateFieldSetter(
666 messages::Indirect::kF6FieldNumber,
667 &messages::Indirect::set_f6<
const std::string&>,
668 &messages::Indirect::set_f6<std::string>,
669 &messages::Indirect::clear_f6
672 ups::io::impl::WriteField(
674 std::forward<T>(obj).f7,
675 ups::io::impl::CreateFieldSetter(
676 msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::set_f7, &messages::Indirect::clear_f7
679 ups::io::impl::WriteField(
681 std::forward<T>(obj).f8,
682 ups::io::impl::CreateFieldSetter(
683 msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::mutable_f8, &messages::Indirect::clear_f8
686 ups::io::impl::WriteField(
688 std::forward<T>(obj).f9,
689 ups::io::impl::CreateFieldSetter(
690 msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::mutable_f9, &messages::Indirect::clear_f9
695void WriteProtoStruct(ups::io::WriteContext& ctx,
const Indirect& obj, messages::Indirect& msg) {
696 WriteIndirectStruct(ctx, obj, msg);
699void WriteProtoStruct(ups::io::WriteContext& ctx, Indirect&& obj, messages::Indirect& msg) {
700 WriteIndirectStruct(ctx, std::move(obj), msg);
703Strong ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Strong>,
const messages::Strong& msg) {
705 .f1 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, int32_t>>(
706 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF1FieldNumber, &messages::Strong::f1)
709 ups::io::impl::ReadField<std::optional<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, std::string>>>(
711 ups::io::impl::CreateFieldGetter(
712 msg, messages::Strong::kF2FieldNumber, &messages::Strong::f2, &messages::Strong::has_f2
715 .f3 = ups::io::impl::ReadField<std::vector<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, TestEnum>>>(
716 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF3FieldNumber, &messages::Strong::f3)
718 .f4 = ups::io::impl::ReadField<std::map<int32_t, USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, Simple>>>(
719 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF4FieldNumber, &messages::Strong::f4)
721 .test_oneof = ups::io::impl::ReadField<Strong::OneofType>(
723 ups::io::impl::CreateFieldGetter(
724 msg, messages::Strong::kF5FieldNumber, &messages::Strong::f5, &messages::Strong::has_f5
730void WriteStrongStruct(ups::io::WriteContext& ctx, T&& obj, messages::Strong& msg) {
731 ups::io::impl::WriteField(
733 std::forward<T>(obj).f1,
734 ups::io::impl::CreateFieldSetter(
735 msg, messages::Strong::kF1FieldNumber, &messages::Strong::set_f1, &messages::Strong::clear_f1
738 ups::io::impl::WriteField(
740 std::forward<T>(obj).f2,
741 ups::io::impl::CreateFieldSetter(
743 messages::Strong::kF2FieldNumber,
744 &messages::Strong::set_f2<
const std::string&>,
745 &messages::Strong::set_f2<std::string>,
746 &messages::Strong::clear_f2
749 ups::io::impl::WriteField(
751 std::forward<T>(obj).f3,
752 ups::io::impl::CreateFieldSetter(
753 msg, messages::Strong::kF3FieldNumber, &messages::Strong::mutable_f3, &messages::Strong::clear_f3
756 ups::io::impl::WriteField(
758 std::forward<T>(obj).f4,
759 ups::io::impl::CreateFieldSetter(
760 msg, messages::Strong::kF4FieldNumber, &messages::Strong::mutable_f4, &messages::Strong::clear_f4
763 ups::io::impl::WriteField(
765 std::forward<T>(obj).test_oneof,
766 ups::io::impl::CreateFieldSetter(
767 msg, messages::Strong::kF1FieldNumber, &messages::Strong::mutable_f5, &messages::Strong::clear_f5
772void WriteProtoStruct(ups::io::WriteContext& ctx,
const Strong& obj, messages::Strong& msg) {
773 WriteStrongStruct(ctx, obj, msg);
776void WriteProtoStruct(ups::io::WriteContext& ctx, Strong&& obj, messages::Strong& msg) {
777 WriteStrongStruct(ctx, std::move(obj), msg);
780Erroneous ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Erroneous>,
const messages::Erroneous& msg) {
782 .f1 = ups::io::impl::ReadField<std::optional<ConversionFailure>>(
784 ups::io::impl::CreateFieldGetter(
785 msg, messages::Erroneous::kF1FieldNumber, &messages::Erroneous::f1, &messages::Erroneous::has_f1
788 .f2 = ups::io::impl::ReadField<std::vector<ConversionFailure>>(
789 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::f2)
791 .f3 = ups::io::impl::ReadField<std::unordered_map<int32_t, ConversionFailure>>(
792 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::f3)
794 .test_oneof = ups::io::impl::ReadField<Erroneous::OneofType>(
796 ups::io::impl::CreateFieldGetter(
797 msg, messages::Erroneous::kF4FieldNumber, &messages::Erroneous::f4, &messages::Erroneous::has_f4
802void WriteProtoStruct(ups::io::WriteContext& ctx,
const Erroneous& obj, messages::Erroneous& msg) {
803 ups::io::impl::WriteField(
806 ups::io::impl::CreateFieldSetter(
807 msg, messages::Erroneous::kF1FieldNumber, &messages::Erroneous::mutable_f1, &messages::Erroneous::clear_f1
810 ups::io::impl::WriteField(
813 ups::io::impl::CreateFieldSetter(
814 msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::mutable_f2, &messages::Erroneous::clear_f2
817 ups::io::impl::WriteField(
820 ups::io::impl::CreateFieldSetter(
821 msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::mutable_f3, &messages::Erroneous::clear_f3
824 ups::io::impl::WriteField(
827 ups::io::impl::CreateFieldSetter(
828 msg, messages::Erroneous::kF4FieldNumber, &messages::Erroneous::mutable_f4, &messages::Erroneous::clear_f4
833void CheckScalarEqual(
const Scalar& obj,
const messages::Scalar& msg) {
834 EXPECT_EQ(obj.f1, msg.f1());
835 EXPECT_EQ(obj.f2, msg.f2());
836 EXPECT_EQ(obj.f3, msg.f3());
837 EXPECT_EQ(obj.f4, msg.f4());
838 EXPECT_EQ(obj.f5, msg.f5());
839 EXPECT_EQ(obj.f6, msg.f6());
840 EXPECT_EQ(obj.f7, msg.f7());
841 EXPECT_EQ(obj.f8, msg.f8());
842 EXPECT_EQ(obj.f9, msg.f9());
843 EXPECT_EQ(obj.f10,
static_cast<TestEnum>(msg.f10()));
844 EXPECT_EQ(
static_cast<
int>(obj.f11), msg.f11());
847void CheckWellKnownStdEqual(
const WellKnownStd& obj,
const messages::WellKnownStd& msg) {
848 using TimeType = std::chrono::time_point<std::chrono::system_clock>;
851 obj.f1.time_since_epoch(),
852 std::chrono::duration_cast<TimeType::duration>(std::chrono::nanoseconds{
853 ::google::protobuf::util::TimeUtil::TimestampToNanoseconds(msg.f1())})
857 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::nanoseconds{
858 ::google::protobuf::util::TimeUtil::DurationToNanoseconds(msg.f2())})
861 EXPECT_EQ(
static_cast<
int>(obj.f3.year()), msg.f3().year());
862 EXPECT_EQ(
static_cast<
unsigned>(obj.f3.month()),
static_cast<
unsigned>(msg.f3().month()));
863 EXPECT_EQ(
static_cast<
unsigned>(obj.f3.day()),
static_cast<
unsigned>(msg.f3().day()));
865 EXPECT_EQ(obj.f4.hours().count(), msg.f4().hours());
866 EXPECT_EQ(obj.f4.minutes().count(), msg.f4().minutes());
867 EXPECT_EQ(obj.f4.seconds().count(), msg.f4().seconds());
869 obj.f4.subseconds().count(),
870 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f4().nanos())).count()
874void CheckWellKnownUsrvEqual(
const WellKnownUsrv& obj,
const messages::WellKnownUsrv& msg) {
875 EXPECT_EQ(obj.f1.GetProtobufAny().type_url(), msg.f1().type_url());
876 EXPECT_EQ(obj.f1.GetProtobufAny().value(), msg.f1().value());
878 EXPECT_EQ(obj.f2.Seconds().count(), msg.f2().seconds());
879 EXPECT_EQ(obj.f2.Nanos().count(), msg.f2().nanos());
881 EXPECT_EQ(obj.f3.Seconds().count(), msg.f3().seconds());
882 EXPECT_EQ(obj.f3.Nanos().count(), msg.f3().nanos());
884 EXPECT_EQ(obj.f4.YearNum(), msg.f4().year());
885 EXPECT_EQ(obj.f4.MonthNum(), msg.f4().month());
886 EXPECT_EQ(obj.f4.DayNum(), msg.f4().day());
888 EXPECT_EQ(obj.f5.Hours().count(), msg.f5().hours());
889 EXPECT_EQ(obj.f5.Minutes().count(), msg.f5().minutes());
890 EXPECT_EQ(obj.f5.Seconds().count(), msg.f5().seconds());
891 EXPECT_EQ(obj.f5.Nanos().count(), msg.f5().nanos());
893 EXPECT_EQ(obj.f6.Hours().count(), msg.f6().hours());
894 EXPECT_EQ(obj.f6.Minutes().count(), msg.f6().minutes());
895 EXPECT_EQ(obj.f6.Seconds().count(), msg.f6().seconds());
897 obj.f6.Subseconds().count(),
898 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f6().nanos())).count()
901 EXPECT_EQ(obj.f7, decimal64::Decimal<3>(msg.f7().value()));
902 EXPECT_EQ(ToString(obj.f7), msg.f7().value());
905void CheckOptionalEqual(
const Optional& obj,
const messages::Optional& msg) {
907 EXPECT_TRUE(msg.has_f1());
908 EXPECT_EQ(obj.f1.value(), msg.f1());
910 EXPECT_FALSE(msg.has_f1());
914 EXPECT_TRUE(msg.has_f2());
915 EXPECT_EQ(obj.f2.value(), msg.f2());
917 EXPECT_FALSE(msg.has_f2());
921 EXPECT_TRUE(msg.has_f3());
922 EXPECT_EQ(obj.f3.value(),
static_cast<TestEnum>(msg.f3()));
924 EXPECT_FALSE(msg.has_f3());
928 EXPECT_TRUE(msg.has_f4());
929 CheckSimpleEqual(obj.f4.value(), msg.f4());
931 EXPECT_FALSE(msg.has_f4());
935void CheckRepeatedEqual(
const Repeated& obj,
const messages::Repeated& msg) {
936 ASSERT_EQ(obj.f1.size(),
static_cast<std::size_t>(msg.f1().size()));
938 for (
int i = 0; i < msg.f1().size(); ++i) {
939 EXPECT_EQ(obj.f1[i], msg.f1()[i]);
942 ASSERT_EQ(obj.f2.size(),
static_cast<std::size_t>(msg.f2().size()));
944 for (
int i = 0; i < msg.f2().size(); ++i) {
945 EXPECT_EQ(obj.f2[i], msg.f2()[i]);
948 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
950 for (
int i = 0; i < msg.f3().size(); ++i) {
951 EXPECT_EQ(
static_cast<
int>(obj.f3[i]), msg.f3()[i]);
954 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
956 for (
int i = 0; i < msg.f4().size(); ++i) {
957 EXPECT_EQ(obj.f4[i].f1, msg.f4()[i].f1());
961void CheckMapEqual(
const Map& obj,
const messages::Map& msg) {
962 ASSERT_EQ(obj.f1.size(),
static_cast<std::size_t>(msg.f1().size()));
964 for (
const auto& [key, value] : msg.f1()) {
965 ASSERT_EQ(obj.f1.count(key), std::size_t{1});
966 EXPECT_EQ(obj.f1.at(key), value);
969 ASSERT_EQ(obj.f2.size(),
static_cast<std::size_t>(msg.f2().size()));
971 for (
const auto& [key, value] : msg.f2()) {
972 ASSERT_EQ(obj.f2.count(key), std::size_t{1});
973 EXPECT_EQ(obj.f2.at(key), value);
976 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
978 for (
const auto& [key, value] : msg.f3()) {
979 ASSERT_EQ(obj.f3.count(key), std::size_t{1});
980 EXPECT_EQ(obj.f3.at(key),
static_cast<TestEnum>(value));
983 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
985 for (
const auto& [key, value] : msg.f4()) {
986 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
987 CheckSimpleEqual(obj.f4.at(key), value);
991void CheckOneofEqual(
const Oneof& obj,
const messages::Oneof& msg) {
992 if (!obj.test_oneof.ContainsAny()) {
993 EXPECT_EQ(msg.test_oneof_case(), messages::Oneof::TEST_ONEOF_NOT_SET);
996 if (obj.test_oneof.Contains(0)) {
997 EXPECT_TRUE(msg.has_f1());
998 EXPECT_EQ(obj.test_oneof.Get<0>(), msg.f1());
1000 EXPECT_FALSE(msg.has_f1());
1003 if (obj.test_oneof.Contains(1)) {
1004 EXPECT_TRUE(msg.has_f2());
1005 EXPECT_EQ(obj.test_oneof.Get<1>(), msg.f2());
1007 EXPECT_FALSE(msg.has_f2());
1010 if (obj.test_oneof.Contains(2)) {
1011 EXPECT_TRUE(msg.has_f3());
1012 EXPECT_EQ(obj.test_oneof.Get<2>(),
static_cast<TestEnum>(msg.f3()));
1014 EXPECT_FALSE(msg.has_f3());
1017 if (obj.test_oneof.Contains(3)) {
1018 EXPECT_TRUE(msg.has_f4());
1019 CheckSimpleEqual(obj.test_oneof.Get<3>(), msg.f4());
1021 EXPECT_FALSE(msg.has_f4());
1025void CheckIndirectEqual(
const Indirect& obj,
const messages::Indirect& msg) {
1026 CheckSimpleEqual(*obj.f1, msg.f1());
1029 EXPECT_TRUE(msg.has_f2());
1030 EXPECT_EQ((*obj.f2.value()).Seconds().count(), msg.f2().seconds());
1031 EXPECT_EQ((*obj.f2.value()).Nanos().count(), msg.f2().nanos());
1033 EXPECT_FALSE(msg.has_f2());
1036 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1038 for (
int i = 0; i < msg.f3().size(); ++i) {
1039 CheckSimpleEqual(*obj.f3[i], msg.f3()[i]);
1042 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1044 for (
const auto& [key, value] : msg.f4()) {
1045 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1046 CheckSimpleEqual(*obj.f4.at(key), value);
1049 if (!obj.test_oneof.ContainsAny()) {
1050 EXPECT_EQ(msg.test_oneof_case(), messages::Indirect::TEST_ONEOF_NOT_SET);
1053 if (obj.test_oneof.Contains(0)) {
1054 EXPECT_TRUE(msg.has_f5());
1055 CheckSimpleEqual(*obj.test_oneof.Get<0>(), msg.f5());
1057 EXPECT_FALSE(msg.has_f5());
1060 if (obj.test_oneof.Contains(1)) {
1061 EXPECT_TRUE(msg.has_f6());
1062 EXPECT_EQ(*obj.test_oneof.Get<1>(), msg.f6());
1064 EXPECT_FALSE(msg.has_f6());
1067 EXPECT_EQ(*obj.f7, msg.f7());
1068 ASSERT_EQ((*obj.f8).size(),
static_cast<std::size_t>(msg.f8().size()));
1070 for (
int i = 0; i < msg.f8().size(); ++i) {
1071 EXPECT_EQ(*((*obj.f8)[i]),
static_cast<TestEnum>(msg.f8()[i]));
1074 ASSERT_EQ((*obj.f9).size(),
static_cast<std::size_t>(msg.f9().size()));
1076 for (
const auto& [key, value] : msg.f9()) {
1077 ASSERT_EQ((*obj.f9).count(key), std::size_t{1});
1078 CheckSimpleEqual(*((*obj.f9).at(key)), value);
1082void CheckStrongEqual(
const Strong& obj,
const messages::Strong& msg) {
1083 EXPECT_EQ(obj.f1.GetUnderlying(), msg.f1());
1086 EXPECT_TRUE(msg.has_f2());
1087 EXPECT_EQ(obj.f2.value().GetUnderlying(), msg.f2());
1089 EXPECT_FALSE(msg.has_f2());
1092 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1094 for (
int i = 0; i < msg.f3().size(); ++i) {
1095 EXPECT_EQ(
static_cast<
int>(obj.f3[i].GetUnderlying()), msg.f3()[i]);
1098 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1100 for (
const auto& [key, value] : msg.f4()) {
1101 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1102 CheckSimpleEqual(obj.f4.at(key).GetUnderlying(), value);
1105 if (!obj.test_oneof.ContainsAny()) {
1106 EXPECT_EQ(msg.test_oneof_case(), messages::Strong::TEST_ONEOF_NOT_SET);
1109 if (obj.test_oneof.Contains(0)) {
1110 EXPECT_TRUE(msg.has_f5());
1111 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Seconds().count(), msg.f5().seconds());
1112 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Nanos().count(), msg.f5().nanos());
1115 EXPECT_FALSE(msg.has_f5());