• Home
  • History
  • Annotate
  • Raw
  • Download

Lines Matching refs:s

33 void PacketDef::GenParserDefinition(std::ostream& s) const {  in GenParserDefinition()
34 s << "class " << name_ << "View"; in GenParserDefinition()
36 s << " : public " << parent_->name_ << "View {"; in GenParserDefinition()
38 s << " : public PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian> {"; in GenParserDefinition()
40 s << " public:"; in GenParserDefinition()
44 s << "static " << name_ << "View Create(" << parent_->name_ << "View parent)"; in GenParserDefinition()
45 s << "{ return " << name_ << "View(std::move(parent)); }"; in GenParserDefinition()
47s << "static " << name_ << "View Create(PacketView<" << (is_little_endian_ ? "" : "!") << "kLittle… in GenParserDefinition()
48 s << "{ return " << name_ << "View(std::move(packet)); }"; in GenParserDefinition()
51 GenTestingParserFromBytes(s); in GenParserDefinition()
62 GenParserFieldGetter(s, field); in GenParserDefinition()
63 s << "\n"; in GenParserDefinition()
65 GenValidator(s); in GenParserDefinition()
66 s << "\n"; in GenParserDefinition()
68 s << " public:"; in GenParserDefinition()
69 GenParserToString(s); in GenParserDefinition()
70 s << "\n"; in GenParserDefinition()
72 s << " protected:\n"; in GenParserDefinition()
75 s << "explicit " << name_ << "View(" << parent_->name_ << "View parent)"; in GenParserDefinition()
76 s << " : " << parent_->name_ << "View(std::move(parent)) { was_validated_ = false; }"; in GenParserDefinition()
78s << "explicit " << name_ << "View(PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndia… in GenParserDefinition()
79s << " : PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian>(packet) { was_validated… in GenParserDefinition()
85 s << " private:\n"; in GenParserDefinition()
87 GenParserFieldGetter(s, field); in GenParserDefinition()
88 s << "\n"; in GenParserDefinition()
91 s << "};\n"; in GenParserDefinition()
94 void PacketDef::GenTestingParserFromBytes(std::ostream& s) const { in GenTestingParserFromBytes()
95 s << "\n#if defined(PACKET_FUZZ_TESTING) || defined(PACKET_TESTING) || defined(FUZZ_TARGET)\n"; in GenTestingParserFromBytes()
97 s << "static " << name_ << "View FromBytes(std::vector<uint8_t> bytes) {"; in GenTestingParserFromBytes()
98 s << "auto vec = std::make_shared<std::vector<uint8_t>>(bytes);"; in GenTestingParserFromBytes()
99 s << "return " << name_ << "View::Create("; in GenTestingParserFromBytes()
103 s << ancestor_ptr->name_ << "View::Create("; in GenTestingParserFromBytes()
107 s << "PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian>(vec)"; in GenTestingParserFromBytes()
109 s << ")"; in GenTestingParserFromBytes()
111 s << ");"; in GenTestingParserFromBytes()
112 s << "}"; in GenTestingParserFromBytes()
114 s << "\n#endif\n"; in GenTestingParserFromBytes()
117 void PacketDef::GenParserDefinitionPybind11(std::ostream& s) const { in GenParserDefinitionPybind11()
118 s << "py::class_<" << name_ << "View"; in GenParserDefinitionPybind11()
120 s << ", " << parent_->name_ << "View"; in GenParserDefinitionPybind11()
122 s << ", PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian>"; in GenParserDefinitionPybind11()
124 s << ">(m, \"" << name_ << "View\")"; in GenParserDefinitionPybind11()
126 s << ".def(py::init([](" << parent_->name_ << "View parent) {"; in GenParserDefinitionPybind11()
128s << ".def(py::init([](PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian> parent) {… in GenParserDefinitionPybind11()
130 s << "auto view =" << name_ << "View::Create(std::move(parent));"; in GenParserDefinitionPybind11()
131 s << "if (!view.IsValid()) { throw std::invalid_argument(\"Bad packet view\"); }"; in GenParserDefinitionPybind11()
132 s << "return view; }))"; in GenParserDefinitionPybind11()
134 s << ".def(py::init(&" << name_ << "View::Create))"; in GenParserDefinitionPybind11()
147 s << ".def(\"" << getter_func_name << "\", &" << name_ << "View::" << getter_func_name << ")"; in GenParserDefinitionPybind11()
149 s << ".def(\"IsValid\", &" << name_ << "View::IsValid)"; in GenParserDefinitionPybind11()
150 s << ";\n"; in GenParserDefinitionPybind11()
153 void PacketDef::GenParserFieldGetter(std::ostream& s, const PacketField* field) const { in GenParserFieldGetter() argument
163 field->GenGetter(s, start_field_offset, end_field_offset); in GenParserFieldGetter()
170 void PacketDef::GenValidator(std::ostream& s) const { in GenValidator()
180 s << "virtual bool IsValid() " << (parent_ != nullptr ? " override" : "") << " {"; in GenValidator()
181 s << "if (was_validated_) { return true; } "; in GenValidator()
182 s << "else { was_validated_ = true; was_validated_ = IsValid_(); return was_validated_; }"; in GenValidator()
183 s << "}"; in GenValidator()
185 s << "protected:"; in GenValidator()
186 s << "virtual bool IsValid_() const {"; in GenValidator()
189 s << "if (!" << parent_->name_ << "View::IsValid_()) { return false; } "; in GenValidator()
200 s << "auto it = begin() + (" << parent_size << ") / 8;"; in GenValidator()
206 s << "it += " << ((bits_size + 7) / 8) << " /* Total size of the fixed fields */;"; in GenValidator()
207 s << "if (it > end()) return false;"; in GenValidator()
214 s << "size_t sum_index = (" << offset << ") / 8;"; in GenValidator()
220 s << "size_t sum_index = size() - (" << offset << ") / 8;"; in GenValidator()
231 s << "size_t end_sum_index = (" << end_offset << ") / 8;"; in GenValidator()
237s << "size_t end_sum_index = size() - (" << started_field->GetSize() << " - " << end_offset << ") … in GenValidator()
240 s << "auto checksum_view = GetLittleEndianSubview(sum_index, end_sum_index);"; in GenValidator()
242 s << "auto checksum_view = GetBigEndianSubview(sum_index, end_sum_index);"; in GenValidator()
244 s << started_field->GetDataType() << " checksum;"; in GenValidator()
245 s << "checksum.Initialize();"; in GenValidator()
246 s << "for (uint8_t byte : checksum_view) { "; in GenValidator()
247 s << "checksum.AddByte(byte);}"; in GenValidator()
248 s << "if (checksum.GetChecksum() != (begin() + end_sum_index).extract<" in GenValidator()
278 s << "const auto& " << custom_size_var << " = " << field_size.dynamic_string(); in GenValidator()
279 s << "(begin() + (" << offset << ") / 8);"; in GenValidator()
281 s << "if (!" << custom_size_var << ".has_value()) { return false; }"; in GenValidator()
282 s << "it += *" << custom_size_var << ";"; in GenValidator()
283 s << "if (it > end()) return false;"; in GenValidator()
286 s << "it += (" << field_size.dynamic_string() << ") / 8;"; in GenValidator()
287 s << "if (it > end()) return false;"; in GenValidator()
297 s << "if (Get" << util::UnderscoreToCamelCase(constraint.first) << "() != "; in GenValidator()
300 s << std::get<int64_t>(constraint.second); in GenValidator()
302 s << std::get<std::string>(constraint.second); in GenValidator()
304 s << ") return false;"; in GenValidator()
309 field->GenValidator(s); in GenValidator()
310 s << "\n"; in GenValidator()
313 s << "return true;"; in GenValidator()
314 s << "}\n"; in GenValidator()
316 s << "bool was_validated_{false};\n"; in GenValidator()
320 void PacketDef::GenParserToString(std::ostream& s) const { in GenParserToString()
321 s << "virtual std::string ToString() " << (parent_ != nullptr ? " override" : "") << " {"; in GenParserToString()
322 s << "std::stringstream ss;"; in GenParserToString()
323 s << "ss << std::showbase << std::hex << \"" << name_ << " { \";"; in GenParserToString()
326 s << "ss << \"\" "; in GenParserToString()
333 s << (firstfield ? " << \"" : " << \", ") << field->GetName() << " = \" << "; in GenParserToString()
335 field->GenStringRepresentation(s, field->GetGetterFunctionName() + "()"); in GenParserToString()
341 s << ";"; in GenParserToString()
344 s << "ss << \" }\";"; in GenParserToString()
345 s << "return ss.str();"; in GenParserToString()
346 s << "}\n"; in GenParserToString()
349 void PacketDef::GenBuilderDefinition(std::ostream& s) const { in GenBuilderDefinition()
350 s << "class " << name_ << "Builder"; in GenBuilderDefinition()
352 s << " : public " << parent_->name_ << "Builder"; in GenBuilderDefinition()
355 s << " : public PacketBuilder<kLittleEndian>"; in GenBuilderDefinition()
357 s << " : public PacketBuilder<!kLittleEndian>"; in GenBuilderDefinition()
360 s << " {"; in GenBuilderDefinition()
361 s << " public:"; in GenBuilderDefinition()
362 s << " virtual ~" << name_ << "Builder() = default;"; in GenBuilderDefinition()
365 GenBuilderCreate(s); in GenBuilderDefinition()
366 s << "\n"; in GenBuilderDefinition()
368 GenTestingFromView(s); in GenBuilderDefinition()
369 s << "\n"; in GenBuilderDefinition()
372 GenSerialize(s); in GenBuilderDefinition()
373 s << "\n"; in GenBuilderDefinition()
375 GenSize(s); in GenBuilderDefinition()
376 s << "\n"; in GenBuilderDefinition()
378 s << " protected:\n"; in GenBuilderDefinition()
379 GenBuilderConstructor(s); in GenBuilderDefinition()
380 s << "\n"; in GenBuilderDefinition()
382 GenBuilderParameterChecker(s); in GenBuilderDefinition()
383 s << "\n"; in GenBuilderDefinition()
385 GenMembers(s); in GenBuilderDefinition()
386 s << "};\n"; in GenBuilderDefinition()
388 GenTestDefine(s); in GenBuilderDefinition()
389 s << "\n"; in GenBuilderDefinition()
391 GenFuzzTestDefine(s); in GenBuilderDefinition()
392 s << "\n"; in GenBuilderDefinition()
395 void PacketDef::GenTestingFromView(std::ostream& s) const { in GenTestingFromView()
396 s << "#if defined(PACKET_FUZZ_TESTING) || defined(PACKET_TESTING) || defined(FUZZ_TARGET)\n"; in GenTestingFromView()
398 s << "static std::unique_ptr<" << name_ << "Builder> FromView(" << name_ << "View view) {"; in GenTestingFromView()
399 s << "return " << name_ << "Builder::Create("; in GenTestingFromView()
404 params[i]->GenBuilderParameterFromView(s); in GenTestingFromView()
406 s << ", "; in GenTestingFromView()
409 s << ");"; in GenTestingFromView()
410 s << "}"; in GenTestingFromView()
412 s << "\n#endif\n"; in GenTestingFromView()
415 void PacketDef::GenBuilderDefinitionPybind11(std::ostream& s) const { in GenBuilderDefinitionPybind11()
416 s << "py::class_<" << name_ << "Builder"; in GenBuilderDefinitionPybind11()
418 s << ", " << parent_->name_ << "Builder"; in GenBuilderDefinitionPybind11()
421 s << ", PacketBuilder<kLittleEndian>"; in GenBuilderDefinitionPybind11()
423 s << ", PacketBuilder<!kLittleEndian>"; in GenBuilderDefinitionPybind11()
426 s << ", std::shared_ptr<" << name_ << "Builder>"; in GenBuilderDefinitionPybind11()
427 s << ">(m, \"" << name_ << "Builder\")"; in GenBuilderDefinitionPybind11()
429 GenBuilderCreatePybind11(s); in GenBuilderDefinitionPybind11()
431 s << ".def(\"Serialize\", [](" << name_ << "Builder& builder){"; in GenBuilderDefinitionPybind11()
432 s << "std::vector<uint8_t> bytes;"; in GenBuilderDefinitionPybind11()
433 s << "BitInserter bi(bytes);"; in GenBuilderDefinitionPybind11()
434 s << "builder.Serialize(bi);"; in GenBuilderDefinitionPybind11()
435 s << "return bytes;})"; in GenBuilderDefinitionPybind11()
436 s << ";\n"; in GenBuilderDefinitionPybind11()
439 void PacketDef::GenTestDefine(std::ostream& s) const { in GenTestDefine()
440 s << "#ifdef PACKET_TESTING\n"; in GenTestDefine()
441 s << "#define DEFINE_AND_INSTANTIATE_" << name_ << "ReflectionTest(...)"; in GenTestDefine()
442s << "class " << name_ << "ReflectionTest : public testing::TestWithParam<std::vector<uint8_t>> { … in GenTestDefine()
443 s << "public: "; in GenTestDefine()
444 s << "void CompareBytes(std::vector<uint8_t> captured_packet) {"; in GenTestDefine()
445 s << name_ << "View view = " << name_ << "View::FromBytes(captured_packet);"; in GenTestDefine()
446 s << "if (!view.IsValid()) { LOG_INFO(\"Invalid Packet Bytes (size = %zu)\", view.size());"; in GenTestDefine()
447s << "for (size_t i = 0; i < view.size(); i++) { LOG_INFO(\"%5zd:%02X\", i, *(view.begin() + i)); … in GenTestDefine()
448 s << "ASSERT_TRUE(view.IsValid());"; in GenTestDefine()
449 s << "auto packet = " << name_ << "Builder::FromView(view);"; in GenTestDefine()
450s << "std::shared_ptr<std::vector<uint8_t>> packet_bytes = std::make_shared<std::vector<uint8_t>>(… in GenTestDefine()
451 s << "packet_bytes->reserve(packet->size());"; in GenTestDefine()
452 s << "BitInserter it(*packet_bytes);"; in GenTestDefine()
453 s << "packet->Serialize(it);"; in GenTestDefine()
454 s << "ASSERT_EQ(*packet_bytes, captured_packet);"; in GenTestDefine()
455 s << "}"; in GenTestDefine()
456 s << "};"; in GenTestDefine()
457 s << "TEST_P(" << name_ << "ReflectionTest, generatedReflectionTest) {"; in GenTestDefine()
458 s << "CompareBytes(GetParam());"; in GenTestDefine()
459 s << "}"; in GenTestDefine()
460 s << "INSTANTIATE_TEST_SUITE_P(" << name_ << "_reflection, "; in GenTestDefine()
461 s << name_ << "ReflectionTest, testing::Values(__VA_ARGS__))"; in GenTestDefine()
464 s << "\nuint8_t " << name_ << "_test_bytes_" << i << "[] = \"" << bytes << "\";"; in GenTestDefine()
465 s << "std::vector<uint8_t> " << name_ << "_test_vec_" << i << "("; in GenTestDefine()
466 s << name_ << "_test_bytes_" << i << ","; in GenTestDefine()
467 s << name_ << "_test_bytes_" << i << " + sizeof("; in GenTestDefine()
468 s << name_ << "_test_bytes_" << i << ") - 1);"; in GenTestDefine()
473 s << "\nDEFINE_AND_INSTANTIATE_" << name_ << "ReflectionTest("; in GenTestDefine()
476 s << ","; in GenTestDefine()
478 s << name_ << "_test_vec_" << i++; in GenTestDefine()
480 s << ");"; in GenTestDefine()
482 s << "\n#endif"; in GenTestDefine()
485 void PacketDef::GenFuzzTestDefine(std::ostream& s) const { in GenFuzzTestDefine()
486 s << "#if defined(PACKET_FUZZ_TESTING) || defined(PACKET_TESTING)\n"; in GenFuzzTestDefine()
487 s << "#define DEFINE_" << name_ << "ReflectionFuzzTest() "; in GenFuzzTestDefine()
488 s << "void Run" << name_ << "ReflectionFuzzTest(const uint8_t* data, size_t size) {"; in GenFuzzTestDefine()
489 s << "auto vec = std::vector<uint8_t>(data, data + size);"; in GenFuzzTestDefine()
490 s << name_ << "View view = " << name_ << "View::FromBytes(vec);"; in GenFuzzTestDefine()
491 s << "if (!view.IsValid()) { return; }"; in GenFuzzTestDefine()
492 s << "auto packet = " << name_ << "Builder::FromView(view);"; in GenFuzzTestDefine()
493s << "std::shared_ptr<std::vector<uint8_t>> packet_bytes = std::make_shared<std::vector<uint8_t>>(… in GenFuzzTestDefine()
494 s << "packet_bytes->reserve(packet->size());"; in GenFuzzTestDefine()
495 s << "BitInserter it(*packet_bytes);"; in GenFuzzTestDefine()
496 s << "packet->Serialize(it);"; in GenFuzzTestDefine()
497 s << "}"; in GenFuzzTestDefine()
498 s << "\n#endif\n"; in GenFuzzTestDefine()
499 s << "#ifdef PACKET_FUZZ_TESTING\n"; in GenFuzzTestDefine()
500 s << "#define DEFINE_AND_REGISTER_" << name_ << "ReflectionFuzzTest(REGISTRY) "; in GenFuzzTestDefine()
501 s << "DEFINE_" << name_ << "ReflectionFuzzTest();"; in GenFuzzTestDefine()
502 s << " class " << name_ << "ReflectionFuzzTestRegistrant {"; in GenFuzzTestDefine()
503 s << "public: "; in GenFuzzTestDefine()
504 s << "explicit " << name_ in GenFuzzTestDefine()
506 s << "fuzz_test_registry.push_back(Run" << name_ << "ReflectionFuzzTest);"; in GenFuzzTestDefine()
507 s << "}}; "; in GenFuzzTestDefine()
508s << name_ << "ReflectionFuzzTestRegistrant " << name_ << "_reflection_fuzz_test_registrant(REGIST… in GenFuzzTestDefine()
509 s << "\n#endif"; in GenFuzzTestDefine()
522 void PacketDef::GenBuilderCreate(std::ostream& s) const { in GenBuilderCreate()
523 s << "static std::unique_ptr<" << name_ << "Builder> Create("; in GenBuilderCreate()
527 params[i]->GenBuilderParameter(s); in GenBuilderCreate()
529 s << ", "; in GenBuilderCreate()
532 s << ") {"; in GenBuilderCreate()
535 s << "auto builder = std::unique_ptr<" << name_ << "Builder>(new " << name_ << "Builder("; in GenBuilderCreate()
544 s << "std::move(" << params[i]->GetName() << ")"; in GenBuilderCreate()
546 s << params[i]->GetName(); in GenBuilderCreate()
549 s << ", "; in GenBuilderCreate()
553 s << "));"; in GenBuilderCreate()
555 s << "builder->payload_ = std::move(payload);"; in GenBuilderCreate()
557 s << "return builder;"; in GenBuilderCreate()
558 s << "}\n"; in GenBuilderCreate()
561 void PacketDef::GenBuilderCreatePybind11(std::ostream& s) const { in GenBuilderCreatePybind11()
562 s << ".def(py::init([]("; in GenBuilderCreatePybind11()
580 s << util::StringJoin(",", constructor_args) << "){"; in GenBuilderCreatePybind11()
593 s << param_type << " " << move_only_param_name << ";"; in GenBuilderCreatePybind11()
599 s << "for (size_t i = 0; i < " << param->GetName() << ".size(); i++) {"; in GenBuilderCreatePybind11()
601 s << "auto " << param->GetName() + "_bytes = std::make_shared<std::vector<uint8_t>>();"; in GenBuilderCreatePybind11()
602 s << param->GetName() + "_bytes->reserve(" << param->GetName() << "[i]->size());"; in GenBuilderCreatePybind11()
603 s << "BitInserter " << param->GetName() + "_bi(*" << param->GetName() << "_bytes);"; in GenBuilderCreatePybind11()
604 s << param->GetName() << "[i]->Serialize(" << param->GetName() << "_bi);"; in GenBuilderCreatePybind11()
606s << "auto " << param->GetName() << "_view = PacketView<kLittleEndian>(" << param->GetName() << "_… in GenBuilderCreatePybind11()
607 s << param->GetElementField()->GetDataType() << " " << param->GetName() << "_reparsed = "; in GenBuilderCreatePybind11()
608 s << "Parse" << struct_type << "(" << param->GetName() + "_view.begin());"; in GenBuilderCreatePybind11()
611 s << move_only_param_name << ".push_back(std::move(" << param->GetName() + "_reparsed));"; in GenBuilderCreatePybind11()
613 s << move_only_param_name << "[i] = std::move(" << param->GetName() << "_reparsed);"; in GenBuilderCreatePybind11()
617 s << "}"; in GenBuilderCreatePybind11()
620 s << "std::vector<uint8_t> " << param->GetName() + "_bytes;"; in GenBuilderCreatePybind11()
621 s << param->GetName() + "_bytes.reserve(" << param->GetName() << "->size());"; in GenBuilderCreatePybind11()
622 s << "BitInserter " << param->GetName() + "_bi(" << param->GetName() << "_bytes);"; in GenBuilderCreatePybind11()
623 s << param->GetName() << "->Serialize(" << param->GetName() + "_bi);"; in GenBuilderCreatePybind11()
624 s << move_only_param_name << " = "; in GenBuilderCreatePybind11()
625 s << "std::make_unique<RawBuilder>(" << param->GetName() << "_bytes);"; in GenBuilderCreatePybind11()
628 s << "return " << name_ << "Builder::Create("; in GenBuilderCreatePybind11()
644 s << util::StringJoin(",", builder_vars) << ");}"; in GenBuilderCreatePybind11()
645 s << "))"; in GenBuilderCreatePybind11()
648 void PacketDef::GenBuilderParameterChecker(std::ostream& s) const { in GenBuilderParameterChecker()
657 s << "void CheckParameterValues("; in GenBuilderParameterChecker()
659 params_to_validate[i]->GenBuilderParameter(s); in GenBuilderParameterChecker()
661 s << ", "; in GenBuilderParameterChecker()
664 s << ") {"; in GenBuilderParameterChecker()
668 field->GenParameterValidator(s); in GenBuilderParameterChecker()
670 s << "}\n"; in GenBuilderParameterChecker()
673 void PacketDef::GenBuilderConstructor(std::ostream& s) const { in GenBuilderConstructor()
674 s << "explicit " << name_ << "Builder("; in GenBuilderConstructor()
682 params[i]->GenBuilderParameter(s); in GenBuilderConstructor()
684 s << ", "; in GenBuilderConstructor()
688 s << ") :"; in GenBuilderConstructor()
690 s << ")"; in GenBuilderConstructor()
697 s << parent_->name_ << "Builder("; in GenBuilderConstructor()
710 s << std::get<int64_t>(constraint->second); in GenBuilderConstructor()
712 s << std::get<std::string>(constraint->second); in GenBuilderConstructor()
717 s << "/* " << field->GetName() << "_ */"; in GenBuilderConstructor()
719 s << field->GetName(); in GenBuilderConstructor()
723 s << ", "; in GenBuilderConstructor()
726 s << ") "; in GenBuilderConstructor()
737 s << ","; in GenBuilderConstructor()
742 s << saved_param_name << "_(std::move(" << saved_param_name << "))"; in GenBuilderConstructor()
744 s << saved_param_name << "_(" << saved_param_name << ")"; in GenBuilderConstructor()
747 s << ","; in GenBuilderConstructor()
750 s << " {"; in GenBuilderConstructor()
755 s << "CheckParameterValues("; in GenBuilderConstructor()
757 s << params_to_validate[i]->GetName() << "_"; in GenBuilderConstructor()
759 s << ", "; in GenBuilderConstructor()
762 s << ");"; in GenBuilderConstructor()
765 s << "}\n"; in GenBuilderConstructor()
768 void PacketDef::GenRustChildEnums(std::ostream& s) const { in GenRustChildEnums()
771 s << "#[derive(Debug)] "; in GenRustChildEnums()
772 s << "enum " << name_ << "DataChild {"; in GenRustChildEnums()
774 s << child->name_ << "(Arc<" << child->name_ << "Data>),"; in GenRustChildEnums()
777 s << "Payload(Bytes),"; in GenRustChildEnums()
779 s << "None,"; in GenRustChildEnums()
780 s << "}\n"; in GenRustChildEnums()
782 s << "impl " << name_ << "DataChild {"; in GenRustChildEnums()
783 s << "fn get_total_size(&self) -> usize {"; in GenRustChildEnums()
784 s << "match self {"; in GenRustChildEnums()
786 s << name_ << "DataChild::" << child->name_ << "(value) => value.get_total_size(),"; in GenRustChildEnums()
789 s << name_ << "DataChild::Payload(p) => p.len(),"; in GenRustChildEnums()
791 s << name_ << "DataChild::None => 0,"; in GenRustChildEnums()
792 s << "}\n"; in GenRustChildEnums()
793 s << "}\n"; in GenRustChildEnums()
794 s << "}\n"; in GenRustChildEnums()
796 s << "#[derive(Debug)] "; in GenRustChildEnums()
797 s << "pub enum " << name_ << "Child {"; in GenRustChildEnums()
799 s << child->name_ << "(" << child->name_ << "Packet),"; in GenRustChildEnums()
802 s << "Payload(Bytes),"; in GenRustChildEnums()
804 s << "None,"; in GenRustChildEnums()
805 s << "}\n"; in GenRustChildEnums()
809 void PacketDef::GenRustStructDeclarations(std::ostream& s) const { in GenRustStructDeclarations()
810 s << "#[derive(Debug)] "; in GenRustStructDeclarations()
811 s << "struct " << name_ << "Data {"; in GenRustStructDeclarations()
814 GenRustStructFieldNameAndType(s); in GenRustStructDeclarations()
816 s << "child: " << name_ << "DataChild,"; in GenRustStructDeclarations()
818 s << "}\n"; in GenRustStructDeclarations()
821 s << "#[derive(Debug, Clone)] "; in GenRustStructDeclarations()
822 s << "pub struct " << name_ << "Packet {"; in GenRustStructDeclarations()
827 s << util::CamelCaseToUnderScore(def->name_) << ": Arc<" << def->name_ << "Data>,"; in GenRustStructDeclarations()
829 s << "}\n"; in GenRustStructDeclarations()
832 s << "#[derive(Debug)] "; in GenRustStructDeclarations()
833 s << "pub struct " << name_ << "Builder {"; in GenRustStructDeclarations()
839 s << "pub "; in GenRustStructDeclarations()
840 param->GenRustNameAndType(s); in GenRustStructDeclarations()
841 s << ", "; in GenRustStructDeclarations()
844 s << "pub payload: Option<Bytes>,"; in GenRustStructDeclarations()
846 s << "}\n"; in GenRustStructDeclarations()
849 bool PacketDef::GenRustStructFieldNameAndType(std::ostream& s) const { in GenRustStructFieldNameAndType()
863 field->GenRustNameAndType(s); in GenRustStructFieldNameAndType()
864 s << ", "; in GenRustStructFieldNameAndType()
869 void PacketDef::GenRustStructFieldNames(std::ostream& s) const { in GenRustStructFieldNames()
880 s << field->GetName(); in GenRustStructFieldNames()
881 s << ", "; in GenRustStructFieldNames()
885 void PacketDef::GenRustStructImpls(std::ostream& s) const { in GenRustStructImpls()
886 s << "impl " << name_ << "Data {"; in GenRustStructImpls()
889 s << "fn conforms(bytes: &[u8]) -> bool {"; in GenRustStructImpls()
890 GenRustConformanceCheck(s); in GenRustStructImpls()
900 s << "if !" << field->GetRustDataType() << "::conforms(&bytes[" << start_offset.bytes(); in GenRustStructImpls()
901 s << ".." << start_offset.bytes() + field->GetSize().bytes() << "]) { return false; }"; in GenRustStructImpls()
904 s << " true"; in GenRustStructImpls()
905 s << "}"; in GenRustStructImpls()
912s << "fn parse(bytes: &[u8], " << constraint << ": " << constraint_type << ") -> Result<Self> {"; in GenRustStructImpls()
914 s << "fn parse(bytes: &[u8]) -> Result<Self> {"; in GenRustStructImpls()
929 field->GenBoundsCheck(s, start_field_offset, end_field_offset, name_); in GenRustStructImpls()
930 field->GenRustGetter(s, start_field_offset, end_field_offset); in GenRustStructImpls()
947 s << "let child = match " << constraint_name << " {"; in GenRustStructImpls()
961 s << enum_variant; in GenRustStructImpls()
962 s << " if " << desc_path[0]->name_ << "Data::conforms(&bytes[..])"; in GenRustStructImpls()
963 s << " => {"; in GenRustStructImpls()
964 s << name_ << "DataChild::"; in GenRustStructImpls()
965 s << desc_path[0]->name_ << "(Arc::new("; in GenRustStructImpls()
967 s << desc_path[0]->name_ << "Data::parse(&bytes[..]"; in GenRustStructImpls()
968 s << ", " << enum_variant << ")?))"; in GenRustStructImpls()
970 s << desc_path[0]->name_ << "Data::parse(&bytes[..])?))"; in GenRustStructImpls()
973 s << std::get<int64_t>(desc.second) << " => {"; in GenRustStructImpls()
974 s << "unimplemented!();"; in GenRustStructImpls()
976 s << "}\n"; in GenRustStructImpls()
980 s << "v => return Err(Error::ConstraintOutOfBounds{field: \"" << constraint_name in GenRustStructImpls()
984 s << "};\n"; in GenRustStructImpls()
987 s << "let child = match " << child->name_ << "Data::parse(&bytes[..]) {"; in GenRustStructImpls()
988 s << " Ok(c) if " << child->name_ << "Data::conforms(&bytes[..]) => {"; in GenRustStructImpls()
989 s << name_ << "DataChild::" << child->name_ << "(Arc::new(c))"; in GenRustStructImpls()
990 s << " },"; in GenRustStructImpls()
991 s << " Err(Error::InvalidLengthError { .. }) => " << name_ << "DataChild::None,"; in GenRustStructImpls()
992 s << " _ => return Err(Error::InvalidPacketError),"; in GenRustStructImpls()
993 s << "};"; in GenRustStructImpls()
995 s << "let child = if payload.len() > 0 {"; in GenRustStructImpls()
996 s << name_ << "DataChild::Payload(Bytes::from(payload))"; in GenRustStructImpls()
997 s << "} else {"; in GenRustStructImpls()
998 s << name_ << "DataChild::None"; in GenRustStructImpls()
999 s << "};"; in GenRustStructImpls()
1002 s << "Ok(Self {"; in GenRustStructImpls()
1016 s << field->GetName(); in GenRustStructImpls()
1017 s << ", "; in GenRustStructImpls()
1022 s << "child,"; in GenRustStructImpls()
1024 s << "})\n"; in GenRustStructImpls()
1025 s << "}\n"; in GenRustStructImpls()
1028 s << "fn write_to(&self, buffer: &mut BytesMut) {"; in GenRustStructImpls()
1029 GenRustWriteToFields(s); in GenRustStructImpls()
1032 s << "match &self.child {"; in GenRustStructImpls()
1034 s << name_ << "DataChild::" << child->name_ << "(value) => value.write_to(buffer),"; in GenRustStructImpls()
1038s << name_ << "DataChild::Payload(p) => buffer[" << offset.bytes() << "..].copy_from_slice(&p[..])… in GenRustStructImpls()
1040 s << name_ << "DataChild::None => {}"; in GenRustStructImpls()
1041 s << "}"; in GenRustStructImpls()
1044 s << "}\n"; in GenRustStructImpls()
1046 s << "fn get_total_size(&self) -> usize {"; in GenRustStructImpls()
1048 s << "self.get_size() + self.child.get_total_size()"; in GenRustStructImpls()
1050 s << "self.get_size()"; in GenRustStructImpls()
1052 s << "}\n"; in GenRustStructImpls()
1054 s << "fn get_size(&self) -> usize {"; in GenRustStructImpls()
1055 GenSizeRetVal(s); in GenRustStructImpls()
1056 s << "}\n"; in GenRustStructImpls()
1057 s << "}\n"; in GenRustStructImpls()
1060 void PacketDef::GenRustAccessStructImpls(std::ostream& s) const { in GenRustAccessStructImpls()
1064 s << "impl CommandExpectations for " << name_ << "Packet {"; in GenRustAccessStructImpls()
1065 s << " type ResponseType = " << complement_->name_ << "Packet;"; in GenRustAccessStructImpls()
1066 s << " fn _to_response_type(pkt: EventPacket) -> Self::ResponseType { "; in GenRustAccessStructImpls()
1067 s << complement_->name_ << "Packet::new(pkt." << complement_root_accessor << ".clone())"; in GenRustAccessStructImpls()
1068 s << " }"; in GenRustAccessStructImpls()
1069 s << "}"; in GenRustAccessStructImpls()
1072 s << "impl Packet for " << name_ << "Packet {"; in GenRustAccessStructImpls()
1076 s << "fn to_bytes(self) -> Bytes {"; in GenRustAccessStructImpls()
1077 s << " let mut buffer = BytesMut::new();"; in GenRustAccessStructImpls()
1078 s << " buffer.resize(self." << root_accessor << ".get_total_size(), 0);"; in GenRustAccessStructImpls()
1079 s << " self." << root_accessor << ".write_to(&mut buffer);"; in GenRustAccessStructImpls()
1080 s << " buffer.freeze()"; in GenRustAccessStructImpls()
1081 s << "}\n"; in GenRustAccessStructImpls()
1083 s << "fn to_vec(self) -> Vec<u8> { self.to_bytes().to_vec() }\n"; in GenRustAccessStructImpls()
1084 s << "}"; in GenRustAccessStructImpls()
1086 s << "impl " << name_ << "Packet {"; in GenRustAccessStructImpls()
1088 s << "pub fn parse(bytes: &[u8]) -> Result<Self> { "; in GenRustAccessStructImpls()
1089 s << "Ok(Self::new(Arc::new(" << name_ << "Data::parse(bytes)?)))"; in GenRustAccessStructImpls()
1090 s << "}"; in GenRustAccessStructImpls()
1094 s << " pub fn specialize(&self) -> " << name_ << "Child {"; in GenRustAccessStructImpls()
1095 s << " match &self." << util::CamelCaseToUnderScore(name_) << ".child {"; in GenRustAccessStructImpls()
1097s << name_ << "DataChild::" << child->name_ << "(_) => " << name_ << "Child::" << child->name_ << … in GenRustAccessStructImpls()
1101 s << name_ << "DataChild::Payload(p) => " << name_ << "Child::Payload(p.clone()),"; in GenRustAccessStructImpls()
1103 s << name_ << "DataChild::None => " << name_ << "Child::None,"; in GenRustAccessStructImpls()
1104 s << "}}"; in GenRustAccessStructImpls()
1110 s << " fn new(root: Arc<" << root->name_ << "Data>) -> Self {"; in GenRustAccessStructImpls()
1115 s << "let " << accessor_name << " = root;"; in GenRustAccessStructImpls()
1117s << "let " << accessor_name << " = match &" << util::CamelCaseToUnderScore(prev->name_) << ".chil… in GenRustAccessStructImpls()
1118 s << prev->name_ << "DataChild::" << def->name_ << "(value) => (*value).clone(),"; in GenRustAccessStructImpls()
1119 s << "_ => panic!(\"inconsistent state - child was not " << def->name_ << "\"),"; in GenRustAccessStructImpls()
1120 s << "};"; in GenRustAccessStructImpls()
1124 s << "Self {"; in GenRustAccessStructImpls()
1127 s << util::CamelCaseToUnderScore(def->name_) << ","; in GenRustAccessStructImpls()
1129 s << "}}"; in GenRustAccessStructImpls()
1145 s << "pub fn get_" << field->GetName() << "(&self) -> &" << field->GetRustDataType() << "{"; in GenRustAccessStructImpls()
1146s << " &self." << util::CamelCaseToUnderScore(def->name_) << ".as_ref()." << field->GetName(); in GenRustAccessStructImpls()
1147 s << "}\n"; in GenRustAccessStructImpls()
1149 s << "pub fn get_" << field->GetName() << "(&self) -> " << field->GetRustDataType() << "{"; in GenRustAccessStructImpls()
1150s << " self." << util::CamelCaseToUnderScore(def->name_) << ".as_ref()." << field->GetName(); in GenRustAccessStructImpls()
1151 s << "}\n"; in GenRustAccessStructImpls()
1156 s << "}\n"; in GenRustAccessStructImpls()
1161 s << "impl Into<" << def->name_ << "Packet> for " << name_ << "Packet {"; in GenRustAccessStructImpls()
1162 s << " fn into(self) -> " << def->name_ << "Packet {"; in GenRustAccessStructImpls()
1163 s << def->name_ << "Packet::new(self." << util::CamelCaseToUnderScore(root->name_) << ")"; in GenRustAccessStructImpls()
1164 s << " }"; in GenRustAccessStructImpls()
1165 s << "}\n"; in GenRustAccessStructImpls()
1169 void PacketDef::GenRustBuilderStructImpls(std::ostream& s) const { in GenRustBuilderStructImpls()
1173 s << "impl CommandExpectations for " << name_ << "Builder {"; in GenRustBuilderStructImpls()
1174 s << " type ResponseType = " << complement_->name_ << "Packet;"; in GenRustBuilderStructImpls()
1175 s << " fn _to_response_type(pkt: EventPacket) -> Self::ResponseType { "; in GenRustBuilderStructImpls()
1176 s << complement_->name_ << "Packet::new(pkt." << complement_root_accessor << ".clone())"; in GenRustBuilderStructImpls()
1177 s << " }"; in GenRustBuilderStructImpls()
1178 s << "}"; in GenRustBuilderStructImpls()
1181 s << "impl " << name_ << "Builder {"; in GenRustBuilderStructImpls()
1182 s << "pub fn build(self) -> " << name_ << "Packet {"; in GenRustBuilderStructImpls()
1202 s << "let " << accessor_name << "= Arc::new(" << ancestor->name_ << "Data {"; in GenRustBuilderStructImpls()
1205 s << field->GetName() << ": "; in GenRustBuilderStructImpls()
1208 s << std::get<int64_t>(constraint->second); in GenRustBuilderStructImpls()
1212 s << field->GetDataType() << "::" << util::ConstantCaseToCamelCase(constant); in GenRustBuilderStructImpls()
1218 s << "self." << field->GetName(); in GenRustBuilderStructImpls()
1220 s << ", "; in GenRustBuilderStructImpls()
1225 s << "child: match self.payload { "; in GenRustBuilderStructImpls()
1226 s << "None => " << name_ << "DataChild::None,"; in GenRustBuilderStructImpls()
1227 s << "Some(bytes) => " << name_ << "DataChild::Payload(bytes),"; in GenRustBuilderStructImpls()
1228 s << "},"; in GenRustBuilderStructImpls()
1230 s << "child: " << name_ << "DataChild::None,"; in GenRustBuilderStructImpls()
1233 s << "child: " << ancestor->name_ << "DataChild::" << prev->name_ << "(" in GenRustBuilderStructImpls()
1237 s << "});"; in GenRustBuilderStructImpls()
1241 s << name_ << "Packet::new(" << util::CamelCaseToUnderScore(prev->name_) << ")"; in GenRustBuilderStructImpls()
1242 s << "}\n"; in GenRustBuilderStructImpls()
1244 s << "}\n"; in GenRustBuilderStructImpls()
1246 s << "impl Into<" << ancestor->name_ << "Packet> for " << name_ << "Builder {"; in GenRustBuilderStructImpls()
1247 s << " fn into(self) -> " << ancestor->name_ << "Packet { self.build().into() }"; in GenRustBuilderStructImpls()
1248 s << "}\n"; in GenRustBuilderStructImpls()
1252 void PacketDef::GenRustBuilderTest(std::ostream& s) const { in GenRustBuilderTest()
1256 s << "macro_rules! " << util::CamelCaseToUnderScore(name_) << "_builder_tests { "; in GenRustBuilderTest()
1257 s << "($($name:ident: $byte_string:expr,)*) => {"; in GenRustBuilderTest()
1258 s << "$("; in GenRustBuilderTest()
1259 s << "\n#[test]\n"; in GenRustBuilderTest()
1260 s << "pub fn $name() { "; in GenRustBuilderTest()
1261 s << "let raw_bytes = $byte_string;"; in GenRustBuilderTest()
1263 s << "/* (" << i << ") */\n"; in GenRustBuilderTest()
1265 s << "match " << lineage[i]->name_ << "Packet::parse(raw_bytes) {"; in GenRustBuilderTest()
1266 s << "Ok(" << util::CamelCaseToUnderScore(lineage[i]->name_) << "_packet) => {"; in GenRustBuilderTest()
1267 s << "match " << util::CamelCaseToUnderScore(lineage[i]->name_) << "_packet.specialize() {"; in GenRustBuilderTest()
1269 s << lineage[i - 1]->name_ << "Child::" << lineage[i]->name_ << "("; in GenRustBuilderTest()
1270 s << util::CamelCaseToUnderScore(lineage[i]->name_) << "_packet) => {"; in GenRustBuilderTest()
1271 s << "match " << util::CamelCaseToUnderScore(lineage[i]->name_) << "_packet.specialize() {"; in GenRustBuilderTest()
1273 s << lineage[i - 1]->name_ << "Child::" << lineage[i]->name_ << "(packet) => {"; in GenRustBuilderTest()
1274 s << "let rebuilder = " << lineage[i]->name_ << "Builder {"; in GenRustBuilderTest()
1280 s << param->GetName() << " : packet."; in GenRustBuilderTest()
1282 s << util::CamelCaseToUnderScore(param->GetGetterFunctionName()) << "().to_vec(),"; in GenRustBuilderTest()
1287 s << util::CamelCaseToUnderScore(param->GetGetterFunctionName()) << "().to_vec(),"; in GenRustBuilderTest()
1289 s << util::CamelCaseToUnderScore(param->GetGetterFunctionName()) << "().clone(),"; in GenRustBuilderTest()
1292 s << util::CamelCaseToUnderScore(param->GetGetterFunctionName()) << "().clone(),"; in GenRustBuilderTest()
1294 s << util::CamelCaseToUnderScore(param->GetGetterFunctionName()) << "(),"; in GenRustBuilderTest()
1297 s << "};"; in GenRustBuilderTest()
1298 s << "let rebuilder_base : " << lineage[0]->name_ << "Packet = rebuilder.into();"; in GenRustBuilderTest()
1299 s << "let rebuilder_bytes : &[u8] = &rebuilder_base.to_bytes();"; in GenRustBuilderTest()
1300 s << "assert_eq!(rebuilder_bytes, raw_bytes);"; in GenRustBuilderTest()
1301 s << "}"; in GenRustBuilderTest()
1305 s << "_ => {"; in GenRustBuilderTest()
1306s << "println!(\"Couldn't parse " << util::CamelCaseToUnderScore(lineage[lineage.size() - i]->name… in GenRustBuilderTest()
1307s << "{:02x?}\", " << util::CamelCaseToUnderScore(lineage[lineage.size() - i - 1]->name_) << "_pac… in GenRustBuilderTest()
1308 s << "}}}"; in GenRustBuilderTest()
1311 s << ","; in GenRustBuilderTest()
1312s << "Err(e) => panic!(\"could not parse " << lineage[0]->name_ << ": {:?} {:02x?}\", e, raw_bytes… in GenRustBuilderTest()
1313 s << "}"; in GenRustBuilderTest()
1314 s << "}"; in GenRustBuilderTest()
1315 s << ")*"; in GenRustBuilderTest()
1316 s << "}"; in GenRustBuilderTest()
1317 s << "}"; in GenRustBuilderTest()
1319 s << util::CamelCaseToUnderScore(name_) << "_builder_tests! { "; in GenRustBuilderTest()
1322 s << util::CamelCaseToUnderScore(name_) << "_builder_test_"; in GenRustBuilderTest()
1323 s << std::setfill('0') << std::setw(2) << number++ << ": "; in GenRustBuilderTest()
1324 s << "b\"" << test_case << "\","; in GenRustBuilderTest()
1326 s << "}"; in GenRustBuilderTest()
1327 s << "\n"; in GenRustBuilderTest()
1331 void PacketDef::GenRustDef(std::ostream& s) const { in GenRustDef()
1332 GenRustChildEnums(s); in GenRustDef()
1333 GenRustStructDeclarations(s); in GenRustDef()
1334 GenRustStructImpls(s); in GenRustDef()
1335 GenRustAccessStructImpls(s); in GenRustDef()
1336 GenRustBuilderStructImpls(s); in GenRustDef()
1337 GenRustBuilderTest(s); in GenRustDef()