krystal/go-katapult

View on GitHub
tools/codegen/gen/generator.go

Summary

Maintainability
A
0 mins
Test Coverage
package gen

import (
    "bytes"
    "encoding/json"
    "os"
    "os/exec"
    "strings"

    "github.com/dave/jennifer/jen"
    "github.com/hashicorp/go-hclog"
    "github.com/krystal/go-katapult/apischema"
    "mvdan.cc/gofumpt/format"
)

type Generator struct {
    PkgName           string
    OutputDir         string
    SchemaIncludePath string
    SchemaExcludePath string
    SchemaFiles       []string

    Logger hclog.Logger
}

func (g *Generator) newFile(packageName string) *jen.File {
    f := jen.NewFile(packageName)
    f.ImportName("github.com/krystal/go-katapult", "katapult")
    f.ImportName("github.com/krystal/go-katapult/core", "core")

    return f
}

func (g *Generator) loadSchema(filename string) (*apischema.Schema, error) {
    schemaFile, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    schema := &apischema.Schema{}
    err = json.NewDecoder(schemaFile).Decode(schema)
    if err != nil {
        return nil, err
    }

    return schema, nil
}

func (g *Generator) katapult(name string) *jen.Statement {
    base := &jen.Statement{}
    if strings.HasPrefix(name, "*") {
        base = jen.Id("*")
        name = name[1:]
    }

    if g.PkgName == "katapult" {
        return base.Id(name)
    }

    return base.Qual("github.com/krystal/go-katapult", name)
}

func (g *Generator) core(name string) *jen.Statement {
    base := &jen.Statement{}
    if strings.HasPrefix(name, "*") {
        base = jen.Id("*")
        name = name[1:]
    }

    if g.PkgName == "core" {
        return base.Id(name)
    }

    return base.Qual("github.com/krystal/go-katapult/core", name)
}

func (g *Generator) render(f *jen.File) ([]byte, error) {
    var langVersion string
    out, err := exec.Command(
        "go", "list", "-m", "-f", "{{.GoVersion}}",
    ).Output()
    out = bytes.TrimSpace(out)
    if err == nil && len(out) > 0 {
        langVersion = string(out)
    }

    var buf bytes.Buffer
    err = f.Render(&buf)
    if err != nil {
        return nil, err
    }

    b, err := format.Source(buf.Bytes(), format.Options{
        LangVersion: langVersion,
        ExtraRules:  true,
    })
    if err != nil {
        return nil, err
    }

    return b, nil
}