Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/cmd/memogen/memogen.go
2070 views
1
// this small cli tool is specific for those functions with arbitrary parameters and with result-error tuple as return values
2
// func(x,y) => result, error
3
// it works by creating a new memoized version of the functions in the same path as memo.original.file.go
4
// some parts are specific for nuclei and hardcoded within the template
5
package main
6
7
import (
8
"flag"
9
"io/fs"
10
"log"
11
"os"
12
"path/filepath"
13
14
"github.com/projectdiscovery/utils/memoize"
15
stringsutil "github.com/projectdiscovery/utils/strings"
16
)
17
18
var (
19
srcPath = flag.String("src", "", "nuclei source path")
20
tplPath = flag.String("tpl", "function.tpl", "template path")
21
tplSrc []byte
22
)
23
24
func main() {
25
flag.Parse()
26
27
var err error
28
tplSrc, err = os.ReadFile(*tplPath)
29
if err != nil {
30
log.Fatal(err)
31
}
32
33
err = filepath.Walk(*srcPath, walk)
34
if err != nil {
35
log.Fatal(err)
36
}
37
}
38
39
func walk(path string, info fs.FileInfo, err error) error {
40
if info.IsDir() {
41
return nil
42
}
43
44
if err != nil {
45
return err
46
}
47
48
ext := filepath.Ext(path)
49
base := filepath.Base(path)
50
51
if !stringsutil.EqualFoldAny(ext, ".go") {
52
return nil
53
}
54
55
basePath := filepath.Dir(path)
56
outPath := filepath.Join(basePath, "memo."+base)
57
58
// filename := filepath.Base(path)
59
data, err := os.ReadFile(path)
60
if err != nil {
61
return err
62
}
63
if !stringsutil.ContainsAnyI(string(data), "@memo") {
64
return nil
65
}
66
log.Println("processing:", path)
67
out, err := memoize.Src(string(tplSrc), path, data, "")
68
if err != nil {
69
return err
70
}
71
72
if err := os.WriteFile(outPath, out, os.ModePerm); err != nil {
73
return err
74
}
75
76
return nil
77
}
78
79