Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/cmd/docgen/docgen.go
2070 views
1
package main
2
3
import (
4
"bytes"
5
"log"
6
"os"
7
"reflect"
8
"regexp"
9
10
"github.com/invopop/jsonschema"
11
"github.com/projectdiscovery/nuclei/v3/pkg/templates"
12
"github.com/projectdiscovery/nuclei/v3/pkg/utils/json"
13
)
14
15
var pathRegex = regexp.MustCompile(`github\.com/projectdiscovery/nuclei/v3/(?:internal|pkg)/(?:.*/)?([A-Za-z.]+)`)
16
17
func writeToFile(filename string, data []byte) {
18
file, err := os.Create(filename)
19
if err != nil {
20
log.Fatalf("Could not create file %s: %s\n", filename, err)
21
}
22
defer func() {
23
_ = file.Close()
24
}()
25
26
_, err = file.Write(data)
27
if err != nil {
28
log.Fatalf("Could not write to file %s: %s\n", filename, err)
29
}
30
}
31
32
func main() {
33
if len(os.Args) < 3 {
34
log.Fatalf("syntax: %s md-docs-file jsonschema-file\n", os.Args[0])
35
}
36
37
// Generate YAML documentation
38
data, err := templates.GetTemplateDoc().Encode()
39
if err != nil {
40
log.Fatalf("Could not encode docs: %s\n", err)
41
}
42
writeToFile(os.Args[1], data)
43
44
// Generate JSON Schema
45
r := &jsonschema.Reflector{
46
Namer: func(t reflect.Type) string {
47
if t.Kind() == reflect.Slice {
48
return ""
49
}
50
return t.String()
51
},
52
}
53
54
jsonschemaData := r.Reflect(&templates.Template{})
55
56
var buf bytes.Buffer
57
encoder := json.NewEncoder(&buf)
58
encoder.SetIndent("", " ")
59
if err := encoder.Encode(jsonschemaData); err != nil {
60
log.Fatalf("Could not encode JSON schema: %s\n", err)
61
}
62
63
schema := pathRegex.ReplaceAllString(buf.String(), "$1")
64
writeToFile(os.Args[2], []byte(schema))
65
}
66
67