complete route generator

This commit is contained in:
Rogee
2025-09-11 22:43:52 +08:00
parent f2a8b9876e
commit 82c94d5a29

View File

@@ -16,35 +16,40 @@ type RenderBuildOpts struct {
} }
func buildRenderData(opts RenderBuildOpts) (RenderData, error) { func buildRenderData(opts RenderBuildOpts) (RenderData, error) {
rd := RenderData{ rd := RenderData{
PackageName: opts.PackageName, PackageName: opts.PackageName,
ProjectPackage: opts.ProjectPackage, ProjectPackage: opts.ProjectPackage,
Imports: []string{}, Imports: []string{},
Controllers: []string{}, Controllers: []string{},
Routes: make(map[string][]Router), Routes: make(map[string][]Router),
RouteGroups: []string{}, RouteGroups: []string{},
} }
imports := []string{} imports := []string{}
controllers := []string{} controllers := []string{}
// Track if any param uses model lookup, which requires the field package.
needsFieldImport := false
for _, route := range opts.Routes { for _, route := range opts.Routes {
imports = append(imports, route.Imports...) imports = append(imports, route.Imports...)
controllers = append(controllers, fmt.Sprintf("%s *%s", strcase.ToLowerCamel(route.Name), route.Name)) controllers = append(controllers, fmt.Sprintf("%s *%s", strcase.ToLowerCamel(route.Name), route.Name))
for _, action := range route.Actions { for _, action := range route.Actions {
funcName := fmt.Sprintf("Func%d", len(action.Params)) funcName := fmt.Sprintf("Func%d", len(action.Params))
if action.HasData { if action.HasData {
funcName = "Data" + funcName funcName = "Data" + funcName
} }
params := lo.FilterMap(action.Params, func(item ParamDefinition, _ int) (string, bool) { params := lo.FilterMap(action.Params, func(item ParamDefinition, _ int) (string, bool) {
tok := buildParamToken(item) tok := buildParamToken(item)
if tok == "" { if tok == "" {
return "", false return "", false
} }
return tok, true if item.Model != "" {
}) needsFieldImport = true
}
return tok, true
})
rd.Routes[route.Name] = append(rd.Routes[route.Name], Router{ rd.Routes[route.Name] = append(rd.Routes[route.Name], Router{
Method: strcase.ToCamel(action.Method), Method: strcase.ToCamel(action.Method),
@@ -55,13 +60,18 @@ func buildRenderData(opts RenderBuildOpts) (RenderData, error) {
Params: params, Params: params,
}) })
} }
} }
// de-dup and sort imports/controllers for stable output // Add field import if any model lookups are used
rd.Imports = lo.Uniq(imports) if needsFieldImport {
sort.Strings(rd.Imports) imports = append(imports, `field "go.ipao.vip/gen/field"`)
rd.Controllers = lo.Uniq(controllers) }
sort.Strings(rd.Controllers)
// de-dup and sort imports/controllers for stable output
rd.Imports = lo.Uniq(imports)
sort.Strings(rd.Imports)
rd.Controllers = lo.Uniq(controllers)
sort.Strings(rd.Controllers)
// stable order for route groups and entries // stable order for route groups and entries
for k := range rd.Routes { for k := range rd.Routes {