-
Notifications
You must be signed in to change notification settings - Fork 10
/
generator.go
129 lines (106 loc) · 2.95 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
package genswagger
import (
"encoding/json"
"flag"
"fmt"
"os"
"path/filepath"
yaml "gopkg.in/yaml.v2"
"github.com/shogo82148/goa-v1/design"
"github.com/shogo82148/goa-v1/goagen/codegen"
"github.com/shogo82148/goa-v1/goagen/utils"
)
//NewGenerator returns an initialized instance of a JavaScript Client Generator
func NewGenerator(options ...Option) *Generator {
g := &Generator{}
for _, option := range options {
option(g)
}
return g
}
// Generator is the swagger code generator.
type Generator struct {
API *design.APIDefinition // The API definition
OutDir string // Path to output directory
genfiles []string // Generated files
}
// Generate is the generator entry point called by the meta generator.
func Generate() (files []string, err error) {
var (
outDir, toolDir, target, ver string
notool, regen bool
)
set := flag.NewFlagSet("swagger", flag.PanicOnError)
set.StringVar(&outDir, "out", "", "")
set.StringVar(&ver, "version", "", "")
set.String("design", "", "")
set.StringVar(&toolDir, "tooldir", "tool", "")
set.BoolVar(¬ool, "notool", false, "")
set.StringVar(&target, "pkg", "app", "")
set.BoolVar(®en, "regen", false, "")
set.Bool("force", false, "")
set.Bool("notest", false, "")
set.Parse(os.Args[1:])
if err := codegen.CheckVersion(ver); err != nil {
return nil, err
}
g := &Generator{OutDir: outDir, API: design.Design}
return g.Generate()
}
// Generate produces the skeleton main.
func (g *Generator) Generate() (_ []string, err error) {
if g.API == nil {
return nil, fmt.Errorf("missing API definition, make sure design is properly initialized")
}
go utils.Catch(nil, func() { g.Cleanup() })
defer func() {
if err != nil {
g.Cleanup()
}
}()
s, err := New(g.API)
if err != nil {
return nil, err
}
swaggerDir := filepath.Join(g.OutDir, "swagger")
os.RemoveAll(swaggerDir)
if err = os.MkdirAll(swaggerDir, 0755); err != nil {
return nil, err
}
g.genfiles = append(g.genfiles, swaggerDir)
// JSON
rawJSON, err := json.Marshal(s)
if err != nil {
return nil, err
}
swaggerFile := filepath.Join(swaggerDir, "swagger.json")
if err := os.WriteFile(swaggerFile, rawJSON, 0644); err != nil {
return nil, err
}
g.genfiles = append(g.genfiles, swaggerFile)
// YAML
rawYAML, err := jsonToYAML(rawJSON)
if err != nil {
return nil, err
}
swaggerFile = filepath.Join(swaggerDir, "swagger.yaml")
if err := os.WriteFile(swaggerFile, rawYAML, 0644); err != nil {
return nil, err
}
g.genfiles = append(g.genfiles, swaggerFile)
return g.genfiles, nil
}
// Cleanup removes all the files generated by this generator during the last invocation of Generate.
func (g *Generator) Cleanup() {
for _, f := range g.genfiles {
os.Remove(f)
}
g.genfiles = nil
}
func jsonToYAML(rawJSON []byte) ([]byte, error) {
var yamlSource interface{}
if err := yaml.Unmarshal(rawJSON, &yamlSource); err != nil {
return nil, err
}
return yaml.Marshal(yamlSource)
}