| 6073 | } |
| 6074 | |
| 6075 | void GeneratorGo::GenerateStructFieldModel(const std::shared_ptr<Package>& p, const std::shared_ptr<StructType>& s, const CppCommon::Path& path) |
| 6076 | { |
| 6077 | std::string struct_name = ConvertToUpper(*s->name); |
| 6078 | std::string field_model_name = "FieldModel" + struct_name; |
| 6079 | |
| 6080 | // Generate the output file |
| 6081 | CppCommon::Path output = path / (field_model_name + ".go"); |
| 6082 | WriteBegin(); |
| 6083 | |
| 6084 | // Generate header |
| 6085 | GenerateHeader(CppCommon::Path(_input).filename().string()); |
| 6086 | |
| 6087 | // Generate package |
| 6088 | WriteLine(); |
| 6089 | WriteLineIndent("package " + *p->name); |
| 6090 | |
| 6091 | // Generate imports |
| 6092 | WriteLine(); |
| 6093 | GenerateImports(p); |
| 6094 | |
| 6095 | std::string base_type = (s->base && !s->base->empty()) ? ConvertTypeName(*s->base, false) : ""; |
| 6096 | std::string base_field_model = (s->base && !s->base->empty()) ? ConvertModelName(*s->base, "FieldModel") : ""; |
| 6097 | std::string base_field_name = "FieldModel" + ConvertBaseName(base_type); |
| 6098 | |
| 6099 | // Generate struct field model type |
| 6100 | WriteLine(); |
| 6101 | WriteLineIndent("// Fast Binary Encoding " + struct_name + " field model"); |
| 6102 | WriteLineIndent("type " + field_model_name + " struct {"); |
| 6103 | Indent(1); |
| 6104 | WriteLineIndent("// Field model buffer"); |
| 6105 | WriteLineIndent("buffer *fbe.Buffer"); |
| 6106 | WriteLineIndent("// Field model buffer offset"); |
| 6107 | WriteLineIndent("offset int"); |
| 6108 | if ((s->base && !s->base->empty()) || (s->body && !s->body->fields.empty())) |
| 6109 | { |
| 6110 | WriteLine(); |
| 6111 | if (!base_type.empty()) |
| 6112 | WriteLineIndent("*" + base_field_model); |
| 6113 | if (s->body) |
| 6114 | for (const auto& field : s->body->fields) |
| 6115 | WriteLineIndent(ConvertToUpper(*field->name) + " *" + ConvertTypeFieldDeclaration(*field, false)); |
| 6116 | } |
| 6117 | Indent(-1); |
| 6118 | WriteLineIndent("}"); |
| 6119 | |
| 6120 | // Generate struct field model constructor |
| 6121 | WriteLine(); |
| 6122 | WriteLineIndent("// Create a new " + struct_name + " field model"); |
| 6123 | WriteLineIndent("func New" + field_model_name + "(buffer *fbe.Buffer, offset int) *" + field_model_name + " {"); |
| 6124 | Indent(1); |
| 6125 | std::string prev_offset("4"); |
| 6126 | std::string prev_size("4"); |
| 6127 | WriteLineIndent("fbeResult := " + field_model_name + "{buffer: buffer, offset: offset}"); |
| 6128 | if (!base_type.empty()) |
| 6129 | { |
| 6130 | WriteLineIndent("fbeResult." + base_field_name + " = " + ConvertModelName(*s->base, "NewFieldModel") + "(buffer, " + prev_offset + " + " + prev_size + ")"); |
| 6131 | prev_offset = "fbeResult." + base_field_name + ".FBEOffset()"; |
| 6132 | prev_size = "fbeResult." + base_field_name + ".FBEBody() - 4 - 4"; |