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