-
Notifications
You must be signed in to change notification settings - Fork 21
/
generator.go
104 lines (97 loc) · 2.29 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
package shared
import (
"fmt"
"os"
"path/filepath"
"sort"
"github.com/ezbuy/ezorm/v2/internal/generator"
"github.com/ezbuy/ezorm/v2/internal/parser"
)
var _ generator.Generator = (*Generator)(nil)
// Generator is a generator that supports mysql and mongo drivers
// which share the same metadata format.
type Generator struct{}
func (g *Generator) Generate(meta generator.TMetadata) error {
drivers := make(map[string][]*Obj)
var dbs []*Obj
if err := meta.Meta.Each(func(tn generator.TemplateName, s generator.Schema) error {
d, err := s.GetDriver()
if err != nil {
return fmt.Errorf("template: %s: %q", string(tn), err)
}
var o *Obj
ns := meta.Namespace
if meta.Namespace == "" {
ns = meta.Pkg
}
switch d {
case parser.MongoGeneratorName:
o = &Obj{
Namespace: ns,
GoPackage: meta.Pkg,
Name: string(tn),
}
if err := o.Read(string(tn), s); err != nil {
return err
}
case parser.MySQLGeneratorName:
o = &Obj{
Namespace: ns,
GoPackage: meta.Pkg,
Name: string(tn),
}
if err := o.Read(string(tn), s); err != nil {
return err
}
dbs = append(dbs, o)
default:
return nil
}
for _, gt := range o.GetGenTypes() {
fileAbsPath := filepath.Join(meta.Output, fmt.Sprintf("gen_%s_%s.go", string(tn), gt))
if err := render(fileAbsPath, gt, o); err != nil {
return err
}
}
drivers[d] = append(drivers[d], o)
return nil
}); err != nil {
return err
}
sort.SliceStable(dbs, func(i, j int) bool {
return dbs[i].Name < dbs[j].Name
})
if len(dbs) > 0 {
if err := render(
filepath.Join(meta.Output, "create_mysql.sql"),
"mysql_script",
dbs); err != nil {
return err
}
}
for _, d := range drivers {
if len(d) <= 0 {
continue
}
sort.SliceStable(d, func(i, j int) bool {
return d[i].Name < d[j].Name
})
for _, t := range d[0].GetConfigTemplates() {
fileAbsPath := filepath.Join(meta.Output, fmt.Sprintf("gen_%s.go", t))
if err := render(fileAbsPath, t, d); err != nil {
return err
}
}
}
return nil
}
func render(path string, name string, obj any) error {
fd, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
if err != nil {
return err
}
return Tpl.ExecuteTemplate(fd, name, obj)
}
func (g *Generator) DriverName() string {
return "shared_generator"
}