| 6693 | } |
| 6694 | |
| 6695 | void GeneratorGo::GenerateStructFinalModel(const std::shared_ptr<Package>& p, const std::shared_ptr<StructType>& s, const CppCommon::Path& path) |
| 6696 | { |
| 6697 | std::string struct_name = ConvertToUpper(*s->name); |
| 6698 | std::string final_model_name = "FinalModel" + struct_name; |
| 6699 | |
| 6700 | // Generate the output file |
| 6701 | CppCommon::Path output = path / (final_model_name + ".go"); |
| 6702 | WriteBegin(); |
| 6703 | |
| 6704 | // Generate header |
| 6705 | GenerateHeader(CppCommon::Path(_input).filename().string()); |
| 6706 | |
| 6707 | // Generate package |
| 6708 | WriteLine(); |
| 6709 | WriteLineIndent("package " + *p->name); |
| 6710 | |
| 6711 | // Generate imports |
| 6712 | WriteLine(); |
| 6713 | GenerateImports(p); |
| 6714 | |
| 6715 | std::string base_type = (s->base && !s->base->empty()) ? ConvertTypeName(*s->base, false) : ""; |
| 6716 | std::string base_final_model = (s->base && !s->base->empty()) ? ConvertModelName(*s->base, "FinalModel") : ""; |
| 6717 | std::string base_final_name = "FinalModel" + ConvertBaseName(base_type); |
| 6718 | |
| 6719 | // Generate struct final model type |
| 6720 | WriteLine(); |
| 6721 | WriteLineIndent("// Fast Binary Encoding " + struct_name + " final model"); |
| 6722 | WriteLineIndent("type " + final_model_name + " struct {"); |
| 6723 | Indent(1); |
| 6724 | WriteLineIndent("buffer *fbe.Buffer // Final model buffer"); |
| 6725 | WriteLineIndent("offset int // Final model buffer offset"); |
| 6726 | if ((s->base && !s->base->empty()) || (s->body && !s->body->fields.empty())) |
| 6727 | { |
| 6728 | WriteLine(); |
| 6729 | if (!base_type.empty()) |
| 6730 | WriteLineIndent("*" + base_final_model); |
| 6731 | if (s->body) |
| 6732 | for (const auto& field : s->body->fields) |
| 6733 | WriteLineIndent(ConvertToUpper(*field->name) + " *" + ConvertTypeFieldDeclaration(*field, true)); |
| 6734 | } |
| 6735 | Indent(-1); |
| 6736 | WriteLineIndent("}"); |
| 6737 | |
| 6738 | // Generate struct final model constructor |
| 6739 | WriteLine(); |
| 6740 | WriteLineIndent("// Create a new " + struct_name + " final model"); |
| 6741 | WriteLineIndent("func New" + final_model_name + "(buffer *fbe.Buffer, offset int) *" + final_model_name + " {"); |
| 6742 | Indent(1); |
| 6743 | WriteLineIndent("fbeResult := " + final_model_name + "{buffer: buffer, offset: offset}"); |
| 6744 | if (!base_type.empty()) |
| 6745 | WriteLineIndent("fbeResult." + base_final_name + " = " + ConvertModelName(*s->base, "NewFinalModel") + "(buffer, 0)"); |
| 6746 | if (s->body) |
| 6747 | for (const auto& field : s->body->fields) |
| 6748 | WriteLineIndent("fbeResult." + ConvertToUpper(*field->name) + " = " + ConvertTypeFieldInitialization(*field, "0", true)); |
| 6749 | WriteLineIndent("return &fbeResult"); |
| 6750 | Indent(-1); |
| 6751 | WriteLineIndent("}"); |
| 6752 | |