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"
15ConversionFailure ReadProtoStruct(
16 ups::io::ReadContext& ctx,
17 ups::io::To<ConversionFailure>,
18 const messages::ConversionFailure& msg
20 if (msg.error_type() == messages::ConversionFailure::TYPE_EXCEPTION) {
21 throw std::runtime_error(
"conversion_failure_exception");
22 }
else if (msg.error_type() == messages::ConversionFailure::TYPE_ERROR) {
23 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber,
"conversion_failure_error");
25 ctx.AddError(1001,
"conversion_failure_error_with_unknown_field");
31void WriteProtoStruct(ups::io::WriteContext& ctx,
const ConversionFailure& obj, messages::ConversionFailure&) {
32 if (obj.error_type == ConversionFailureType::kException) {
33 throw std::runtime_error(
"conversion_failure_exception");
34 }
else if (obj.error_type == ConversionFailureType::kError) {
35 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber,
"conversion_failure_error");
37 ctx.AddError(1001,
"conversion_failure_error_with_unknown_field");
41Scalar ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Scalar>,
const messages::Scalar& msg) {
43 .f1 = ups::io::impl::ReadField<
44 bool>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::f1)),
45 .f2 = ups::io::impl::ReadField<int32_t>(
47 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::f2)
49 .f3 = ups::io::impl::ReadField<uint32_t>(
51 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::f3)
53 .f4 = ups::io::impl::ReadField<int64_t>(
55 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::f4)
57 .f5 = ups::io::impl::ReadField<uint64_t>(
59 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::f5)
61 .f6 = ups::io::impl::ReadField<
62 float>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::f6)),
63 .f7 = ups::io::impl::ReadField<
double>(
65 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::f7)
67 .f8 = ups::io::impl::ReadField<std::string>(
69 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF8FieldNumber, &messages::Scalar::f8)
71 .f9 = ups::io::impl::ReadField<std::string>(
73 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF9FieldNumber, &messages::Scalar::f9)
75 .f10 = ups::io::impl::ReadField<TestEnum>(
77 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::f10)
79 .f11 = ups::io::impl::ReadField<std::size_t>(
81 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::f11)
87void WriteScalarStruct(ups::io::WriteContext& ctx, T&& obj, messages::Scalar& msg) {
88 ups::io::impl::WriteField(
90 std::forward<T>(obj).f1,
91 ups::io::impl::CreateFieldSetter(
93 messages::Scalar::kF1FieldNumber,
94 &messages::Scalar::set_f1,
95 &messages::Scalar::clear_f1
98 ups::io::impl::WriteField(
100 std::forward<T>(obj).f2,
101 ups::io::impl::CreateFieldSetter(
103 messages::Scalar::kF2FieldNumber,
104 &messages::Scalar::set_f2,
105 &messages::Scalar::clear_f2
108 ups::io::impl::WriteField(
110 std::forward<T>(obj).f3,
111 ups::io::impl::CreateFieldSetter(
113 messages::Scalar::kF3FieldNumber,
114 &messages::Scalar::set_f3,
115 &messages::Scalar::clear_f3
118 ups::io::impl::WriteField(
120 std::forward<T>(obj).f4,
121 ups::io::impl::CreateFieldSetter(
123 messages::Scalar::kF4FieldNumber,
124 &messages::Scalar::set_f4,
125 &messages::Scalar::clear_f4
128 ups::io::impl::WriteField(
130 std::forward<T>(obj).f5,
131 ups::io::impl::CreateFieldSetter(
133 messages::Scalar::kF5FieldNumber,
134 &messages::Scalar::set_f5,
135 &messages::Scalar::clear_f5
138 ups::io::impl::WriteField(
140 std::forward<T>(obj).f6,
141 ups::io::impl::CreateFieldSetter(
143 messages::Scalar::kF6FieldNumber,
144 &messages::Scalar::set_f6,
145 &messages::Scalar::clear_f6
148 ups::io::impl::WriteField(
150 std::forward<T>(obj).f7,
151 ups::io::impl::CreateFieldSetter(
153 messages::Scalar::kF7FieldNumber,
154 &messages::Scalar::set_f7,
155 &messages::Scalar::clear_f7
158 ups::io::impl::WriteField(
160 std::forward<T>(obj).f8,
161 ups::io::impl::CreateFieldSetter(
163 messages::Scalar::kF8FieldNumber,
164 &messages::Scalar::set_f8<
const std::string&>,
165 &messages::Scalar::set_f8<std::string>,
166 &messages::Scalar::clear_f8
169 ups::io::impl::WriteField(
171 std::forward<T>(obj).f9,
172 ups::io::impl::CreateFieldSetter(
174 messages::Scalar::kF9FieldNumber,
175 &messages::Scalar::set_f9<
const std::string&>,
176 &messages::Scalar::set_f9<std::string>,
177 &messages::Scalar::clear_f9
180 ups::io::impl::WriteField(
182 std::forward<T>(obj).f10,
183 ups::io::impl::CreateFieldSetter(
185 messages::Scalar::kF10FieldNumber,
186 &messages::Scalar::set_f10,
187 &messages::Scalar::clear_f10
190 ups::io::impl::WriteField(
192 std::forward<T>(obj).f11,
193 ups::io::impl::CreateFieldSetter(
195 messages::Scalar::kF11FieldNumber,
196 &messages::Scalar::set_f11,
197 &messages::Scalar::clear_f11
202void WriteProtoStruct(ups::io::WriteContext& ctx,
const Scalar& obj, messages::Scalar& msg) {
203 WriteScalarStruct(ctx, obj, msg);
206void WriteProtoStruct(ups::io::WriteContext& ctx, Scalar&& obj, messages::Scalar& msg) {
207 WriteScalarStruct(ctx, std::move(obj), msg);
210WellKnownStd ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownStd>,
const messages::WellKnownStd& msg) {
212 .f1 = ups::io::impl::ReadField<std::chrono::time_point<std::chrono::system_clock>>(
214 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF1FieldNumber, &messages::WellKnownStd::f1)
216 .f2 = ups::io::impl::ReadField<std::chrono::milliseconds>(
218 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF2FieldNumber, &messages::WellKnownStd::f2)
220 .f3 = ups::io::impl::ReadField<std::chrono::year_month_day>(
222 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF3FieldNumber, &messages::WellKnownStd::f3)
224 .f4 = ups::io::impl::ReadField<std::chrono::hh_mm_ss<std::chrono::microseconds>>(
226 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF4FieldNumber, &messages::WellKnownStd::f4)
232void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownStd& msg) {
233 ups::io::impl::WriteField(
235 std::forward<T>(obj).f1,
236 ups::io::impl::CreateFieldSetter(
238 messages::WellKnownStd::kF1FieldNumber,
239 &messages::WellKnownStd::mutable_f1,
240 &messages::WellKnownStd::clear_f1
243 ups::io::impl::WriteField(
245 std::forward<T>(obj).f2,
246 ups::io::impl::CreateFieldSetter(
248 messages::WellKnownStd::kF2FieldNumber,
249 &messages::WellKnownStd::mutable_f2,
250 &messages::WellKnownStd::clear_f2
253 ups::io::impl::WriteField(
255 std::forward<T>(obj).f3,
256 ups::io::impl::CreateFieldSetter(
258 messages::WellKnownStd::kF3FieldNumber,
259 &messages::WellKnownStd::mutable_f3,
260 &messages::WellKnownStd::clear_f3
263 ups::io::impl::WriteField(
265 std::forward<T>(obj).f4,
266 ups::io::impl::CreateFieldSetter(
268 messages::WellKnownStd::kF4FieldNumber,
269 &messages::WellKnownStd::mutable_f4,
270 &messages::WellKnownStd::clear_f4
275void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownStd& obj, messages::WellKnownStd& msg) {
276 WriteWellKnownStruct(ctx, obj, msg);
279void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownStd&& obj, messages::WellKnownStd& msg) {
280 WriteWellKnownStruct(ctx, std::move(obj), msg);
283WellKnownUsrv ReadProtoStruct(
284 ups::io::ReadContext& ctx,
285 ups::io::To<WellKnownUsrv>,
286 const messages::WellKnownUsrv& msg
289 .f1 = ups::io::impl::ReadField<ups::Any>(
291 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF1FieldNumber, &messages::WellKnownUsrv::f1)
293 .f2 = ups::io::impl::ReadField<ups::Timestamp>(
295 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF2FieldNumber, &messages::WellKnownUsrv::f2)
297 .f3 = ups::io::impl::ReadField<ups::Duration>(
299 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF3FieldNumber, &messages::WellKnownUsrv::f3)
301 .f4 = ups::io::impl::ReadField<ups::Date>(
303 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF4FieldNumber, &messages::WellKnownUsrv::f4)
305 .f5 = ups::io::impl::ReadField<ups::TimeOfDay>(
307 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF5FieldNumber, &messages::WellKnownUsrv::f5)
309 .f6 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::datetime::TimeOfDay<std::chrono::microseconds>>(
311 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF6FieldNumber, &messages::WellKnownUsrv::f6)
313 .f7 = ups::io::impl::ReadField<USERVER_NAMESPACE::decimal64::Decimal<3>>(
315 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF7FieldNumber, &messages::WellKnownUsrv::f7)
321void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownUsrv& msg) {
322 ups::io::impl::WriteField(
324 std::forward<T>(obj).f1,
325 ups::io::impl::CreateFieldSetter(
327 messages::WellKnownUsrv::kF1FieldNumber,
328 &messages::WellKnownUsrv::mutable_f1,
329 &messages::WellKnownUsrv::clear_f1
332 ups::io::impl::WriteField(
334 std::forward<T>(obj).f2,
335 ups::io::impl::CreateFieldSetter(
337 messages::WellKnownUsrv::kF2FieldNumber,
338 &messages::WellKnownUsrv::mutable_f2,
339 &messages::WellKnownUsrv::clear_f2
342 ups::io::impl::WriteField(
344 std::forward<T>(obj).f3,
345 ups::io::impl::CreateFieldSetter(
347 messages::WellKnownUsrv::kF3FieldNumber,
348 &messages::WellKnownUsrv::mutable_f3,
349 &messages::WellKnownUsrv::clear_f3
352 ups::io::impl::WriteField(
354 std::forward<T>(obj).f4,
355 ups::io::impl::CreateFieldSetter(
357 messages::WellKnownUsrv::kF4FieldNumber,
358 &messages::WellKnownUsrv::mutable_f4,
359 &messages::WellKnownUsrv::clear_f4
362 ups::io::impl::WriteField(
364 std::forward<T>(obj).f5,
365 ups::io::impl::CreateFieldSetter(
367 messages::WellKnownUsrv::kF5FieldNumber,
368 &messages::WellKnownUsrv::mutable_f5,
369 &messages::WellKnownUsrv::clear_f5
372 ups::io::impl::WriteField(
374 std::forward<T>(obj).f6,
375 ups::io::impl::CreateFieldSetter(
377 messages::WellKnownUsrv::kF6FieldNumber,
378 &messages::WellKnownUsrv::mutable_f6,
379 &messages::WellKnownUsrv::clear_f6
382 ups::io::impl::WriteField(
384 std::forward<T>(obj).f7,
385 ups::io::impl::CreateFieldSetter(
387 messages::WellKnownUsrv::kF7FieldNumber,
388 &messages::WellKnownUsrv::mutable_f7,
389 &messages::WellKnownUsrv::clear_f7
394void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownUsrv& obj, messages::WellKnownUsrv& msg) {
395 WriteWellKnownStruct(ctx, obj, msg);
398void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownUsrv&& obj, messages::WellKnownUsrv& msg) {
399 WriteWellKnownStruct(ctx, std::move(obj), msg);
402Optional ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Optional>,
const messages::Optional& msg) {
404 .f1 = ups::io::impl::ReadField<std::optional<int32_t>>(
406 ups::io::impl::CreateFieldGetter(
408 messages::Optional::kF1FieldNumber,
409 &messages::Optional::f1,
410 &messages::Optional::has_f1
413 .f2 = ups::io::impl::ReadField<std::optional<std::string>>(
415 ups::io::impl::CreateFieldGetter(
417 messages::Optional::kF2FieldNumber,
418 &messages::Optional::f2,
419 &messages::Optional::has_f2
422 .f3 = ups::io::impl::ReadField<std::optional<TestEnum>>(
424 ups::io::impl::CreateFieldGetter(
426 messages::Optional::kF3FieldNumber,
427 &messages::Optional::f3,
428 &messages::Optional::has_f3
431 .f4 = ups::io::impl::ReadField<std::optional<Simple>>(
433 ups::io::impl::CreateFieldGetter(
435 messages::Optional::kF4FieldNumber,
436 &messages::Optional::f4,
437 &messages::Optional::has_f4
444void WriteOptionalStruct(ups::io::WriteContext& ctx, T&& obj, messages::Optional& msg) {
445 ups::io::impl::WriteField(
447 std::forward<T>(obj).f1,
448 ups::io::impl::CreateFieldSetter(
450 messages::Optional::kF1FieldNumber,
451 &messages::Optional::set_f1,
452 &messages::Optional::clear_f1
455 ups::io::impl::WriteField(
457 std::forward<T>(obj).f2,
458 ups::io::impl::CreateFieldSetter(
460 messages::Optional::kF2FieldNumber,
461 &messages::Optional::set_f2<
const std::string&>,
462 &messages::Optional::set_f2<std::string>,
463 &messages::Optional::clear_f2
466 ups::io::impl::WriteField(
468 std::forward<T>(obj).f3,
469 ups::io::impl::CreateFieldSetter(
471 messages::Optional::kF3FieldNumber,
472 &messages::Optional::set_f3,
473 &messages::Optional::clear_f3
476 ups::io::impl::WriteField(
478 std::forward<T>(obj).f4,
479 ups::io::impl::CreateFieldSetter(
481 messages::Optional::kF4FieldNumber,
482 &messages::Optional::mutable_f4,
483 &messages::Optional::clear_f4
488void WriteProtoStruct(ups::io::WriteContext& ctx,
const Optional& obj, messages::Optional& msg) {
489 WriteOptionalStruct(ctx, obj, msg);
491void WriteProtoStruct(ups::io::WriteContext& ctx, Optional&& obj, messages::Optional& msg) {
492 WriteOptionalStruct(ctx, std::move(obj), msg);
495Repeated ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Repeated>,
const messages::Repeated& msg) {
497 .f1 = ups::io::impl::ReadField<std::vector<int32_t>>(
499 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::f1)
501 .f2 = ups::io::impl::ReadField<std::vector<std::string>>(
503 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::f2)
505 .f3 = ups::io::impl::ReadField<std::vector<TestEnum>>(
507 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::f3)
509 .f4 = ups::io::impl::ReadField<std::vector<Simple>>(
511 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::f4)
517void WriteRepeatedStruct(ups::io::WriteContext& ctx, T&& obj, messages::Repeated& msg) {
518 ups::io::impl::WriteField(
520 std::forward<T>(obj).f1,
521 ups::io::impl::CreateFieldSetter(
523 messages::Repeated::kF1FieldNumber,
524 &messages::Repeated::mutable_f1,
525 &messages::Repeated::clear_f1
528 ups::io::impl::WriteField(
530 std::forward<T>(obj).f2,
531 ups::io::impl::CreateFieldSetter(
533 messages::Repeated::kF2FieldNumber,
534 &messages::Repeated::mutable_f2,
535 &messages::Repeated::clear_f2
538 ups::io::impl::WriteField(
540 std::forward<T>(obj).f3,
541 ups::io::impl::CreateFieldSetter(
543 messages::Repeated::kF3FieldNumber,
544 &messages::Repeated::mutable_f3,
545 &messages::Repeated::clear_f3
548 ups::io::impl::WriteField(
550 std::forward<T>(obj).f4,
551 ups::io::impl::CreateFieldSetter(
553 messages::Repeated::kF4FieldNumber,
554 &messages::Repeated::mutable_f4,
555 &messages::Repeated::clear_f4
560void WriteProtoStruct(ups::io::WriteContext& ctx,
const Repeated& obj, messages::Repeated& msg) {
561 WriteRepeatedStruct(ctx, obj, msg);
564void WriteProtoStruct(ups::io::WriteContext& ctx, Repeated&& obj, messages::Repeated& msg) {
565 WriteRepeatedStruct(ctx, std::move(obj), msg);
568Map ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Map>,
const messages::Map& msg) {
570 .f1 = ups::io::impl::ReadField<std::map<
572 int32_t>>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF1FieldNumber, &messages::Map::f1)),
573 .f2 = ups::io::impl::ReadField<std::unordered_map<std::string, std::string>>(
575 ups::io::impl::CreateFieldGetter(msg, messages::Map::kF2FieldNumber, &messages::Map::f2)
577 .f3 = ups::io::impl::ReadField<std::map<
579 TestEnum>>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF3FieldNumber, &messages::Map::f3)),
580 .f4 = ups::io::impl::ReadField<std::unordered_map<std::string, Simple, USERVER_NAMESPACE::utils::StrCaseHash>>(
582 ups::io::impl::CreateFieldGetter(msg, messages::Map::kF4FieldNumber, &messages::Map::f4)
588void WriteMapStruct(ups::io::WriteContext& ctx, T&& obj, messages::Map& msg) {
589 ups::io::impl::WriteField(
591 std::forward<T>(obj).f1,
592 ups::io::impl::CreateFieldSetter(
594 messages::Map::kF1FieldNumber,
595 &messages::Map::mutable_f1,
596 &messages::Map::clear_f1
599 ups::io::impl::WriteField(
601 std::forward<T>(obj).f2,
602 ups::io::impl::CreateFieldSetter(
604 messages::Map::kF2FieldNumber,
605 &messages::Map::mutable_f2,
606 &messages::Map::clear_f2
609 ups::io::impl::WriteField(
611 std::forward<T>(obj).f3,
612 ups::io::impl::CreateFieldSetter(
614 messages::Map::kF3FieldNumber,
615 &messages::Map::mutable_f3,
616 &messages::Map::clear_f3
619 ups::io::impl::WriteField(
621 std::forward<T>(obj).f4,
622 ups::io::impl::CreateFieldSetter(
624 messages::Map::kF4FieldNumber,
625 &messages::Map::mutable_f4,
626 &messages::Map::clear_f4
631void WriteProtoStruct(ups::io::WriteContext& ctx,
const Map& obj, messages::Map& msg) { WriteMapStruct(ctx, obj, msg); }
633void WriteProtoStruct(ups::io::WriteContext& ctx, Map&& obj, messages::Map& msg) {
634 WriteMapStruct(ctx, std::move(obj), msg);
637Oneof ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Oneof>,
const messages::Oneof& msg) {
639 .test_oneof = ups::io::impl::ReadField<Oneof::Type>(
641 ups::io::impl::CreateFieldGetter(
643 messages::Oneof::kF1FieldNumber,
644 &messages::Oneof::f1,
645 &messages::Oneof::has_f1
647 ups::io::impl::CreateFieldGetter(
649 messages::Oneof::kF2FieldNumber,
650 &messages::Oneof::f2,
651 &messages::Oneof::has_f2
653 ups::io::impl::CreateFieldGetter(
655 messages::Oneof::kF3FieldNumber,
656 &messages::Oneof::f3,
657 &messages::Oneof::has_f3
659 ups::io::impl::CreateFieldGetter(
661 messages::Oneof::kF4FieldNumber,
662 &messages::Oneof::f4,
663 &messages::Oneof::has_f4
670void WriteOneofStruct(ups::io::WriteContext& ctx, T&& obj, messages::Oneof& msg) {
671 ups::io::impl::WriteField(
673 std::forward<T>(obj).test_oneof,
674 ups::io::impl::CreateFieldSetter(
676 messages::Oneof::kF1FieldNumber,
677 &messages::Oneof::set_f1,
678 &messages::Oneof::clear_f1
680 ups::io::impl::CreateFieldSetter(
682 messages::Oneof::kF2FieldNumber,
683 &messages::Oneof::set_f2<
const std::string&>,
684 &messages::Oneof::set_f2<std::string>,
685 &messages::Oneof::clear_f2
687 ups::io::impl::CreateFieldSetter(
689 messages::Oneof::kF3FieldNumber,
690 &messages::Oneof::set_f3,
691 &messages::Oneof::clear_f3
693 ups::io::impl::CreateFieldSetter(
695 messages::Oneof::kF4FieldNumber,
696 &messages::Oneof::mutable_f4,
697 &messages::Oneof::clear_f4
702void WriteProtoStruct(ups::io::WriteContext& ctx,
const Oneof& obj, messages::Oneof& msg) {
703 WriteOneofStruct(ctx, obj, msg);
706void WriteProtoStruct(ups::io::WriteContext& ctx, Oneof&& obj, messages::Oneof& msg) {
707 WriteOneofStruct(ctx, std::move(obj), msg);
710Indirect ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Indirect>,
const messages::Indirect& msg) {
712 .f1 = ups::io::impl::ReadField<Indirect::Box<Simple>>(
714 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::f1)
716 .f2 = ups::io::impl::ReadField<std::optional<Indirect::Box<ups::Duration>>>(
718 ups::io::impl::CreateFieldGetter(
720 messages::Indirect::kF2FieldNumber,
721 &messages::Indirect::f2,
722 &messages::Indirect::has_f2
725 .f3 = ups::io::impl::ReadField<std::vector<Indirect::Box<Simple>>>(
727 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::f3)
729 .f4 = ups::io::impl::ReadField<std::map<int32_t, Indirect::Box<Simple>>>(
731 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::f4)
733 .test_oneof = ups::io::impl::ReadField<Indirect::OneofType>(
735 ups::io::impl::CreateFieldGetter(
737 messages::Indirect::kF5FieldNumber,
738 &messages::Indirect::f5,
739 &messages::Indirect::has_f5
741 ups::io::impl::CreateFieldGetter(
743 messages::Indirect::kF6FieldNumber,
744 &messages::Indirect::f6,
745 &messages::Indirect::has_f6
748 .f7 = ups::io::impl::ReadField<Indirect::Box<int32_t>>(
750 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::f7)
752 .f8 = ups::io::impl::ReadField<Indirect::Box<std::vector<Indirect::Box<TestEnum>>>>(
754 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::f8)
756 .f9 = ups::io::impl::ReadField<Indirect::Box<std::map<std::string, Indirect::Box<Simple>>>>(
758 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::f9)
764void WriteIndirectStruct(ups::io::WriteContext& ctx, T&& obj, messages::Indirect& msg) {
765 ups::io::impl::WriteField(
767 std::forward<T>(obj).f1,
768 ups::io::impl::CreateFieldSetter(
770 messages::Indirect::kF1FieldNumber,
771 &messages::Indirect::mutable_f1,
772 &messages::Indirect::clear_f1
775 ups::io::impl::WriteField(
777 std::forward<T>(obj).f2,
778 ups::io::impl::CreateFieldSetter(
780 messages::Indirect::kF2FieldNumber,
781 &messages::Indirect::mutable_f2,
782 &messages::Indirect::clear_f2
785 ups::io::impl::WriteField(
787 std::forward<T>(obj).f3,
788 ups::io::impl::CreateFieldSetter(
790 messages::Indirect::kF3FieldNumber,
791 &messages::Indirect::mutable_f3,
792 &messages::Indirect::clear_f3
795 ups::io::impl::WriteField(
797 std::forward<T>(obj).f4,
798 ups::io::impl::CreateFieldSetter(
800 messages::Indirect::kF4FieldNumber,
801 &messages::Indirect::mutable_f4,
802 &messages::Indirect::clear_f4
805 ups::io::impl::WriteField(
807 std::forward<T>(obj).test_oneof,
808 ups::io::impl::CreateFieldSetter(
810 messages::Indirect::kF5FieldNumber,
811 &messages::Indirect::mutable_f5,
812 &messages::Indirect::clear_f5
814 ups::io::impl::CreateFieldSetter(
816 messages::Indirect::kF6FieldNumber,
817 &messages::Indirect::set_f6<
const std::string&>,
818 &messages::Indirect::set_f6<std::string>,
819 &messages::Indirect::clear_f6
822 ups::io::impl::WriteField(
824 std::forward<T>(obj).f7,
825 ups::io::impl::CreateFieldSetter(
827 messages::Indirect::kF7FieldNumber,
828 &messages::Indirect::set_f7,
829 &messages::Indirect::clear_f7
832 ups::io::impl::WriteField(
834 std::forward<T>(obj).f8,
835 ups::io::impl::CreateFieldSetter(
837 messages::Indirect::kF8FieldNumber,
838 &messages::Indirect::mutable_f8,
839 &messages::Indirect::clear_f8
842 ups::io::impl::WriteField(
844 std::forward<T>(obj).f9,
845 ups::io::impl::CreateFieldSetter(
847 messages::Indirect::kF9FieldNumber,
848 &messages::Indirect::mutable_f9,
849 &messages::Indirect::clear_f9
854void WriteProtoStruct(ups::io::WriteContext& ctx,
const Indirect& obj, messages::Indirect& msg) {
855 WriteIndirectStruct(ctx, obj, msg);
858void WriteProtoStruct(ups::io::WriteContext& ctx, Indirect&& obj, messages::Indirect& msg) {
859 WriteIndirectStruct(ctx, std::move(obj), msg);
862Strong ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Strong>,
const messages::Strong& msg) {
864 .f1 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, int32_t>>(
866 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF1FieldNumber, &messages::Strong::f1)
868 .f2 = ups::io::impl::ReadField<
869 std::optional<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, std::string>>>(
871 ups::io::impl::CreateFieldGetter(
873 messages::Strong::kF2FieldNumber,
874 &messages::Strong::f2,
875 &messages::Strong::has_f2
878 .f3 = ups::io::impl::ReadField<std::vector<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, TestEnum>>>(
880 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF3FieldNumber, &messages::Strong::f3)
882 .f4 = ups::io::impl::ReadField<std::map<int32_t, USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, Simple>>>(
884 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF4FieldNumber, &messages::Strong::f4)
886 .test_oneof = ups::io::impl::ReadField<Strong::OneofType>(
888 ups::io::impl::CreateFieldGetter(
890 messages::Strong::kF5FieldNumber,
891 &messages::Strong::f5,
892 &messages::Strong::has_f5
899void WriteStrongStruct(ups::io::WriteContext& ctx, T&& obj, messages::Strong& msg) {
900 ups::io::impl::WriteField(
902 std::forward<T>(obj).f1,
903 ups::io::impl::CreateFieldSetter(
905 messages::Strong::kF1FieldNumber,
906 &messages::Strong::set_f1,
907 &messages::Strong::clear_f1
910 ups::io::impl::WriteField(
912 std::forward<T>(obj).f2,
913 ups::io::impl::CreateFieldSetter(
915 messages::Strong::kF2FieldNumber,
916 &messages::Strong::set_f2<
const std::string&>,
917 &messages::Strong::set_f2<std::string>,
918 &messages::Strong::clear_f2
921 ups::io::impl::WriteField(
923 std::forward<T>(obj).f3,
924 ups::io::impl::CreateFieldSetter(
926 messages::Strong::kF3FieldNumber,
927 &messages::Strong::mutable_f3,
928 &messages::Strong::clear_f3
931 ups::io::impl::WriteField(
933 std::forward<T>(obj).f4,
934 ups::io::impl::CreateFieldSetter(
936 messages::Strong::kF4FieldNumber,
937 &messages::Strong::mutable_f4,
938 &messages::Strong::clear_f4
941 ups::io::impl::WriteField(
943 std::forward<T>(obj).test_oneof,
944 ups::io::impl::CreateFieldSetter(
946 messages::Strong::kF1FieldNumber,
947 &messages::Strong::mutable_f5,
948 &messages::Strong::clear_f5
953void WriteProtoStruct(ups::io::WriteContext& ctx,
const Strong& obj, messages::Strong& msg) {
954 WriteStrongStruct(ctx, obj, msg);
957void WriteProtoStruct(ups::io::WriteContext& ctx, Strong&& obj, messages::Strong& msg) {
958 WriteStrongStruct(ctx, std::move(obj), msg);
961Erroneous ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Erroneous>,
const messages::Erroneous& msg) {
963 .f1 = ups::io::impl::ReadField<std::optional<ConversionFailure>>(
965 ups::io::impl::CreateFieldGetter(
967 messages::Erroneous::kF1FieldNumber,
968 &messages::Erroneous::f1,
969 &messages::Erroneous::has_f1
972 .f2 = ups::io::impl::ReadField<std::vector<ConversionFailure>>(
974 ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::f2)
976 .f3 = ups::io::impl::ReadField<std::unordered_map<int32_t, ConversionFailure>>(
978 ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::f3)
980 .test_oneof = ups::io::impl::ReadField<Erroneous::OneofType>(
982 ups::io::impl::CreateFieldGetter(
984 messages::Erroneous::kF4FieldNumber,
985 &messages::Erroneous::f4,
986 &messages::Erroneous::has_f4
992void WriteProtoStruct(ups::io::WriteContext& ctx,
const Erroneous& obj, messages::Erroneous& msg) {
993 ups::io::impl::WriteField(
996 ups::io::impl::CreateFieldSetter(
998 messages::Erroneous::kF1FieldNumber,
999 &messages::Erroneous::mutable_f1,
1000 &messages::Erroneous::clear_f1
1003 ups::io::impl::WriteField(
1006 ups::io::impl::CreateFieldSetter(
1008 messages::Erroneous::kF2FieldNumber,
1009 &messages::Erroneous::mutable_f2,
1010 &messages::Erroneous::clear_f2
1013 ups::io::impl::WriteField(
1016 ups::io::impl::CreateFieldSetter(
1018 messages::Erroneous::kF3FieldNumber,
1019 &messages::Erroneous::mutable_f3,
1020 &messages::Erroneous::clear_f3
1023 ups::io::impl::WriteField(
1026 ups::io::impl::CreateFieldSetter(
1028 messages::Erroneous::kF4FieldNumber,
1029 &messages::Erroneous::mutable_f4,
1030 &messages::Erroneous::clear_f4
1035void CheckScalarEqual(
const Scalar& obj,
const messages::Scalar& msg) {
1036 EXPECT_EQ(obj.f1, msg.f1());
1037 EXPECT_EQ(obj.f2, msg.f2());
1038 EXPECT_EQ(obj.f3, msg.f3());
1039 EXPECT_EQ(obj.f4, msg.f4());
1040 EXPECT_EQ(obj.f5, msg.f5());
1041 EXPECT_EQ(obj.f6, msg.f6());
1042 EXPECT_EQ(obj.f7, msg.f7());
1043 EXPECT_EQ(obj.f8, msg.f8());
1044 EXPECT_EQ(obj.f9, msg.f9());
1045 EXPECT_EQ(obj.f10,
static_cast<TestEnum>(msg.f10()));
1046 EXPECT_EQ(
static_cast<
int>(obj.f11), msg.f11());
1049void CheckWellKnownStdEqual(
const WellKnownStd& obj,
const messages::WellKnownStd& msg) {
1050 using TimeType = std::chrono::time_point<std::chrono::system_clock>;
1053 obj.f1.time_since_epoch(),
1054 std::chrono::duration_cast<TimeType::duration>(std::chrono::nanoseconds{
1055 ::google::protobuf::util::TimeUtil::TimestampToNanoseconds(msg.f1())
1060 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::nanoseconds{
1061 ::google::protobuf::util::TimeUtil::DurationToNanoseconds(msg.f2())
1065 EXPECT_EQ(
static_cast<
int>(obj.f3.year()), msg.f3().year());
1066 EXPECT_EQ(
static_cast<
unsigned>(obj.f3.month()),
static_cast<
unsigned>(msg.f3().month()));
1067 EXPECT_EQ(
static_cast<
unsigned>(obj.f3.day()),
static_cast<
unsigned>(msg.f3().day()));
1069 EXPECT_EQ(obj.f4.hours().count(), msg.f4().hours());
1070 EXPECT_EQ(obj.f4.minutes().count(), msg.f4().minutes());
1071 EXPECT_EQ(obj.f4.seconds().count(), msg.f4().seconds());
1073 obj.f4.subseconds().count(),
1074 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f4().nanos())).count()
1078void CheckWellKnownUsrvEqual(
const WellKnownUsrv& obj,
const messages::WellKnownUsrv& msg) {
1079 EXPECT_EQ(obj.f1.GetProtobufAny().type_url(), msg.f1().type_url());
1080 EXPECT_EQ(obj.f1.GetProtobufAny().value(), msg.f1().value());
1082 EXPECT_EQ(obj.f2.Seconds().count(), msg.f2().seconds());
1083 EXPECT_EQ(obj.f2.Nanos().count(), msg.f2().nanos());
1085 EXPECT_EQ(obj.f3.Seconds().count(), msg.f3().seconds());
1086 EXPECT_EQ(obj.f3.Nanos().count(), msg.f3().nanos());
1088 EXPECT_EQ(obj.f4.YearNum(), msg.f4().year());
1089 EXPECT_EQ(obj.f4.MonthNum(), msg.f4().month());
1090 EXPECT_EQ(obj.f4.DayNum(), msg.f4().day());
1092 EXPECT_EQ(obj.f5.Hours().count(), msg.f5().hours());
1093 EXPECT_EQ(obj.f5.Minutes().count(), msg.f5().minutes());
1094 EXPECT_EQ(obj.f5.Seconds().count(), msg.f5().seconds());
1095 EXPECT_EQ(obj.f5.Nanos().count(), msg.f5().nanos());
1097 EXPECT_EQ(obj.f6.Hours().count(), msg.f6().hours());
1098 EXPECT_EQ(obj.f6.Minutes().count(), msg.f6().minutes());
1099 EXPECT_EQ(obj.f6.Seconds().count(), msg.f6().seconds());
1101 obj.f6.Subseconds().count(),
1102 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f6().nanos())).count()
1105 EXPECT_EQ(obj.f7, decimal64::Decimal<3>(msg.f7().value()));
1106 EXPECT_EQ(ToString(obj.f7), msg.f7().value());
1109void CheckOptionalEqual(
const Optional& obj,
const messages::Optional& msg) {
1111 EXPECT_TRUE(msg.has_f1());
1112 EXPECT_EQ(obj.f1.value(), msg.f1());
1114 EXPECT_FALSE(msg.has_f1());
1118 EXPECT_TRUE(msg.has_f2());
1119 EXPECT_EQ(obj.f2.value(), msg.f2());
1121 EXPECT_FALSE(msg.has_f2());
1125 EXPECT_TRUE(msg.has_f3());
1126 EXPECT_EQ(obj.f3.value(),
static_cast<TestEnum>(msg.f3()));
1128 EXPECT_FALSE(msg.has_f3());
1132 EXPECT_TRUE(msg.has_f4());
1133 CheckSimpleEqual(obj.f4.value(), msg.f4());
1135 EXPECT_FALSE(msg.has_f4());
1139void CheckRepeatedEqual(
const Repeated& obj,
const messages::Repeated& msg) {
1140 ASSERT_EQ(obj.f1.size(),
static_cast<std::size_t>(msg.f1().size()));
1142 for (
int i = 0; i < msg.f1().size(); ++i) {
1143 EXPECT_EQ(obj.f1[i], msg.f1()[i]);
1146 ASSERT_EQ(obj.f2.size(),
static_cast<std::size_t>(msg.f2().size()));
1148 for (
int i = 0; i < msg.f2().size(); ++i) {
1149 EXPECT_EQ(obj.f2[i], msg.f2()[i]);
1152 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1154 for (
int i = 0; i < msg.f3().size(); ++i) {
1155 EXPECT_EQ(
static_cast<
int>(obj.f3[i]), msg.f3()[i]);
1158 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1160 for (
int i = 0; i < msg.f4().size(); ++i) {
1161 EXPECT_EQ(obj.f4[i].f1, msg.f4()[i].f1());
1165void CheckMapEqual(
const Map& obj,
const messages::Map& msg) {
1166 ASSERT_EQ(obj.f1.size(),
static_cast<std::size_t>(msg.f1().size()));
1168 for (
const auto& [key, value] : msg.f1()) {
1169 ASSERT_EQ(obj.f1.count(key), std::size_t{1});
1170 EXPECT_EQ(obj.f1.at(key), value);
1173 ASSERT_EQ(obj.f2.size(),
static_cast<std::size_t>(msg.f2().size()));
1175 for (
const auto& [key, value] : msg.f2()) {
1176 ASSERT_EQ(obj.f2.count(key), std::size_t{1});
1177 EXPECT_EQ(obj.f2.at(key), value);
1180 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1182 for (
const auto& [key, value] : msg.f3()) {
1183 ASSERT_EQ(obj.f3.count(key), std::size_t{1});
1184 EXPECT_EQ(obj.f3.at(key),
static_cast<TestEnum>(value));
1187 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1189 for (
const auto& [key, value] : msg.f4()) {
1190 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1191 CheckSimpleEqual(obj.f4.at(key), value);
1195void CheckOneofEqual(
const Oneof& obj,
const messages::Oneof& msg) {
1196 if (!obj.test_oneof.ContainsAny()) {
1197 EXPECT_EQ(msg.test_oneof_case(), messages::Oneof::TEST_ONEOF_NOT_SET);
1200 if (obj.test_oneof.Contains(0)) {
1201 EXPECT_TRUE(msg.has_f1());
1202 EXPECT_EQ(obj.test_oneof.Get<0>(), msg.f1());
1204 EXPECT_FALSE(msg.has_f1());
1207 if (obj.test_oneof.Contains(1)) {
1208 EXPECT_TRUE(msg.has_f2());
1209 EXPECT_EQ(obj.test_oneof.Get<1>(), msg.f2());
1211 EXPECT_FALSE(msg.has_f2());
1214 if (obj.test_oneof.Contains(2)) {
1215 EXPECT_TRUE(msg.has_f3());
1216 EXPECT_EQ(obj.test_oneof.Get<2>(),
static_cast<TestEnum>(msg.f3()));
1218 EXPECT_FALSE(msg.has_f3());
1221 if (obj.test_oneof.Contains(3)) {
1222 EXPECT_TRUE(msg.has_f4());
1223 CheckSimpleEqual(obj.test_oneof.Get<3>(), msg.f4());
1225 EXPECT_FALSE(msg.has_f4());
1229void CheckIndirectEqual(
const Indirect& obj,
const messages::Indirect& msg) {
1230 CheckSimpleEqual(*obj.f1, msg.f1());
1233 EXPECT_TRUE(msg.has_f2());
1234 EXPECT_EQ((*obj.f2.value()).Seconds().count(), msg.f2().seconds());
1235 EXPECT_EQ((*obj.f2.value()).Nanos().count(), msg.f2().nanos());
1237 EXPECT_FALSE(msg.has_f2());
1240 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1242 for (
int i = 0; i < msg.f3().size(); ++i) {
1243 CheckSimpleEqual(*obj.f3[i], msg.f3()[i]);
1246 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1248 for (
const auto& [key, value] : msg.f4()) {
1249 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1250 CheckSimpleEqual(*obj.f4.at(key), value);
1253 if (!obj.test_oneof.ContainsAny()) {
1254 EXPECT_EQ(msg.test_oneof_case(), messages::Indirect::TEST_ONEOF_NOT_SET);
1257 if (obj.test_oneof.Contains(0)) {
1258 EXPECT_TRUE(msg.has_f5());
1259 CheckSimpleEqual(*obj.test_oneof.Get<0>(), msg.f5());
1261 EXPECT_FALSE(msg.has_f5());
1264 if (obj.test_oneof.Contains(1)) {
1265 EXPECT_TRUE(msg.has_f6());
1266 EXPECT_EQ(*obj.test_oneof.Get<1>(), msg.f6());
1268 EXPECT_FALSE(msg.has_f6());
1271 EXPECT_EQ(*obj.f7, msg.f7());
1272 ASSERT_EQ((*obj.f8).size(),
static_cast<std::size_t>(msg.f8().size()));
1274 for (
int i = 0; i < msg.f8().size(); ++i) {
1275 EXPECT_EQ(*((*obj.f8)[i]),
static_cast<TestEnum>(msg.f8()[i]));
1278 ASSERT_EQ((*obj.f9).size(),
static_cast<std::size_t>(msg.f9().size()));
1280 for (
const auto& [key, value] : msg.f9()) {
1281 ASSERT_EQ((*obj.f9).count(key), std::size_t{1});
1282 CheckSimpleEqual(*((*obj.f9).at(key)), value);
1286void CheckStrongEqual(
const Strong& obj,
const messages::Strong& msg) {
1287 EXPECT_EQ(obj.f1.GetUnderlying(), msg.f1());
1290 EXPECT_TRUE(msg.has_f2());
1291 EXPECT_EQ(obj.f2.value().GetUnderlying(), msg.f2());
1293 EXPECT_FALSE(msg.has_f2());
1296 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1298 for (
int i = 0; i < msg.f3().size(); ++i) {
1299 EXPECT_EQ(
static_cast<
int>(obj.f3[i].GetUnderlying()), msg.f3()[i]);
1302 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1304 for (
const auto& [key, value] : msg.f4()) {
1305 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1306 CheckSimpleEqual(obj.f4.at(key).GetUnderlying(), value);
1309 if (!obj.test_oneof.ContainsAny()) {
1310 EXPECT_EQ(msg.test_oneof_case(), messages::Strong::TEST_ONEOF_NOT_SET);
1313 if (obj.test_oneof.Contains(0)) {
1314 EXPECT_TRUE(msg.has_f5());
1315 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Seconds().count(), msg.f5().seconds());
1316 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Nanos().count(), msg.f5().nanos());
1319 EXPECT_FALSE(msg.has_f5());