-
Notifications
You must be signed in to change notification settings - Fork 5
/
generator.go
105 lines (91 loc) · 2.54 KB
/
generator.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
97
98
99
100
101
102
103
104
105
package main
import (
"embed"
"fmt"
"os"
"path/filepath"
"strings"
"text/template"
"github.com/dipdup-net/go-lib/cmd/tezgen/types"
"github.com/dipdup-net/go-lib/tzkt/data"
"github.com/iancoleman/strcase"
)
type templateContext struct {
PackageName string
TypeName string
EntrypointTypes map[string]types.EntrypointData
BigMaps map[string]types.BigMapData
Contract string
}
var (
//go:embed template/*.tmpl
templates embed.FS
)
// Generate -
func Generate(schema data.ContractJSONSchema, name, contract, dest string) error {
if dest == "" {
output, err := os.Getwd()
if err != nil {
return err
}
dest = output
}
destDir := filepath.Join(dest, strcase.ToSnake(name))
if err := os.MkdirAll(destDir, 0755); err != nil {
return err
}
packageName := strings.ToLower(strcase.ToLowerCamel(name))
result, err := generateContractTypes(schema, packageName, destDir)
if err != nil {
return err
}
if err := generateContractObject(packageName, contract, destDir, result); err != nil {
return err
}
return nil
}
func generateContractObject(name, contract, dest string, result types.ContractTypeResult) error {
className := strcase.ToCamel(name)
return generateFromTemplate("contract", dest, templateContext{
PackageName: result.PackageName,
TypeName: className,
Contract: contract,
EntrypointTypes: result.Entrypoints,
BigMaps: result.BigMaps,
})
}
func generateContractTypes(schema data.ContractJSONSchema, packageName, dest string) (types.ContractTypeResult, error) {
result, err := types.GenerateContractTypes(schema, packageName)
if err != nil {
return result, err
}
f, err := os.OpenFile(filepath.Join(dest, "contract_types.go"), os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
return result, err
}
if err := result.File.Render(f); err != nil {
return result, err
}
defer f.Close()
return result, nil
}
func generateFromTemplate(templateFileName, dest string, ctx interface{}) error {
tmpl, err := template.New("").Funcs(template.FuncMap{
"ToLower": strings.ToLower,
"TrimStorage": func(x string) string {
return strings.TrimPrefix(x, "storage.")
},
}).ParseFS(templates, "template/*")
if err != nil {
return err
}
targetFile := filepath.Join(dest, fmt.Sprintf("%s.go", templateFileName))
templateFile, err := os.OpenFile(targetFile, os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
return err
}
if err := tmpl.ExecuteTemplate(templateFile, fmt.Sprintf("%s.tmpl", templateFileName), ctx); err != nil {
return err
}
return templateFile.Close()
}