diff --git a/httptransport/openapigen.go b/httptransport/openapigen.go index 1a3fd7b4c7..479620c6da 100644 --- a/httptransport/openapigen.go +++ b/httptransport/openapigen.go @@ -11,13 +11,27 @@ import ( "fmt" "go/ast" "go/format" + "go/parser" "go/token" "log" "os" + "path/filepath" + "strings" "gopkg.in/yaml.v3" ) +const template = ` +// Code generated by openapigen.go DO NOT EDIT. + +package main + +const ( + _openapiJSON = "" + _openapiJSONEtag = "" +) +` + func main() { inFile := flag.String("in", "../openapi.yaml", "input YAML file") outFile := flag.String("out", "discoveryhandler_gen.go", "output go file") @@ -43,51 +57,39 @@ func main() { ck := sha256.Sum256(embed) fs := token.NewFileSet() - // Make up a some file offsets to get things to not mash together so - // badly... - gf := fs.AddFile(*outFile, -1, 1024) - gf.AddLine(48) - gf.AddLine(49) - gf.AddLine(98) - gf.AddLine(99) - gend := &ast.File{ - Package: gf.Pos(50), - Name: ast.NewIdent(*pkgName), - Comments: []*ast.CommentGroup{ - {List: []*ast.Comment{&ast.Comment{ - Slash: gf.Pos(0), - Text: `// Code generated by openapigen.go DO NOT EDIT.`, - }}}}, - Decls: []ast.Decl{ - &ast.GenDecl{ - Tok: token.CONST, - TokPos: gf.Pos(100), - Specs: []ast.Spec{ - &ast.ValueSpec{ - Names: []*ast.Ident{ast.NewIdent("_openapiJSON")}, - Values: []ast.Expr{&ast.BasicLit{ - Kind: token.STRING, - Value: fmt.Sprintf("%#q", string(embed)), - }}, - }, - &ast.ValueSpec{ - Names: []*ast.Ident{ast.NewIdent("_openapiJSONEtag")}, - Values: []ast.Expr{&ast.BasicLit{ - Kind: token.STRING, - Value: fmt.Sprintf("`\"%x\"`", ck), - }}, - }, - }, - }, - }, + file, err := parser.ParseFile(fs, filepath.Base(*outFile), strings.NewReader(template), parser.ParseComments) + if err != nil { + log.Fatal(err) } + ast.Inspect(file, func(n ast.Node) bool { + switch x := n.(type) { + case *ast.File: + x.Name = ast.NewIdent(*pkgName) + case *ast.ValueSpec: + id := x.Names[0] + var v string + switch id.Name { + case "_openapiJSON": + v = fmt.Sprintf("%#q", string(embed)) + case "_openapiJSONEtag": + v = fmt.Sprintf("`\"%x\"`", ck) + default: + return true + } + x.Values = []ast.Expr{&ast.BasicLit{ + Kind: token.STRING, + Value: v, + }} + } + return true + }) outF, err := os.OpenFile(*outFile, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) if err != nil { log.Fatal(err) } defer outF.Close() - if err := format.Node(outF, fs, gend); err != nil { + if err := format.Node(outF, fs, file); err != nil { log.Fatal(err) } }