userver: /data/code/userver/libraries/proto-structs/tests/structs.cpp Source File
Loading...
Searching...
No Matches
structs.cpp
1#include "structs.hpp"
2
3#include <gtest/gtest.h>
4
5#include <google/protobuf/util/time_util.h>
6
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>
10
11#include "messages.pb.h"
12
13namespace structs {
14
15namespace {
16
17void CheckJsonValue(const formats::json::Value& json, const ::google::protobuf::Value& msg);
18void CheckJsonValue(const formats::json::Value& json, const ::google::protobuf::ListValue& msg);
19void CheckJsonValue(const formats::json::Value& json, const ::google::protobuf::Struct& msg);
20
21void CheckJsonValue(const formats::json::Value& json, const ::google::protobuf::Value& msg) {
22 if (msg.has_null_value()) {
23 ASSERT_TRUE(json.IsNull());
24 } else if (msg.has_number_value()) {
25 ASSERT_TRUE(json.IsNumber());
26 EXPECT_EQ(json.As<double>(), msg.number_value());
27 } else if (msg.has_string_value()) {
28 ASSERT_TRUE(json.IsString());
29 EXPECT_EQ(json.As<std::string>(), msg.string_value());
30 } else if (msg.has_bool_value()) {
31 ASSERT_TRUE(json.IsBool());
32 EXPECT_EQ(json.As<bool>(), msg.bool_value());
33 } else if (msg.has_list_value()) {
34 CheckJsonValue(json, msg.list_value());
35 } else if (msg.has_struct_value()) {
36 CheckJsonValue(json, msg.struct_value());
37 } else {
38 ADD_FAILURE() << "incomparable 'google::protobuf::Value'";
39 }
40}
41
42void CheckJsonValue(const formats::json::Value& json, const ::google::protobuf::ListValue& msg) {
43 ASSERT_TRUE(json.IsArray());
44 ASSERT_EQ(static_cast<int>(json.GetSize()), msg.values().size());
45
46 for (int i = 0; i < msg.values().size(); ++i) {
47 CheckJsonValue(json[i], msg.values()[i]);
48 }
49}
50
51void CheckJsonValue(const formats::json::Value& json, const ::google::protobuf::Struct& msg) {
52 ASSERT_TRUE(json.IsObject());
53 EXPECT_EQ(json.GetSize(), msg.fields().size());
54
55 for (const auto& [key, val] : msg.fields()) {
56 ASSERT_TRUE(json.HasMember(key));
57 CheckJsonValue(json[key], val);
58 }
59}
60
61} // namespace
62
63ConversionFailure ReadProtoStruct(
64 ups::io::ReadContext& ctx,
65 ups::io::To<ConversionFailure>,
66 const messages::ConversionFailure& msg
67) {
68 if (msg.error_type() == messages::ConversionFailure::TYPE_EXCEPTION) {
69 throw std::runtime_error("conversion_failure_exception");
70 } else if (msg.error_type() == messages::ConversionFailure::TYPE_ERROR) {
71 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber, "conversion_failure_error");
72 } else {
73 ctx.AddError(1001, "conversion_failure_error_with_unknown_field");
74 }
75
76 return {};
77}
78
79void WriteProtoStruct(ups::io::WriteContext& ctx, const ConversionFailure& obj, messages::ConversionFailure&) {
80 if (obj.error_type == ConversionFailureType::kException) {
81 throw std::runtime_error("conversion_failure_exception");
82 } else if (obj.error_type == ConversionFailureType::kError) {
83 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber, "conversion_failure_error");
84 } else {
85 ctx.AddError(1001, "conversion_failure_error_with_unknown_field");
86 }
87}
88
89Scalar ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Scalar>, const messages::Scalar& msg) {
90 return {
91 .f1 = ups::io::impl::ReadField<
92 bool>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::f1)),
93 .f2 = ups::io::impl::ReadField<int32_t>(
94 ctx,
95 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::f2)
96 ),
97 .f3 = ups::io::impl::ReadField<uint32_t>(
98 ctx,
99 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::f3)
100 ),
101 .f4 = ups::io::impl::ReadField<int64_t>(
102 ctx,
103 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::f4)
104 ),
105 .f5 = ups::io::impl::ReadField<uint64_t>(
106 ctx,
107 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::f5)
108 ),
109 .f6 = ups::io::impl::ReadField<
110 float>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::f6)),
111 .f7 = ups::io::impl::ReadField<double>(
112 ctx,
113 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::f7)
114 ),
115 .f8 = ups::io::impl::ReadField<std::string>(
116 ctx,
117 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF8FieldNumber, &messages::Scalar::f8)
118 ),
119 .f9 = ups::io::impl::ReadField<std::string>(
120 ctx,
121 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF9FieldNumber, &messages::Scalar::f9)
122 ),
123 .f10 = ups::io::impl::ReadField<TestEnum>(
124 ctx,
125 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::f10)
126 ),
127 .f11 = ups::io::impl::ReadField<std::size_t>(
128 ctx,
129 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::f11)
130 )
131 };
132}
133
134template <typename T>
135void WriteScalarStruct(ups::io::WriteContext& ctx, T&& obj, messages::Scalar& msg) {
136 ups::io::impl::WriteField(
137 ctx,
138 std::forward<T>(obj).f1,
139 ups::io::impl::CreateFieldSetter(
140 msg,
141 messages::Scalar::kF1FieldNumber,
142 &messages::Scalar::set_f1,
143 &messages::Scalar::clear_f1
144 )
145 );
146 ups::io::impl::WriteField(
147 ctx,
148 std::forward<T>(obj).f2,
149 ups::io::impl::CreateFieldSetter(
150 msg,
151 messages::Scalar::kF2FieldNumber,
152 &messages::Scalar::set_f2,
153 &messages::Scalar::clear_f2
154 )
155 );
156 ups::io::impl::WriteField(
157 ctx,
158 std::forward<T>(obj).f3,
159 ups::io::impl::CreateFieldSetter(
160 msg,
161 messages::Scalar::kF3FieldNumber,
162 &messages::Scalar::set_f3,
163 &messages::Scalar::clear_f3
164 )
165 );
166 ups::io::impl::WriteField(
167 ctx,
168 std::forward<T>(obj).f4,
169 ups::io::impl::CreateFieldSetter(
170 msg,
171 messages::Scalar::kF4FieldNumber,
172 &messages::Scalar::set_f4,
173 &messages::Scalar::clear_f4
174 )
175 );
176 ups::io::impl::WriteField(
177 ctx,
178 std::forward<T>(obj).f5,
179 ups::io::impl::CreateFieldSetter(
180 msg,
181 messages::Scalar::kF5FieldNumber,
182 &messages::Scalar::set_f5,
183 &messages::Scalar::clear_f5
184 )
185 );
186 ups::io::impl::WriteField(
187 ctx,
188 std::forward<T>(obj).f6,
189 ups::io::impl::CreateFieldSetter(
190 msg,
191 messages::Scalar::kF6FieldNumber,
192 &messages::Scalar::set_f6,
193 &messages::Scalar::clear_f6
194 )
195 );
196 ups::io::impl::WriteField(
197 ctx,
198 std::forward<T>(obj).f7,
199 ups::io::impl::CreateFieldSetter(
200 msg,
201 messages::Scalar::kF7FieldNumber,
202 &messages::Scalar::set_f7,
203 &messages::Scalar::clear_f7
204 )
205 );
206 ups::io::impl::WriteField(
207 ctx,
208 std::forward<T>(obj).f8,
209 ups::io::impl::CreateFieldSetter(
210 msg,
211 messages::Scalar::kF8FieldNumber,
212 &messages::Scalar::set_f8<const std::string&>,
213 &messages::Scalar::set_f8<std::string>,
214 &messages::Scalar::clear_f8
215 )
216 );
217 ups::io::impl::WriteField(
218 ctx,
219 std::forward<T>(obj).f9,
220 ups::io::impl::CreateFieldSetter(
221 msg,
222 messages::Scalar::kF9FieldNumber,
223 &messages::Scalar::set_f9<const std::string&>,
224 &messages::Scalar::set_f9<std::string>,
225 &messages::Scalar::clear_f9
226 )
227 );
228 ups::io::impl::WriteField(
229 ctx,
230 std::forward<T>(obj).f10,
231 ups::io::impl::CreateFieldSetter(
232 msg,
233 messages::Scalar::kF10FieldNumber,
234 &messages::Scalar::set_f10,
235 &messages::Scalar::clear_f10
236 )
237 );
238 ups::io::impl::WriteField(
239 ctx,
240 std::forward<T>(obj).f11,
241 ups::io::impl::CreateFieldSetter(
242 msg,
243 messages::Scalar::kF11FieldNumber,
244 &messages::Scalar::set_f11,
245 &messages::Scalar::clear_f11
246 )
247 );
248}
249
250void WriteProtoStruct(ups::io::WriteContext& ctx, const Scalar& obj, messages::Scalar& msg) {
251 WriteScalarStruct(ctx, obj, msg);
252}
253
254void WriteProtoStruct(ups::io::WriteContext& ctx, Scalar&& obj, messages::Scalar& msg) {
255 WriteScalarStruct(ctx, std::move(obj), msg);
256}
257
258WellKnownStd ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownStd>, const messages::WellKnownStd& msg) {
259 return {
260 .f1 = ups::io::impl::ReadField<std::chrono::time_point<std::chrono::system_clock>>(
261 ctx,
262 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF1FieldNumber, &messages::WellKnownStd::f1)
263 ),
264 .f2 = ups::io::impl::ReadField<std::chrono::milliseconds>(
265 ctx,
266 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF2FieldNumber, &messages::WellKnownStd::f2)
267 ),
268 .f3 = ups::io::impl::ReadField<std::chrono::year_month_day>(
269 ctx,
270 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF3FieldNumber, &messages::WellKnownStd::f3)
271 ),
272 .f4 = ups::io::impl::ReadField<std::chrono::hh_mm_ss<std::chrono::microseconds>>(
273 ctx,
274 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF4FieldNumber, &messages::WellKnownStd::f4)
275 )
276 };
277}
278
279template <typename T>
280void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownStd& msg) {
281 ups::io::impl::WriteField(
282 ctx,
283 std::forward<T>(obj).f1,
284 ups::io::impl::CreateFieldSetter(
285 msg,
286 messages::WellKnownStd::kF1FieldNumber,
287 &messages::WellKnownStd::mutable_f1,
288 &messages::WellKnownStd::clear_f1
289 )
290 );
291 ups::io::impl::WriteField(
292 ctx,
293 std::forward<T>(obj).f2,
294 ups::io::impl::CreateFieldSetter(
295 msg,
296 messages::WellKnownStd::kF2FieldNumber,
297 &messages::WellKnownStd::mutable_f2,
298 &messages::WellKnownStd::clear_f2
299 )
300 );
301 ups::io::impl::WriteField(
302 ctx,
303 std::forward<T>(obj).f3,
304 ups::io::impl::CreateFieldSetter(
305 msg,
306 messages::WellKnownStd::kF3FieldNumber,
307 &messages::WellKnownStd::mutable_f3,
308 &messages::WellKnownStd::clear_f3
309 )
310 );
311 ups::io::impl::WriteField(
312 ctx,
313 std::forward<T>(obj).f4,
314 ups::io::impl::CreateFieldSetter(
315 msg,
316 messages::WellKnownStd::kF4FieldNumber,
317 &messages::WellKnownStd::mutable_f4,
318 &messages::WellKnownStd::clear_f4
319 )
320 );
321}
322
323void WriteProtoStruct(ups::io::WriteContext& ctx, const WellKnownStd& obj, messages::WellKnownStd& msg) {
324 WriteWellKnownStruct(ctx, obj, msg);
325}
326
327void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownStd&& obj, messages::WellKnownStd& msg) {
328 WriteWellKnownStruct(ctx, std::move(obj), msg);
329}
330
331WellKnownUsrv ReadProtoStruct(
332 ups::io::ReadContext& ctx,
333 ups::io::To<WellKnownUsrv>,
334 const messages::WellKnownUsrv& msg
335) {
336 return {
337 .f1 = ups::io::impl::ReadField<ups::Any>(
338 ctx,
339 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF1FieldNumber, &messages::WellKnownUsrv::f1)
340 ),
341 .f2 = ups::io::impl::ReadField<ups::Timestamp>(
342 ctx,
343 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF2FieldNumber, &messages::WellKnownUsrv::f2)
344 ),
345 .f3 = ups::io::impl::ReadField<ups::Duration>(
346 ctx,
347 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF3FieldNumber, &messages::WellKnownUsrv::f3)
348 ),
349 .f4 = ups::io::impl::ReadField<ups::Date>(
350 ctx,
351 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF4FieldNumber, &messages::WellKnownUsrv::f4)
352 ),
353 .f5 = ups::io::impl::ReadField<ups::TimeOfDay>(
354 ctx,
355 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF5FieldNumber, &messages::WellKnownUsrv::f5)
356 ),
357 .f6 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::datetime::TimeOfDay<std::chrono::microseconds>>(
358 ctx,
359 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF6FieldNumber, &messages::WellKnownUsrv::f6)
360 ),
361 .f7 = ups::io::impl::ReadField<USERVER_NAMESPACE::decimal64::Decimal<3>>(
362 ctx,
363 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF7FieldNumber, &messages::WellKnownUsrv::f7)
364 )
365 };
366}
367
368template <typename T>
369void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownUsrv& msg) {
370 ups::io::impl::WriteField(
371 ctx,
372 std::forward<T>(obj).f1,
373 ups::io::impl::CreateFieldSetter(
374 msg,
375 messages::WellKnownUsrv::kF1FieldNumber,
376 &messages::WellKnownUsrv::mutable_f1,
377 &messages::WellKnownUsrv::clear_f1
378 )
379 );
380 ups::io::impl::WriteField(
381 ctx,
382 std::forward<T>(obj).f2,
383 ups::io::impl::CreateFieldSetter(
384 msg,
385 messages::WellKnownUsrv::kF2FieldNumber,
386 &messages::WellKnownUsrv::mutable_f2,
387 &messages::WellKnownUsrv::clear_f2
388 )
389 );
390 ups::io::impl::WriteField(
391 ctx,
392 std::forward<T>(obj).f3,
393 ups::io::impl::CreateFieldSetter(
394 msg,
395 messages::WellKnownUsrv::kF3FieldNumber,
396 &messages::WellKnownUsrv::mutable_f3,
397 &messages::WellKnownUsrv::clear_f3
398 )
399 );
400 ups::io::impl::WriteField(
401 ctx,
402 std::forward<T>(obj).f4,
403 ups::io::impl::CreateFieldSetter(
404 msg,
405 messages::WellKnownUsrv::kF4FieldNumber,
406 &messages::WellKnownUsrv::mutable_f4,
407 &messages::WellKnownUsrv::clear_f4
408 )
409 );
410 ups::io::impl::WriteField(
411 ctx,
412 std::forward<T>(obj).f5,
413 ups::io::impl::CreateFieldSetter(
414 msg,
415 messages::WellKnownUsrv::kF5FieldNumber,
416 &messages::WellKnownUsrv::mutable_f5,
417 &messages::WellKnownUsrv::clear_f5
418 )
419 );
420 ups::io::impl::WriteField(
421 ctx,
422 std::forward<T>(obj).f6,
423 ups::io::impl::CreateFieldSetter(
424 msg,
425 messages::WellKnownUsrv::kF6FieldNumber,
426 &messages::WellKnownUsrv::mutable_f6,
427 &messages::WellKnownUsrv::clear_f6
428 )
429 );
430 ups::io::impl::WriteField(
431 ctx,
432 std::forward<T>(obj).f7,
433 ups::io::impl::CreateFieldSetter(
434 msg,
435 messages::WellKnownUsrv::kF7FieldNumber,
436 &messages::WellKnownUsrv::mutable_f7,
437 &messages::WellKnownUsrv::clear_f7
438 )
439 );
440}
441
442void WriteProtoStruct(ups::io::WriteContext& ctx, const WellKnownUsrv& obj, messages::WellKnownUsrv& msg) {
443 WriteWellKnownStruct(ctx, obj, msg);
444}
445
446void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownUsrv&& obj, messages::WellKnownUsrv& msg) {
447 WriteWellKnownStruct(ctx, std::move(obj), msg);
448}
449
450WellKnownJson ReadProtoStruct(
451 ups::io::ReadContext& ctx,
452 ups::io::To<WellKnownJson>,
453 const messages::WellKnownJson& msg
454) {
455 return {
456 .f1 = ups::io::impl::ReadField<formats::json::Value>(
457 ctx,
458 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownJson::kF1FieldNumber, &messages::WellKnownJson::f1)
459 ),
460 .f2 = ups::io::impl::ReadField<formats::json::Array>(
461 ctx,
462 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownJson::kF2FieldNumber, &messages::WellKnownJson::f2)
463 ),
464 .f3 = ups::io::impl::ReadField<formats::json::Object>(
465 ctx,
466 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownJson::kF3FieldNumber, &messages::WellKnownJson::f3)
467 )
468 };
469}
470
471template <typename T>
472void WriteWellKnownJsonStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownJson& msg) {
473 ups::io::impl::WriteField(
474 ctx,
475 std::forward<T>(obj).f1,
476 ups::io::impl::CreateFieldSetter(
477 msg,
478 messages::WellKnownJson::kF1FieldNumber,
479 &messages::WellKnownJson::mutable_f1,
480 &messages::WellKnownJson::clear_f1
481 )
482 );
483 ups::io::impl::WriteField(
484 ctx,
485 std::forward<T>(obj).f2,
486 ups::io::impl::CreateFieldSetter(
487 msg,
488 messages::WellKnownJson::kF2FieldNumber,
489 &messages::WellKnownJson::mutable_f2,
490 &messages::WellKnownJson::clear_f2
491 )
492 );
493 ups::io::impl::WriteField(
494 ctx,
495 std::forward<T>(obj).f3,
496 ups::io::impl::CreateFieldSetter(
497 msg,
498 messages::WellKnownJson::kF3FieldNumber,
499 &messages::WellKnownJson::mutable_f3,
500 &messages::WellKnownJson::clear_f3
501 )
502 );
503}
504
505void WriteProtoStruct(ups::io::WriteContext& ctx, const WellKnownJson& obj, messages::WellKnownJson& msg) {
506 WriteWellKnownJsonStruct(ctx, obj, msg);
507}
508
509void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownJson&& obj, messages::WellKnownJson& msg) {
510 WriteWellKnownJsonStruct(ctx, std::move(obj), msg);
511}
512
513Optional ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Optional>, const messages::Optional& msg) {
514 return {
515 .f1 = ups::io::impl::ReadField<std::optional<int32_t>>(
516 ctx,
517 ups::io::impl::CreateFieldGetter(
518 msg,
519 messages::Optional::kF1FieldNumber,
520 &messages::Optional::f1,
521 &messages::Optional::has_f1
522 )
523 ),
524 .f2 = ups::io::impl::ReadField<std::optional<std::string>>(
525 ctx,
526 ups::io::impl::CreateFieldGetter(
527 msg,
528 messages::Optional::kF2FieldNumber,
529 &messages::Optional::f2,
530 &messages::Optional::has_f2
531 )
532 ),
533 .f3 = ups::io::impl::ReadField<std::optional<TestEnum>>(
534 ctx,
535 ups::io::impl::CreateFieldGetter(
536 msg,
537 messages::Optional::kF3FieldNumber,
538 &messages::Optional::f3,
539 &messages::Optional::has_f3
540 )
541 ),
542 .f4 = ups::io::impl::ReadField<std::optional<Simple>>(
543 ctx,
544 ups::io::impl::CreateFieldGetter(
545 msg,
546 messages::Optional::kF4FieldNumber,
547 &messages::Optional::f4,
548 &messages::Optional::has_f4
549 )
550 )
551 };
552}
553
554template <typename T>
555void WriteOptionalStruct(ups::io::WriteContext& ctx, T&& obj, messages::Optional& msg) {
556 ups::io::impl::WriteField(
557 ctx,
558 std::forward<T>(obj).f1,
559 ups::io::impl::CreateFieldSetter(
560 msg,
561 messages::Optional::kF1FieldNumber,
562 &messages::Optional::set_f1,
563 &messages::Optional::clear_f1
564 )
565 );
566 ups::io::impl::WriteField(
567 ctx,
568 std::forward<T>(obj).f2,
569 ups::io::impl::CreateFieldSetter(
570 msg,
571 messages::Optional::kF2FieldNumber,
572 &messages::Optional::set_f2<const std::string&>,
573 &messages::Optional::set_f2<std::string>,
574 &messages::Optional::clear_f2
575 )
576 );
577 ups::io::impl::WriteField(
578 ctx,
579 std::forward<T>(obj).f3,
580 ups::io::impl::CreateFieldSetter(
581 msg,
582 messages::Optional::kF3FieldNumber,
583 &messages::Optional::set_f3,
584 &messages::Optional::clear_f3
585 )
586 );
587 ups::io::impl::WriteField(
588 ctx,
589 std::forward<T>(obj).f4,
590 ups::io::impl::CreateFieldSetter(
591 msg,
592 messages::Optional::kF4FieldNumber,
593 &messages::Optional::mutable_f4,
594 &messages::Optional::clear_f4
595 )
596 );
597}
598
599void WriteProtoStruct(ups::io::WriteContext& ctx, const Optional& obj, messages::Optional& msg) {
600 WriteOptionalStruct(ctx, obj, msg);
601}
602void WriteProtoStruct(ups::io::WriteContext& ctx, Optional&& obj, messages::Optional& msg) {
603 WriteOptionalStruct(ctx, std::move(obj), msg);
604}
605
606Repeated ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Repeated>, const messages::Repeated& msg) {
607 return {
608 .f1 = ups::io::impl::ReadField<std::vector<int32_t>>(
609 ctx,
610 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::f1)
611 ),
612 .f2 = ups::io::impl::ReadField<std::vector<std::string>>(
613 ctx,
614 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::f2)
615 ),
616 .f3 = ups::io::impl::ReadField<std::vector<TestEnum>>(
617 ctx,
618 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::f3)
619 ),
620 .f4 = ups::io::impl::ReadField<std::vector<Simple>>(
621 ctx,
622 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::f4)
623 )
624 };
625}
626
627template <typename T>
628void WriteRepeatedStruct(ups::io::WriteContext& ctx, T&& obj, messages::Repeated& msg) {
629 ups::io::impl::WriteField(
630 ctx,
631 std::forward<T>(obj).f1,
632 ups::io::impl::CreateFieldSetter(
633 msg,
634 messages::Repeated::kF1FieldNumber,
635 &messages::Repeated::mutable_f1,
636 &messages::Repeated::clear_f1
637 )
638 );
639 ups::io::impl::WriteField(
640 ctx,
641 std::forward<T>(obj).f2,
642 ups::io::impl::CreateFieldSetter(
643 msg,
644 messages::Repeated::kF2FieldNumber,
645 &messages::Repeated::mutable_f2,
646 &messages::Repeated::clear_f2
647 )
648 );
649 ups::io::impl::WriteField(
650 ctx,
651 std::forward<T>(obj).f3,
652 ups::io::impl::CreateFieldSetter(
653 msg,
654 messages::Repeated::kF3FieldNumber,
655 &messages::Repeated::mutable_f3,
656 &messages::Repeated::clear_f3
657 )
658 );
659 ups::io::impl::WriteField(
660 ctx,
661 std::forward<T>(obj).f4,
662 ups::io::impl::CreateFieldSetter(
663 msg,
664 messages::Repeated::kF4FieldNumber,
665 &messages::Repeated::mutable_f4,
666 &messages::Repeated::clear_f4
667 )
668 );
669}
670
671void WriteProtoStruct(ups::io::WriteContext& ctx, const Repeated& obj, messages::Repeated& msg) {
672 WriteRepeatedStruct(ctx, obj, msg);
673}
674
675void WriteProtoStruct(ups::io::WriteContext& ctx, Repeated&& obj, messages::Repeated& msg) {
676 WriteRepeatedStruct(ctx, std::move(obj), msg);
677}
678
679Map ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Map>, const messages::Map& msg) {
680 return {
681 .f1 = ups::io::impl::ReadField<std::map<
682 int32_t,
683 int32_t>>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF1FieldNumber, &messages::Map::f1)),
684 .f2 = ups::io::impl::ReadField<std::unordered_map<std::string, std::string>>(
685 ctx,
686 ups::io::impl::CreateFieldGetter(msg, messages::Map::kF2FieldNumber, &messages::Map::f2)
687 ),
688 .f3 = ups::io::impl::ReadField<std::map<
689 bool,
690 TestEnum>>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF3FieldNumber, &messages::Map::f3)),
691 .f4 = ups::io::impl::ReadField<std::unordered_map<std::string, Simple, USERVER_NAMESPACE::utils::StrCaseHash>>(
692 ctx,
693 ups::io::impl::CreateFieldGetter(msg, messages::Map::kF4FieldNumber, &messages::Map::f4)
694 )
695 };
696}
697
698template <typename T>
699void WriteMapStruct(ups::io::WriteContext& ctx, T&& obj, messages::Map& msg) {
700 ups::io::impl::WriteField(
701 ctx,
702 std::forward<T>(obj).f1,
703 ups::io::impl::CreateFieldSetter(
704 msg,
705 messages::Map::kF1FieldNumber,
706 &messages::Map::mutable_f1,
707 &messages::Map::clear_f1
708 )
709 );
710 ups::io::impl::WriteField(
711 ctx,
712 std::forward<T>(obj).f2,
713 ups::io::impl::CreateFieldSetter(
714 msg,
715 messages::Map::kF2FieldNumber,
716 &messages::Map::mutable_f2,
717 &messages::Map::clear_f2
718 )
719 );
720 ups::io::impl::WriteField(
721 ctx,
722 std::forward<T>(obj).f3,
723 ups::io::impl::CreateFieldSetter(
724 msg,
725 messages::Map::kF3FieldNumber,
726 &messages::Map::mutable_f3,
727 &messages::Map::clear_f3
728 )
729 );
730 ups::io::impl::WriteField(
731 ctx,
732 std::forward<T>(obj).f4,
733 ups::io::impl::CreateFieldSetter(
734 msg,
735 messages::Map::kF4FieldNumber,
736 &messages::Map::mutable_f4,
737 &messages::Map::clear_f4
738 )
739 );
740}
741
742void WriteProtoStruct(ups::io::WriteContext& ctx, const Map& obj, messages::Map& msg) { WriteMapStruct(ctx, obj, msg); }
743
744void WriteProtoStruct(ups::io::WriteContext& ctx, Map&& obj, messages::Map& msg) {
745 WriteMapStruct(ctx, std::move(obj), msg);
746}
747
748Oneof ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Oneof>, const messages::Oneof& msg) {
749 return {
750 .test_oneof = ups::io::impl::ReadField<Oneof::Type>(
751 ctx,
752 ups::io::impl::CreateFieldGetter(
753 msg,
754 messages::Oneof::kF1FieldNumber,
755 &messages::Oneof::f1,
756 &messages::Oneof::has_f1
757 ),
758 ups::io::impl::CreateFieldGetter(
759 msg,
760 messages::Oneof::kF2FieldNumber,
761 &messages::Oneof::f2,
762 &messages::Oneof::has_f2
763 ),
764 ups::io::impl::CreateFieldGetter(
765 msg,
766 messages::Oneof::kF3FieldNumber,
767 &messages::Oneof::f3,
768 &messages::Oneof::has_f3
769 ),
770 ups::io::impl::CreateFieldGetter(
771 msg,
772 messages::Oneof::kF4FieldNumber,
773 &messages::Oneof::f4,
774 &messages::Oneof::has_f4
775 )
776 )
777 };
778}
779
780template <typename T>
781void WriteOneofStruct(ups::io::WriteContext& ctx, T&& obj, messages::Oneof& msg) {
782 ups::io::impl::WriteField(
783 ctx,
784 std::forward<T>(obj).test_oneof,
785 ups::io::impl::CreateFieldSetter(
786 msg,
787 messages::Oneof::kF1FieldNumber,
788 &messages::Oneof::set_f1,
789 &messages::Oneof::clear_f1
790 ),
791 ups::io::impl::CreateFieldSetter(
792 msg,
793 messages::Oneof::kF2FieldNumber,
794 &messages::Oneof::set_f2<const std::string&>,
795 &messages::Oneof::set_f2<std::string>,
796 &messages::Oneof::clear_f2
797 ),
798 ups::io::impl::CreateFieldSetter(
799 msg,
800 messages::Oneof::kF3FieldNumber,
801 &messages::Oneof::set_f3,
802 &messages::Oneof::clear_f3
803 ),
804 ups::io::impl::CreateFieldSetter(
805 msg,
806 messages::Oneof::kF4FieldNumber,
807 &messages::Oneof::mutable_f4,
808 &messages::Oneof::clear_f4
809 )
810 );
811}
812
813void WriteProtoStruct(ups::io::WriteContext& ctx, const Oneof& obj, messages::Oneof& msg) {
814 WriteOneofStruct(ctx, obj, msg);
815}
816
817void WriteProtoStruct(ups::io::WriteContext& ctx, Oneof&& obj, messages::Oneof& msg) {
818 WriteOneofStruct(ctx, std::move(obj), msg);
819}
820
821Indirect ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Indirect>, const messages::Indirect& msg) {
822 return {
823 .f1 = ups::io::impl::ReadField<Indirect::Box<Simple>>(
824 ctx,
825 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::f1)
826 ),
827 .f2 = ups::io::impl::ReadField<std::optional<Indirect::Box<ups::Duration>>>(
828 ctx,
829 ups::io::impl::CreateFieldGetter(
830 msg,
831 messages::Indirect::kF2FieldNumber,
832 &messages::Indirect::f2,
833 &messages::Indirect::has_f2
834 )
835 ),
836 .f3 = ups::io::impl::ReadField<std::vector<Indirect::Box<Simple>>>(
837 ctx,
838 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::f3)
839 ),
840 .f4 = ups::io::impl::ReadField<std::map<int32_t, Indirect::Box<Simple>>>(
841 ctx,
842 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::f4)
843 ),
844 .test_oneof = ups::io::impl::ReadField<Indirect::OneofType>(
845 ctx,
846 ups::io::impl::CreateFieldGetter(
847 msg,
848 messages::Indirect::kF5FieldNumber,
849 &messages::Indirect::f5,
850 &messages::Indirect::has_f5
851 ),
852 ups::io::impl::CreateFieldGetter(
853 msg,
854 messages::Indirect::kF6FieldNumber,
855 &messages::Indirect::f6,
856 &messages::Indirect::has_f6
857 )
858 ),
859 .f7 = ups::io::impl::ReadField<Indirect::Box<int32_t>>(
860 ctx,
861 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::f7)
862 ),
863 .f8 = ups::io::impl::ReadField<Indirect::Box<std::vector<Indirect::Box<TestEnum>>>>(
864 ctx,
865 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::f8)
866 ),
867 .f9 = ups::io::impl::ReadField<Indirect::Box<std::map<std::string, Indirect::Box<Simple>>>>(
868 ctx,
869 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::f9)
870 )
871 };
872}
873
874template <typename T>
875void WriteIndirectStruct(ups::io::WriteContext& ctx, T&& obj, messages::Indirect& msg) {
876 ups::io::impl::WriteField(
877 ctx,
878 std::forward<T>(obj).f1,
879 ups::io::impl::CreateFieldSetter(
880 msg,
881 messages::Indirect::kF1FieldNumber,
882 &messages::Indirect::mutable_f1,
883 &messages::Indirect::clear_f1
884 )
885 );
886 ups::io::impl::WriteField(
887 ctx,
888 std::forward<T>(obj).f2,
889 ups::io::impl::CreateFieldSetter(
890 msg,
891 messages::Indirect::kF2FieldNumber,
892 &messages::Indirect::mutable_f2,
893 &messages::Indirect::clear_f2
894 )
895 );
896 ups::io::impl::WriteField(
897 ctx,
898 std::forward<T>(obj).f3,
899 ups::io::impl::CreateFieldSetter(
900 msg,
901 messages::Indirect::kF3FieldNumber,
902 &messages::Indirect::mutable_f3,
903 &messages::Indirect::clear_f3
904 )
905 );
906 ups::io::impl::WriteField(
907 ctx,
908 std::forward<T>(obj).f4,
909 ups::io::impl::CreateFieldSetter(
910 msg,
911 messages::Indirect::kF4FieldNumber,
912 &messages::Indirect::mutable_f4,
913 &messages::Indirect::clear_f4
914 )
915 );
916 ups::io::impl::WriteField(
917 ctx,
918 std::forward<T>(obj).test_oneof,
919 ups::io::impl::CreateFieldSetter(
920 msg,
921 messages::Indirect::kF5FieldNumber,
922 &messages::Indirect::mutable_f5,
923 &messages::Indirect::clear_f5
924 ),
925 ups::io::impl::CreateFieldSetter(
926 msg,
927 messages::Indirect::kF6FieldNumber,
928 &messages::Indirect::set_f6<const std::string&>,
929 &messages::Indirect::set_f6<std::string>,
930 &messages::Indirect::clear_f6
931 )
932 );
933 ups::io::impl::WriteField(
934 ctx,
935 std::forward<T>(obj).f7,
936 ups::io::impl::CreateFieldSetter(
937 msg,
938 messages::Indirect::kF7FieldNumber,
939 &messages::Indirect::set_f7,
940 &messages::Indirect::clear_f7
941 )
942 );
943 ups::io::impl::WriteField(
944 ctx,
945 std::forward<T>(obj).f8,
946 ups::io::impl::CreateFieldSetter(
947 msg,
948 messages::Indirect::kF8FieldNumber,
949 &messages::Indirect::mutable_f8,
950 &messages::Indirect::clear_f8
951 )
952 );
953 ups::io::impl::WriteField(
954 ctx,
955 std::forward<T>(obj).f9,
956 ups::io::impl::CreateFieldSetter(
957 msg,
958 messages::Indirect::kF9FieldNumber,
959 &messages::Indirect::mutable_f9,
960 &messages::Indirect::clear_f9
961 )
962 );
963}
964
965void WriteProtoStruct(ups::io::WriteContext& ctx, const Indirect& obj, messages::Indirect& msg) {
966 WriteIndirectStruct(ctx, obj, msg);
967}
968
969void WriteProtoStruct(ups::io::WriteContext& ctx, Indirect&& obj, messages::Indirect& msg) {
970 WriteIndirectStruct(ctx, std::move(obj), msg);
971}
972
973Strong ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Strong>, const messages::Strong& msg) {
974 return {
975 .f1 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, int32_t>>(
976 ctx,
977 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF1FieldNumber, &messages::Strong::f1)
978 ),
979 .f2 = ups::io::impl::ReadField<
980 std::optional<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, std::string>>>(
981 ctx,
982 ups::io::impl::CreateFieldGetter(
983 msg,
984 messages::Strong::kF2FieldNumber,
985 &messages::Strong::f2,
986 &messages::Strong::has_f2
987 )
988 ),
989 .f3 = ups::io::impl::ReadField<std::vector<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, TestEnum>>>(
990 ctx,
991 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF3FieldNumber, &messages::Strong::f3)
992 ),
993 .f4 = ups::io::impl::ReadField<std::map<int32_t, USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, Simple>>>(
994 ctx,
995 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF4FieldNumber, &messages::Strong::f4)
996 ),
997 .test_oneof = ups::io::impl::ReadField<Strong::OneofType>(
998 ctx,
999 ups::io::impl::CreateFieldGetter(
1000 msg,
1001 messages::Strong::kF5FieldNumber,
1002 &messages::Strong::f5,
1003 &messages::Strong::has_f5
1004 )
1005 )
1006 };
1007}
1008
1009template <typename T>
1010void WriteStrongStruct(ups::io::WriteContext& ctx, T&& obj, messages::Strong& msg) {
1011 ups::io::impl::WriteField(
1012 ctx,
1013 std::forward<T>(obj).f1,
1014 ups::io::impl::CreateFieldSetter(
1015 msg,
1016 messages::Strong::kF1FieldNumber,
1017 &messages::Strong::set_f1,
1018 &messages::Strong::clear_f1
1019 )
1020 );
1021 ups::io::impl::WriteField(
1022 ctx,
1023 std::forward<T>(obj).f2,
1024 ups::io::impl::CreateFieldSetter(
1025 msg,
1026 messages::Strong::kF2FieldNumber,
1027 &messages::Strong::set_f2<const std::string&>,
1028 &messages::Strong::set_f2<std::string>,
1029 &messages::Strong::clear_f2
1030 )
1031 );
1032 ups::io::impl::WriteField(
1033 ctx,
1034 std::forward<T>(obj).f3,
1035 ups::io::impl::CreateFieldSetter(
1036 msg,
1037 messages::Strong::kF3FieldNumber,
1038 &messages::Strong::mutable_f3,
1039 &messages::Strong::clear_f3
1040 )
1041 );
1042 ups::io::impl::WriteField(
1043 ctx,
1044 std::forward<T>(obj).f4,
1045 ups::io::impl::CreateFieldSetter(
1046 msg,
1047 messages::Strong::kF4FieldNumber,
1048 &messages::Strong::mutable_f4,
1049 &messages::Strong::clear_f4
1050 )
1051 );
1052 ups::io::impl::WriteField(
1053 ctx,
1054 std::forward<T>(obj).test_oneof,
1055 ups::io::impl::CreateFieldSetter(
1056 msg,
1057 messages::Strong::kF1FieldNumber,
1058 &messages::Strong::mutable_f5,
1059 &messages::Strong::clear_f5
1060 )
1061 );
1062}
1063
1064void WriteProtoStruct(ups::io::WriteContext& ctx, const Strong& obj, messages::Strong& msg) {
1065 WriteStrongStruct(ctx, obj, msg);
1066}
1067
1068void WriteProtoStruct(ups::io::WriteContext& ctx, Strong&& obj, messages::Strong& msg) {
1069 WriteStrongStruct(ctx, std::move(obj), msg);
1070}
1071
1072Erroneous ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Erroneous>, const messages::Erroneous& msg) {
1073 return {
1074 .f1 = ups::io::impl::ReadField<std::optional<ConversionFailure>>(
1075 ctx,
1076 ups::io::impl::CreateFieldGetter(
1077 msg,
1078 messages::Erroneous::kF1FieldNumber,
1079 &messages::Erroneous::f1,
1080 &messages::Erroneous::has_f1
1081 )
1082 ),
1083 .f2 = ups::io::impl::ReadField<std::vector<ConversionFailure>>(
1084 ctx,
1085 ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::f2)
1086 ),
1087 .f3 = ups::io::impl::ReadField<std::unordered_map<int32_t, ConversionFailure>>(
1088 ctx,
1089 ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::f3)
1090 ),
1091 .test_oneof = ups::io::impl::ReadField<Erroneous::OneofType>(
1092 ctx,
1093 ups::io::impl::CreateFieldGetter(
1094 msg,
1095 messages::Erroneous::kF4FieldNumber,
1096 &messages::Erroneous::f4,
1097 &messages::Erroneous::has_f4
1098 )
1099 )
1100 };
1101}
1102
1103void WriteProtoStruct(ups::io::WriteContext& ctx, const Erroneous& obj, messages::Erroneous& msg) {
1104 ups::io::impl::WriteField(
1105 ctx,
1106 obj.f1,
1107 ups::io::impl::CreateFieldSetter(
1108 msg,
1109 messages::Erroneous::kF1FieldNumber,
1110 &messages::Erroneous::mutable_f1,
1111 &messages::Erroneous::clear_f1
1112 )
1113 );
1114 ups::io::impl::WriteField(
1115 ctx,
1116 obj.f2,
1117 ups::io::impl::CreateFieldSetter(
1118 msg,
1119 messages::Erroneous::kF2FieldNumber,
1120 &messages::Erroneous::mutable_f2,
1121 &messages::Erroneous::clear_f2
1122 )
1123 );
1124 ups::io::impl::WriteField(
1125 ctx,
1126 obj.f3,
1127 ups::io::impl::CreateFieldSetter(
1128 msg,
1129 messages::Erroneous::kF3FieldNumber,
1130 &messages::Erroneous::mutable_f3,
1131 &messages::Erroneous::clear_f3
1132 )
1133 );
1134 ups::io::impl::WriteField(
1135 ctx,
1136 obj.test_oneof,
1137 ups::io::impl::CreateFieldSetter(
1138 msg,
1139 messages::Erroneous::kF4FieldNumber,
1140 &messages::Erroneous::mutable_f4,
1141 &messages::Erroneous::clear_f4
1142 )
1143 );
1144}
1145
1146void CheckScalarEqual(const Scalar& obj, const messages::Scalar& msg) {
1147 EXPECT_EQ(obj.f1, msg.f1());
1148 EXPECT_EQ(obj.f2, msg.f2());
1149 EXPECT_EQ(obj.f3, msg.f3());
1150 EXPECT_EQ(obj.f4, msg.f4());
1151 EXPECT_EQ(obj.f5, msg.f5());
1152 EXPECT_EQ(obj.f6, msg.f6());
1153 EXPECT_EQ(obj.f7, msg.f7());
1154 EXPECT_EQ(obj.f8, msg.f8());
1155 EXPECT_EQ(obj.f9, msg.f9());
1156 EXPECT_EQ(obj.f10, static_cast<TestEnum>(msg.f10()));
1157 EXPECT_EQ(static_cast<int>(obj.f11), msg.f11());
1158}
1159
1160void CheckWellKnownStdEqual(const WellKnownStd& obj, const messages::WellKnownStd& msg) {
1161 using TimeType = std::chrono::time_point<std::chrono::system_clock>;
1162
1163 EXPECT_EQ(
1164 obj.f1.time_since_epoch(),
1165 std::chrono::duration_cast<TimeType::duration>(std::chrono::nanoseconds{
1166 ::google::protobuf::util::TimeUtil::TimestampToNanoseconds(msg.f1())
1167 })
1168 );
1169 EXPECT_EQ(
1170 obj.f2,
1171 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::nanoseconds{
1172 ::google::protobuf::util::TimeUtil::DurationToNanoseconds(msg.f2())
1173 })
1174 );
1175
1176 EXPECT_EQ(static_cast<int>(obj.f3.year()), msg.f3().year());
1177 EXPECT_EQ(static_cast<unsigned>(obj.f3.month()), static_cast<unsigned>(msg.f3().month()));
1178 EXPECT_EQ(static_cast<unsigned>(obj.f3.day()), static_cast<unsigned>(msg.f3().day()));
1179
1180 EXPECT_EQ(obj.f4.hours().count(), msg.f4().hours());
1181 EXPECT_EQ(obj.f4.minutes().count(), msg.f4().minutes());
1182 EXPECT_EQ(obj.f4.seconds().count(), msg.f4().seconds());
1183 EXPECT_EQ(
1184 obj.f4.subseconds().count(),
1185 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f4().nanos())).count()
1186 );
1187}
1188
1189void CheckWellKnownUsrvEqual(const WellKnownUsrv& obj, const messages::WellKnownUsrv& msg) {
1190 EXPECT_EQ(obj.f1.GetProtobufAny().type_url(), msg.f1().type_url());
1191 EXPECT_EQ(obj.f1.GetProtobufAny().value(), msg.f1().value());
1192
1193 EXPECT_EQ(obj.f2.Seconds().count(), msg.f2().seconds());
1194 EXPECT_EQ(obj.f2.Nanos().count(), msg.f2().nanos());
1195
1196 EXPECT_EQ(obj.f3.Seconds().count(), msg.f3().seconds());
1197 EXPECT_EQ(obj.f3.Nanos().count(), msg.f3().nanos());
1198
1199 EXPECT_EQ(obj.f4.YearNum(), msg.f4().year());
1200 EXPECT_EQ(obj.f4.MonthNum(), msg.f4().month());
1201 EXPECT_EQ(obj.f4.DayNum(), msg.f4().day());
1202
1203 EXPECT_EQ(obj.f5.Hours().count(), msg.f5().hours());
1204 EXPECT_EQ(obj.f5.Minutes().count(), msg.f5().minutes());
1205 EXPECT_EQ(obj.f5.Seconds().count(), msg.f5().seconds());
1206 EXPECT_EQ(obj.f5.Nanos().count(), msg.f5().nanos());
1207
1208 EXPECT_EQ(obj.f6.Hours().count(), msg.f6().hours());
1209 EXPECT_EQ(obj.f6.Minutes().count(), msg.f6().minutes());
1210 EXPECT_EQ(obj.f6.Seconds().count(), msg.f6().seconds());
1211 EXPECT_EQ(
1212 obj.f6.Subseconds().count(),
1213 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f6().nanos())).count()
1214 );
1215
1216 EXPECT_EQ(obj.f7, decimal64::Decimal<3>(msg.f7().value()));
1217 EXPECT_EQ(ToString(obj.f7), msg.f7().value());
1218}
1219
1220void CheckWellKnownJsonEqual(const WellKnownJson& obj, const messages::WellKnownJson& msg) {
1221 CheckJsonValue(obj.f1, msg.f1());
1222 CheckJsonValue(obj.f2.GetValue(), msg.f2());
1223 CheckJsonValue(obj.f3.GetValue(), msg.f3());
1224}
1225
1226void CheckOptionalEqual(const Optional& obj, const messages::Optional& msg) {
1227 if (obj.f1) {
1228 EXPECT_TRUE(msg.has_f1());
1229 EXPECT_EQ(obj.f1.value(), msg.f1());
1230 } else {
1231 EXPECT_FALSE(msg.has_f1());
1232 }
1233
1234 if (obj.f2) {
1235 EXPECT_TRUE(msg.has_f2());
1236 EXPECT_EQ(obj.f2.value(), msg.f2());
1237 } else {
1238 EXPECT_FALSE(msg.has_f2());
1239 }
1240
1241 if (obj.f3) {
1242 EXPECT_TRUE(msg.has_f3());
1243 EXPECT_EQ(obj.f3.value(), static_cast<TestEnum>(msg.f3()));
1244 } else {
1245 EXPECT_FALSE(msg.has_f3());
1246 }
1247
1248 if (obj.f4) {
1249 EXPECT_TRUE(msg.has_f4());
1250 CheckSimpleEqual(obj.f4.value(), msg.f4());
1251 } else {
1252 EXPECT_FALSE(msg.has_f4());
1253 }
1254}
1255
1256void CheckRepeatedEqual(const Repeated& obj, const messages::Repeated& msg) {
1257 ASSERT_EQ(obj.f1.size(), static_cast<std::size_t>(msg.f1().size()));
1258
1259 for (int i = 0; i < msg.f1().size(); ++i) {
1260 EXPECT_EQ(obj.f1[i], msg.f1()[i]);
1261 }
1262
1263 ASSERT_EQ(obj.f2.size(), static_cast<std::size_t>(msg.f2().size()));
1264
1265 for (int i = 0; i < msg.f2().size(); ++i) {
1266 EXPECT_EQ(obj.f2[i], msg.f2()[i]);
1267 }
1268
1269 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
1270
1271 for (int i = 0; i < msg.f3().size(); ++i) {
1272 EXPECT_EQ(static_cast<int>(obj.f3[i]), msg.f3()[i]);
1273 }
1274
1275 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
1276
1277 for (int i = 0; i < msg.f4().size(); ++i) {
1278 EXPECT_EQ(obj.f4[i].f1, msg.f4()[i].f1());
1279 }
1280}
1281
1282void CheckMapEqual(const Map& obj, const messages::Map& msg) {
1283 ASSERT_EQ(obj.f1.size(), static_cast<std::size_t>(msg.f1().size()));
1284
1285 for (const auto& [key, value] : msg.f1()) {
1286 ASSERT_EQ(obj.f1.count(key), std::size_t{1});
1287 EXPECT_EQ(obj.f1.at(key), value);
1288 }
1289
1290 ASSERT_EQ(obj.f2.size(), static_cast<std::size_t>(msg.f2().size()));
1291
1292 for (const auto& [key, value] : msg.f2()) {
1293 ASSERT_EQ(obj.f2.count(key), std::size_t{1});
1294 EXPECT_EQ(obj.f2.at(key), value);
1295 }
1296
1297 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
1298
1299 for (const auto& [key, value] : msg.f3()) {
1300 ASSERT_EQ(obj.f3.count(key), std::size_t{1});
1301 EXPECT_EQ(obj.f3.at(key), static_cast<TestEnum>(value));
1302 }
1303
1304 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
1305
1306 for (const auto& [key, value] : msg.f4()) {
1307 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1308 CheckSimpleEqual(obj.f4.at(key), value);
1309 }
1310}
1311
1312void CheckOneofEqual(const Oneof& obj, const messages::Oneof& msg) {
1313 if (!obj.test_oneof.ContainsAny()) {
1314 EXPECT_EQ(msg.test_oneof_case(), messages::Oneof::TEST_ONEOF_NOT_SET);
1315 }
1316
1317 if (obj.test_oneof.Contains(0)) {
1318 EXPECT_TRUE(msg.has_f1());
1319 EXPECT_EQ(obj.test_oneof.Get<0>(), msg.f1());
1320 } else {
1321 EXPECT_FALSE(msg.has_f1());
1322 }
1323
1324 if (obj.test_oneof.Contains(1)) {
1325 EXPECT_TRUE(msg.has_f2());
1326 EXPECT_EQ(obj.test_oneof.Get<1>(), msg.f2());
1327 } else {
1328 EXPECT_FALSE(msg.has_f2());
1329 }
1330
1331 if (obj.test_oneof.Contains(2)) {
1332 EXPECT_TRUE(msg.has_f3());
1333 EXPECT_EQ(obj.test_oneof.Get<2>(), static_cast<TestEnum>(msg.f3()));
1334 } else {
1335 EXPECT_FALSE(msg.has_f3());
1336 }
1337
1338 if (obj.test_oneof.Contains(3)) {
1339 EXPECT_TRUE(msg.has_f4());
1340 CheckSimpleEqual(obj.test_oneof.Get<3>(), msg.f4());
1341 } else {
1342 EXPECT_FALSE(msg.has_f4());
1343 }
1344}
1345
1346void CheckIndirectEqual(const Indirect& obj, const messages::Indirect& msg) {
1347 CheckSimpleEqual(*obj.f1, msg.f1());
1348
1349 if (obj.f2) {
1350 EXPECT_TRUE(msg.has_f2());
1351 EXPECT_EQ((*obj.f2.value()).Seconds().count(), msg.f2().seconds());
1352 EXPECT_EQ((*obj.f2.value()).Nanos().count(), msg.f2().nanos());
1353 } else {
1354 EXPECT_FALSE(msg.has_f2());
1355 }
1356
1357 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
1358
1359 for (int i = 0; i < msg.f3().size(); ++i) {
1360 CheckSimpleEqual(*obj.f3[i], msg.f3()[i]);
1361 }
1362
1363 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
1364
1365 for (const auto& [key, value] : msg.f4()) {
1366 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1367 CheckSimpleEqual(*obj.f4.at(key), value);
1368 }
1369
1370 if (!obj.test_oneof.ContainsAny()) {
1371 EXPECT_EQ(msg.test_oneof_case(), messages::Indirect::TEST_ONEOF_NOT_SET);
1372 }
1373
1374 if (obj.test_oneof.Contains(0)) {
1375 EXPECT_TRUE(msg.has_f5());
1376 CheckSimpleEqual(*obj.test_oneof.Get<0>(), msg.f5());
1377 } else {
1378 EXPECT_FALSE(msg.has_f5());
1379 }
1380
1381 if (obj.test_oneof.Contains(1)) {
1382 EXPECT_TRUE(msg.has_f6());
1383 EXPECT_EQ(*obj.test_oneof.Get<1>(), msg.f6());
1384 } else {
1385 EXPECT_FALSE(msg.has_f6());
1386 }
1387
1388 EXPECT_EQ(*obj.f7, msg.f7());
1389 ASSERT_EQ((*obj.f8).size(), static_cast<std::size_t>(msg.f8().size()));
1390
1391 for (int i = 0; i < msg.f8().size(); ++i) {
1392 EXPECT_EQ(*((*obj.f8)[i]), static_cast<TestEnum>(msg.f8()[i]));
1393 }
1394
1395 ASSERT_EQ((*obj.f9).size(), static_cast<std::size_t>(msg.f9().size()));
1396
1397 for (const auto& [key, value] : msg.f9()) {
1398 ASSERT_EQ((*obj.f9).count(key), std::size_t{1});
1399 CheckSimpleEqual(*((*obj.f9).at(key)), value);
1400 }
1401}
1402
1403void CheckStrongEqual(const Strong& obj, const messages::Strong& msg) {
1404 EXPECT_EQ(obj.f1.GetUnderlying(), msg.f1());
1405
1406 if (obj.f2) {
1407 EXPECT_TRUE(msg.has_f2());
1408 EXPECT_EQ(obj.f2.value().GetUnderlying(), msg.f2());
1409 } else {
1410 EXPECT_FALSE(msg.has_f2());
1411 }
1412
1413 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
1414
1415 for (int i = 0; i < msg.f3().size(); ++i) {
1416 EXPECT_EQ(static_cast<int>(obj.f3[i].GetUnderlying()), msg.f3()[i]);
1417 }
1418
1419 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
1420
1421 for (const auto& [key, value] : msg.f4()) {
1422 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1423 CheckSimpleEqual(obj.f4.at(key).GetUnderlying(), value);
1424 }
1425
1426 if (!obj.test_oneof.ContainsAny()) {
1427 EXPECT_EQ(msg.test_oneof_case(), messages::Strong::TEST_ONEOF_NOT_SET);
1428 }
1429
1430 if (obj.test_oneof.Contains(0)) {
1431 EXPECT_TRUE(msg.has_f5());
1432 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Seconds().count(), msg.f5().seconds());
1433 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Nanos().count(), msg.f5().nanos());
1434
1435 } else {
1436 EXPECT_FALSE(msg.has_f5());
1437 }
1438}
1439
1440} // namespace structs