generate.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "text/template"
  7. )
  8. const permsTpl = `// Code generated by permgen. DO NOT EDIT.
  9. package perms
  10. import "code.clickto.dev/weiym/permlib"
  11. // Perms 权限声明列表,启动时调用 engine.RegisterPerms(Perms) 同步到权限系统
  12. var Perms = []permlib.PermDecl{
  13. {{- range .Perms}}
  14. {Code: {{printf "%q" .Code}}, Name: {{printf "%q" .Name}}},
  15. {{- end}}
  16. }
  17. // RoutePerms 路由-权限映射,启动时调用 engine.RegisterRoutePerms(RoutePerms)
  18. var RoutePerms = []permlib.RoutePermDecl{
  19. {{- range .RoutePerms}}
  20. {Method: {{printf "%q" .Method}}, Path: {{printf "%q" .Path}}, PermCode: {{printf "%q" .PermCode}}, DataCode: {{printf "%q" .DataCode}}},
  21. {{- end}}
  22. }
  23. // FieldPerms 字段权限映射,启动时调用 engine.RegisterFieldPerms(FieldPerms)
  24. var FieldPerms = map[string]permlib.FieldPermMap{
  25. {{- range $key, $fm := .FieldPerms}}
  26. {{printf "%q" $key}}: {
  27. {{- if $fm.Request}}
  28. Request: map[string]string{
  29. {{- range $field, $code := $fm.Request}}
  30. {{printf "%q" $field}}: {{printf "%q" $code}},
  31. {{- end}}
  32. },
  33. {{- end}}
  34. {{- if $fm.Response}}
  35. Response: map[string]string{
  36. {{- range $field, $code := $fm.Response}}
  37. {{printf "%q" $field}}: {{printf "%q" $code}},
  38. {{- end}}
  39. },
  40. {{- end}}
  41. },
  42. {{- end}}
  43. }
  44. `
  45. type templateData struct {
  46. Perms []permDecl
  47. RoutePerms []routePermDecl
  48. FieldPerms map[string]fieldPermMap
  49. }
  50. func generate(result *collectResult, dir string) error {
  51. outDir := filepath.Join(dir, "internal", "perms")
  52. if err := os.MkdirAll(outDir, 0755); err != nil {
  53. return fmt.Errorf("创建目录失败: %w", err)
  54. }
  55. outFile := filepath.Join(outDir, "perms.go")
  56. tpl, err := template.New("perms").Funcs(template.FuncMap{
  57. "printf": fmt.Sprintf,
  58. }).Parse(permsTpl)
  59. if err != nil {
  60. return fmt.Errorf("解析模板失败: %w", err)
  61. }
  62. f, err := os.Create(outFile)
  63. if err != nil {
  64. return fmt.Errorf("创建文件失败: %w", err)
  65. }
  66. defer f.Close()
  67. data := templateData{
  68. Perms: result.perms,
  69. RoutePerms: result.routePerms,
  70. FieldPerms: result.fieldPerms,
  71. }
  72. if err := tpl.Execute(f, data); err != nil {
  73. return fmt.Errorf("生成文件失败: %w", err)
  74. }
  75. fmt.Fprintf(os.Stdout, "permgen: generated %s (%d perms, %d routes, %d field maps)\n",
  76. outFile,
  77. len(result.perms),
  78. len(result.routePerms),
  79. len(result.fieldPerms),
  80. )
  81. return nil
  82. }