/
main.go
96 lines (78 loc) · 1.6 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Copyright 2023 Juan Pablo Tosso and the OWASP Coraza contributors
// SPDX-License-Identifier: Apache-2.0
package main
import (
"bytes"
_ "embed"
"go/ast"
"go/format"
"go/parser"
"go/token"
"html/template"
"log"
"os"
"strings"
)
//go:embed directivesmap.go.tmpl
var directivesMapTmpl string
type DirectivesMap struct {
Key string
FnName string
}
func main() {
tmpl, err := template.New("directivesmap").Parse(directivesMapTmpl)
if err != nil {
log.Fatal(err)
}
fset := token.NewFileSet()
src, err := os.ReadFile("./directives.go")
if err != nil {
log.Fatal(err)
}
f, err := parser.ParseFile(fset, "directives.go", src, parser.ParseComments)
if err != nil {
log.Fatal(err)
}
dm, err := os.Create("./directivesmap.gen.go")
if err != nil {
log.Fatal(err)
}
directives := []DirectivesMap{}
ast.Inspect(f, func(n ast.Node) bool {
switch fn := n.(type) {
// catching all function declarations
case *ast.FuncDecl:
fnName := fn.Name.String()
if !strings.HasPrefix(fnName, "directive") {
return true
}
directiveName := fnName[9:]
if directiveName == "Include" || directiveName == "Unsupported" {
return true
}
directives = append(directives, DirectivesMap{
Key: strings.ToLower(directiveName),
FnName: fnName,
})
default:
}
return true
})
dmc := bytes.Buffer{}
err = tmpl.Execute(&dmc, directives)
if err != nil {
log.Fatal(err)
}
fdmc, err := format.Source(dmc.Bytes())
if err != nil {
log.Fatal(err)
}
_, err = dm.Write(fdmc)
if err != nil {
log.Fatal(err)
}
err = dm.Close()
if err != nil {
log.Fatal(err)
}
}