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

Method GenerateStruct

source/generator_go.cpp:5300–6073  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5298}
5299
5300void GeneratorGo::GenerateStruct(const std::shared_ptr<Package>& p, const std::shared_ptr<StructType>& s, const CppCommon::Path& path)
5301{
5302 std::string struct_name = ConvertToUpper(*s->name);
5303
5304 // Generate the output file
5305 CppCommon::Path output = path / (struct_name + ".go");
5306 WriteBegin();
5307
5308 // Generate header
5309 GenerateHeader(CppCommon::Path(_input).filename().string());
5310
5311 // Generate package
5312 WriteLine();
5313 WriteLineIndent("package " + *p->name);
5314
5315 // Generate imports
5316 WriteLine();
5317 WriteLineIndent("import \"fmt\"");
5318 WriteLineIndent("import \"strconv\"");
5319 WriteLineIndent("import \"strings\"");
5320 GenerateImports(p);
5321
5322 // Generate workaround for Go unused imports issue
5323 WriteLine();
5324 WriteLineIndent("// Workaround for Go unused imports issue");
5325 WriteLineIndent("var _ = fmt.Print");
5326 WriteLineIndent("var _ = strconv.FormatInt");
5327
5328 std::string base_type = (s->base && !s->base->empty()) ? ConvertTypeName(*s->base, false) : "";
5329
5330 // Generate struct key
5331 WriteLine();
5332 WriteLineIndent("// " + struct_name + " key");
5333 WriteLineIndent("type " + struct_name + "Key struct {");
5334 Indent(1);
5335 if (!base_type.empty())
5336 WriteLineIndent(base_type + "Key");
5337 if (s->body)
5338 for (const auto& field : s->body->fields)
5339 if (field->keys)
5340 WriteLineIndent(ConvertToUpper(*field->name) + " " + ConvertTypeName(*field));
5341 Indent(-1);
5342 WriteLineIndent("}");
5343
5344 // Generate struct key String() method
5345 WriteLine();
5346 WriteLineIndent("// Convert " + struct_name + " flags key to string");
5347 WriteLineIndent("func (k *" + struct_name + "Key) String() string {");
5348 Indent(1);
5349 WriteLineIndent("var sb strings.Builder");
5350 WriteLineIndent("sb.WriteString(\"" + *s->name + "Key(\")");
5351 bool first = true;
5352 if (!base_type.empty())
5353 {
5354 WriteLineIndent("sb.WriteString(k." + ConvertBaseName(base_type) + "Key.String())");
5355 first = false;
5356 }
5357 if (s->body)

Callers

nothing calls this directly

Calls 2

stringMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected