| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package main
- import (
- "fmt"
- "os"
- "path/filepath"
- "strings"
- "text/template"
- )
- const permsTpl = `// Code generated by permgen. DO NOT EDIT.
- package perms
- import "code.clickto.dev/weiym/permlib"
- // Perms 权限声明列表,启动时调用 engine.RegisterPerms(Perms) 同步到权限系统
- var Perms = []permlib.PermDecl{
- {{- range .Perms}}
- {Code: {{printf "%q" .Code}}, Name: {{printf "%q" .Name}}},
- {{- end}}
- }
- // RoutePerms 路由-权限映射,启动时调用 engine.RegisterRoutePerms(RoutePerms)
- var RoutePerms = []permlib.RoutePermDecl{
- {{- range .RoutePerms}}
- {Method: {{printf "%q" .Method}}, Path: {{printf "%q" .Path}}, PermCode: {{printf "%q" .PermCode}}, DataCode: {{printf "%q" .DataCode}}},
- {{- end}}
- }
- // FieldPerms 字段权限映射,启动时调用 engine.RegisterFieldPerms(FieldPerms)
- var FieldPerms = map[string]permlib.FieldPermMap{
- {{- range $key, $fm := .FieldPerms}}
- {{printf "%q" $key}}: {
- {{- if $fm.Request}}
- Request: {{renderFieldNode $fm.Request 2}},
- {{- end}}
- {{- if $fm.Response}}
- Response: {{renderFieldNode $fm.Response 2}},
- {{- end}}
- },
- {{- end}}
- }
- `
- type templateData struct {
- Perms []permDecl
- RoutePerms []routePermDecl
- FieldPerms map[string]*fieldPermMap
- }
- func renderFieldNode(node *fieldNode, indent int) string {
- if node == nil {
- return "nil"
- }
- prefix := strings.Repeat("\t", indent)
- innerPrefix := strings.Repeat("\t", indent+1)
- var b strings.Builder
- b.WriteString("&permlib.FieldNode{\n")
- b.WriteString(innerPrefix + "Fields: map[string]string{")
- if len(node.Fields) > 0 {
- b.WriteString("\n")
- for field, code := range node.Fields {
- b.WriteString(fmt.Sprintf("%s\t%q: %q,\n", innerPrefix, field, code))
- }
- b.WriteString(innerPrefix + "}")
- } else {
- b.WriteString("}")
- }
- b.WriteString(",\n")
- b.WriteString(innerPrefix + "Nested: map[string]*permlib.FieldNode{")
- if len(node.Nested) > 0 {
- b.WriteString("\n")
- for field, child := range node.Nested {
- b.WriteString(fmt.Sprintf("%s\t%q: %s,\n", innerPrefix, field, renderFieldNode(child, indent+2)))
- }
- b.WriteString(innerPrefix + "}")
- } else {
- b.WriteString("}")
- }
- b.WriteString(",\n")
- b.WriteString(prefix + "}")
- return b.String()
- }
- func generate(result *collectResult, dir string) error {
- outDir := filepath.Join(dir, "internal", "perms")
- if err := os.MkdirAll(outDir, 0755); err != nil {
- return fmt.Errorf("创建目录失败: %w", err)
- }
- outFile := filepath.Join(outDir, "perms.go")
- tpl, err := template.New("perms").Funcs(template.FuncMap{
- "printf": fmt.Sprintf,
- "renderFieldNode": renderFieldNode,
- }).Parse(permsTpl)
- if err != nil {
- return fmt.Errorf("解析模板失败: %w", err)
- }
- f, err := os.Create(outFile)
- if err != nil {
- return fmt.Errorf("创建文件失败: %w", err)
- }
- defer f.Close()
- data := templateData{
- Perms: result.perms,
- RoutePerms: result.routePerms,
- FieldPerms: result.fieldPerms,
- }
- if err := tpl.Execute(f, data); err != nil {
- return fmt.Errorf("生成文件失败: %w", err)
- }
- fmt.Fprintf(os.Stdout, "permgen: generated %s (%d perms, %d routes, %d field maps)\n",
- outFile,
- len(result.perms),
- len(result.routePerms),
- len(result.fieldPerms),
- )
- return nil
- }
|