-
Notifications
You must be signed in to change notification settings - Fork 5
/
generator.go
132 lines (100 loc) · 3.01 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package repo
import (
"fmt"
"path"
"github.com/vmkteam/mfd-generator/mfd"
"github.com/dizzyfool/genna/generators/base"
"github.com/spf13/cobra"
)
const (
mfdFlag = "mfd"
pkgFlag = "package"
nsFlag = "namespaces"
repoTemplateFlag = "repo-tmpl"
)
// CreateCommand creates generator command
func CreateCommand() *cobra.Command {
return base.CreateCommand("repo", "Create repo from xml", New())
}
// Generator represents repo generator
type Generator struct {
options Options
}
// New creates repo generator
func New() *Generator {
return &Generator{}
}
// AddFlags adds flags to command
func (g *Generator) AddFlags(command *cobra.Command) {
flags := command.Flags()
flags.SortFlags = false
flags.StringP(base.Output, "o", "", "output dir path")
if err := command.MarkFlagRequired(base.Output); err != nil {
panic(err)
}
flags.StringP(mfdFlag, "m", "", "mfd file path")
if err := command.MarkFlagRequired(mfdFlag); err != nil {
panic(err)
}
flags.StringP(pkgFlag, "p", "", "package name that will be used in golang files. if not set - last element of output path will be used")
flags.StringSliceP(nsFlag, "n", []string{}, "namespaces to generate. separate by comma\n")
flags.String(repoTemplateFlag, "", "path to repo custom template\n")
}
// ReadFlags read flags from command
func (g *Generator) ReadFlags(command *cobra.Command) error {
var err error
flags := command.Flags()
if g.options.Output, err = flags.GetString(base.Output); err != nil {
return err
}
if g.options.MFDPath, err = flags.GetString(mfdFlag); err != nil {
return err
}
if g.options.Namespaces, err = flags.GetStringSlice(nsFlag); err != nil {
return err
}
if g.options.Package, err = flags.GetString(pkgFlag); err != nil {
return err
}
if g.options.Package == "" {
g.options.Package = path.Base(g.options.Output)
}
if g.options.RepoTemplatePath, err = flags.GetString(repoTemplateFlag); err != nil {
return err
}
g.options.Def()
return nil
}
// Generate runs generator
func (g *Generator) Generate() error {
// loading project from file
project, err := mfd.LoadProject(g.options.MFDPath, false, 0)
if err != nil {
return err
}
// validate names
if err := project.ValidateNames(); err != nil {
return err
}
g.options.GoPGVer = project.GoPGVer
g.options.CustomTypes = project.CustomTypes
if len(g.options.Namespaces) == 0 {
g.options.Namespaces = project.NamespaceNames
}
repoTemplate, err := mfd.LoadTemplate(g.options.RepoTemplatePath, repoDefaultTemplate)
if err != nil {
return fmt.Errorf("load repo template error: %w", err)
}
for _, namespace := range g.options.Namespaces {
// generating each namespace in separate file
if ns := project.Namespace(namespace); ns != nil {
// getting file name without dots
output := path.Join(g.options.Output, mfd.GoFileName(namespace)+".go")
data := PackNamespace(ns, g.options)
if _, err := mfd.FormatAndSave(data, output, repoTemplate, true); err != nil {
return fmt.Errorf("generate repo %s error: %w", namespace, err)
}
}
}
return nil
}