eia-api-go/api/funcmapper/funcmapper.go

72 lines
1.6 KiB
Go

package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"os"
"strings"
"text/template"
)
// The package path you want to scan for functions
const (
packagePath = "api/" // Update this to your package path
packageName = "eiaapi"
mapperFile = "api/eiaapi_funcmap.gen.go"
)
const tmplParseFuncs = `package ` + packageName + `
// Generated map of Parse functions to support
// dynamic reflection upon parser functions
var ParseFunctionsMap = map[string]interface{}{
{{- range .}}
"{{ . }}": {{ . }},
{{- end}}
}
`
func main() {
// Parse the package
fset := token.NewFileSet()
node, err := parser.ParseDir(fset, packagePath, nil, parser.ParseComments)
if err != nil {
fmt.Println("Error parsing package:", err)
return
}
// Collect function names that start with "Parse"
var functions []string
for _, pkg := range node {
for _, file := range pkg.Files {
for _, decl := range file.Decls {
if funcDecl, ok := decl.(*ast.FuncDecl); ok {
if strings.HasPrefix(funcDecl.Name.Name, "Parse") {
// Add function name to the list
functions = append(functions, funcDecl.Name.Name)
}
}
}
}
}
// Generate Go code for the map
mapFile, err := os.Create(mapperFile)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer mapFile.Close()
// Execute the template and write to the file
t := template.Must(template.New("mapTemplate").Parse(tmplParseFuncs))
if err := t.Execute(mapFile, functions); err != nil {
fmt.Println("Error generating Go code:", err)
return
}
fmt.Printf("%s has been generated successfully!\n", mapperFile)
}