MCPcopy Create free account
hub / github.com/chronoxor/FastBinaryEncoding / GenerateStructFieldModel

Method GenerateStructFieldModel

source/generator_go.cpp:6075–6527  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6073}
6074
6075void 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";

Callers

nothing calls this directly

Calls 2

stringMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected