| 5298 | } |
| 5299 | |
| 5300 | void 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) |