Expand generated code, add routes list

This commit is contained in:
2024-11-26 17:12:39 -05:00
parent 4211bb3892
commit 48678912f0
11 changed files with 5442 additions and 449 deletions

File diff suppressed because it is too large Load Diff

View File

@ -19,6 +19,13 @@ const (
const tmplParseFuncs = `package ` + packageName + `
import (
"context"
"io"
"net/http"
"reflect"
)
// Generated map of Parse functions to support
// dynamic reflection upon parser functions
var ParseFunctionsMap = map[string]interface{}{
@ -28,6 +35,23 @@ var ParseFunctionsMap = map[string]interface{}{
}
`
type FunctionParamInfo struct {
FunctionName string
Params []string
}
const tmplFuncParams = `
var FunctionParams = map[string][]reflect.Type{
{{- range .}}
"{{ .FunctionName }}": {
{{- range .Params }}
reflect.TypeOf((*{{ . }})(nil)).Elem(),
{{- end }}
},
{{- end}}
}
`
func main() {
// Parse the package
fset := token.NewFileSet()
@ -37,15 +61,44 @@ func main() {
return
}
// Collect function names that start with "Parse"
var functions []string
parseFunctions := make([]string, 0)
functionParams := make([]FunctionParamInfo, 0)
for _, pkg := range node {
for _, file := range pkg.Files {
for _, decl := range file.Decls {
if funcDecl, ok := decl.(*ast.FuncDecl); ok {
// Load up Parse functions
if strings.HasPrefix(funcDecl.Name.Name, "Parse") {
// Add function name to the list
functions = append(functions, funcDecl.Name.Name)
parseFunctions = append(parseFunctions, funcDecl.Name.Name)
}
if strings.HasPrefix(funcDecl.Name.Name, "Status") {
continue
}
// Load up params for all functions
if funcDecl.Name.IsExported() {
paramTypes := make([]string, 0)
if funcDecl.Type.Params != nil {
for _, param := range funcDecl.Type.Params.List {
// Convert the type expression to a string representation
typeExpr := param.Type
typeStr := exprToString(typeExpr)
if typeStr == "" {
continue
}
// Append the type once for each name in the parameter
for range param.Names {
paramTypes = append(paramTypes, typeStr)
}
}
}
functionParams = append(functionParams, FunctionParamInfo{
FunctionName: funcDecl.Name.String(),
Params: paramTypes,
})
}
}
}
@ -60,12 +113,38 @@ func main() {
}
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 {
// Execute the template for parse funcs and write to the file
parseFuncsTpl := template.Must(template.New("mapTemplate").Parse(tmplParseFuncs))
if err := parseFuncsTpl.Execute(mapFile, parseFunctions); err != nil {
fmt.Println("Error generating Go code:", err)
return
}
// Execute the template for func params and write to the file
funcParamsTpl := template.Must(template.New("paramsTemplate").Parse(tmplFuncParams))
if err := funcParamsTpl.Execute(mapFile, functionParams); err != nil {
fmt.Println("Error generating FunctionParams:", err)
return
}
fmt.Printf("%s has been generated successfully!\n", mapperFile)
}
func exprToString(expr ast.Expr) string {
switch t := expr.(type) {
case *ast.Ident:
return t.Name // Simple type like "int" or "string"
case *ast.ArrayType:
return "[]" + exprToString(t.Elt) // Array type
case *ast.StarExpr:
return exprToString(t.X) // Pointer type
case *ast.SelectorExpr:
return fmt.Sprintf("%s.%s", exprToString(t.X), t.Sel.Name) // Qualified type like "pkg.Type"
case *ast.FuncType:
return "func" // Handle function types minimally
case *ast.Ellipsis:
return ""
default:
return fmt.Sprintf("%T", expr) // Fallback to the type's Go type
}
}