-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
117 lines (94 loc) · 2.47 KB
/
main.go
File metadata and controls
117 lines (94 loc) · 2.47 KB
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package main
import (
"bytes"
"fmt"
"log"
"os"
"path"
"strings"
"text/template"
"github.com/itzloop/misura/config"
"github.com/itzloop/misura/wrapper"
"embed"
)
var (
version = "v0.0.9-bf7ba05"
commit = "bf7ba053f15ab549f26950d8b6ba20facfbc395c"
builtBy = "golang"
date = "2024-06-16 23:36:08+00:00"
progDesc = "misura (Italian for measure) gives insight about a golang type by generating a wrapper"
website = "https://sinashabani.dev"
)
//go:embed templates/*.gotmpl
var f embed.FS
//go:embed ascii.txt
var asciiArt string
func versionString() string {
t := template.Must(template.ParseFS(f, "templates/version.gotmpl"))
buf := bytes.Buffer{}
t.Execute(&buf, map[string]string{
"ASCII": asciiArt,
"ProgDesc": progDesc,
"Website": website,
"ProgVer": version,
"GitCommit": commit,
"BuildDate": date,
"BuiltBy": builtBy,
})
return buf.String()
}
func main() {
cfg := config.NewConfig(os.Args[0])
// error will be handled by flag.ExitOnError
cfg.Parse(os.Args[1:])
if *cfg.ShowVersion {
fmt.Print(versionString())
os.Exit(0)
}
if len(*cfg.Measures) == 0 {
*cfg.Measures = append(*cfg.Measures, "all")
}
if os.Getenv("GOFILE") != "" {
*cfg.FilePath = os.Getenv("GOFILE")
fmt.Println("using GOFILE=", *cfg.FilePath)
}
fmt.Printf("running command: %s\n", strings.Join(os.Args, " "))
cwd, err := os.Getwd()
if err != nil {
panic(err)
}
*cfg.FilePath = path.Join(cwd, *cfg.FilePath)
fmt.Printf("generating wrapper for '%s'\n", *cfg.FilePath)
generator, err := wrapper.NewWrapperGenerator(wrapper.GeneratorOpts{
Metrics: []string(*cfg.Measures),
FormatImports: *cfg.FormatImports,
Template: templates(),
})
if err != nil {
log.Fatalf("failed to create WrapperGenerator: %v\n", err)
}
// parse comments for //misura:<Type>
cv, err := wrapper.NewCommentVisitor(*cfg.FilePath)
if err != nil {
log.Fatalf("failed to create CommentVisitor: %v\n", err)
}
err = cv.Walk()
if err != nil {
log.Fatalf("failed to walk over ast: %v\n", err)
}
visitor, err := wrapper.NewTypeVisitor(generator, wrapper.TypeVisitorOpts{
FilePath: *cfg.FilePath,
Targets: append([]string(*cfg.Types), cv.Targets()...),
})
if err != nil {
log.Fatalf("failed to create TypeVisitor: %v\n", err)
}
err = visitor.Walk()
if err != nil {
log.Fatalf("failed to walk over ast: %v\n", err)
}
}
func templates() *template.Template {
tmpl := template.New("wrapper")
return template.Must(tmpl.ParseFS(f, "templates/*.gotmpl"))
}