@@ -23,21 +23,31 @@ import (
23
23
24
24
const (
25
25
openAPIdefinition = "https://github.com/docusign/eSign-OpenAPI-Specification"
26
- generatorVersion = "20171011 "
26
+ generatorVersion = "20190720 "
27
27
)
28
28
29
29
var (
30
30
basePkg = flag .String ("basepkg" , "github.com/jfcote87/esign" , "root package in gopath" )
31
31
baseDir = flag .String ("src" , "." , "src directory" )
32
32
templDir = flag .String ("template" , "gen-esign/templates" , "directory containing output templates." )
33
33
buildFlag = flag .Bool ("build" , false , "Compile generated packages." )
34
- swaggerFile = flag .String ("swagger_file" , "gen-esign/esignature.rest.swagger-v2.1.json" , "If non-empty, the path to a local file on disk containing the API to generate. Exclusive with setting --api ." )
34
+ swaggerFile = flag .String ("swagger_file" , "gen-esign/esignature.rest.swagger-v2.1.json,gen-esign/esignature.rest.swagger.json " , "If non-empty, comma separated list to local files containing the API version definitions ." )
35
35
skipFormat = flag .Bool ("skip_format" , false , "skip gofmt command" )
36
- version = flag .String ("version" , "v2.1" , "API Version - defaults to v2" )
37
- docprefix = flag .String ("docprefix" , "v2.1/" , "documentation prefix" )
38
36
)
39
37
40
- // main program
38
+ // Version contains parameters for generating an eSignature version
39
+ type Version struct {
40
+ FilePath string // json swagger file
41
+ VersionNm string // Blank or v2 for version 2, v2.1 for version 2.1
42
+ DocPrefix string
43
+ CallVersion string
44
+ Prefix string
45
+ Templates * template.Template // templates
46
+ BaseDir string // source directory
47
+ BasePkg string
48
+ SkipFormat bool
49
+ }
50
+
41
51
func main () {
42
52
flag .Parse ()
43
53
@@ -53,7 +63,139 @@ func main() {
53
63
if err == nil && strings .HasPrefix (* baseDir , "/" ) {
54
64
* baseDir , err = os .Getwd ()
55
65
}
56
- doc , err := getDocument ()
66
+
67
+ if ! strings .HasPrefix (* templDir , "/" ) {
68
+ * templDir = path .Join (* baseDir , * templDir )
69
+ }
70
+ genTemplates , err := template .ParseFiles (path .Join (* templDir , "service.tmpl" ), path .Join (* templDir , "/model.tmpl" ))
71
+ if err != nil {
72
+ log .Fatalf ("Templates: %v" , err )
73
+ }
74
+
75
+ for _ , file := range strings .Split (* swaggerFile , "," ) {
76
+ if err := os .Chdir (* baseDir ); err != nil {
77
+ log .Fatalf ("unable to change director to %s" , * baseDir )
78
+ }
79
+ log .Printf ("Starting %s" , file )
80
+ doc , err := getDocument (file )
81
+ if err != nil {
82
+ log .Fatalf ("unable to open/parse %s: %v" , file , err )
83
+ }
84
+ sort .Sort (doc .Definitions )
85
+
86
+ var filePath string
87
+ var docPrefix string
88
+ var callVersion string
89
+ switch doc .Info .Version {
90
+ case "v2" :
91
+ filePath = "v2/"
92
+ docPrefix = "v2/"
93
+ callVersion = ""
94
+ case "v2.1" :
95
+ filePath = "v2.1/"
96
+ docPrefix = ""
97
+ callVersion = "esign.VersionV21"
98
+ default :
99
+ log .Fatalf ("unknown version %s" , doc .Info .Version )
100
+ }
101
+ log .Printf ("starting %s generation" , doc .Info .Version )
102
+
103
+ v := & Version {
104
+ BasePkg : * basePkg ,
105
+ BaseDir : * baseDir ,
106
+ Templates : genTemplates ,
107
+ VersionNm : doc .Info .Version ,
108
+ DocPrefix : docPrefix ,
109
+ FilePath : filePath ,
110
+ SkipFormat : * skipFormat ,
111
+ CallVersion : callVersion ,
112
+ }
113
+ if err := v .genVersion (doc ); err != nil {
114
+ log .Fatalf ("%v" , err )
115
+ }
116
+ log .Printf ("%s completed" , doc .Info .Version )
117
+
118
+ }
119
+ }
120
+
121
+ func (ver * Version ) genVersion (doc * Document ) error {
122
+ // Put the Definitions (structs) in order
123
+ defMap := make (map [string ]Definition )
124
+ structName := ""
125
+ defList := make ([]Definition , 0 , len (doc .Definitions ))
126
+ // create defMap for lookup later field and parameter
127
+ // lookups. Make certain defList has only unique names.
128
+
129
+ for _ , def := range doc .Definitions {
130
+ defMap ["#/definitions/" + def .ID ] = def
131
+ if structName != def .Name {
132
+ defList = append (defList , def )
133
+ }
134
+ structName = def .Name
135
+ }
136
+
137
+ // generate model.go first
138
+ if err := ver .doModel (defList , defMap ); err != nil {
139
+ return fmt .Errorf ("%v Generating model.go failed: %v" , ver .VersionNm , err )
140
+ }
141
+
142
+ sort .Sort (doc .Operations )
143
+ ops := make (map [string ][]Operation , 0 )
144
+ for _ , op := range doc .Operations {
145
+ if op .Status == "restricted" {
146
+ log .Printf ("Skipping: %s %s" , op .Status , op .OperationID )
147
+ continue
148
+ }
149
+ if op .Service == "" {
150
+ log .Printf ("No service specified: %s" , op .OperationID )
151
+ continue
152
+ }
153
+ if newServiceName , ok := ServiceNameOverride [op .Service ]; ok {
154
+ op .Service = newServiceName
155
+ }
156
+ if ! OperationSkipList [op .OperationID ] {
157
+ if overrideService , ok := serviceOverrides [op .OperationID ]; ok {
158
+ op .Service = overrideService
159
+ }
160
+ opList := ops [op .Service ]
161
+ opList = append (opList , op )
162
+ ops [op .Service ] = opList
163
+ }
164
+ }
165
+ tagDescMap := make (map [string ]string )
166
+ for _ , tag := range doc .DSTags {
167
+ tagDescMap [tag .Name ] = tag .Description
168
+ }
169
+
170
+ serviceTmpl := ver .Templates .Lookup ("service.tmpl" )
171
+ for k , v := range ops {
172
+ log .Printf ("Generating %s" , k )
173
+ descrip , _ := tagDescMap [k ]
174
+
175
+ if err := ver .doPackage (serviceTmpl , k , descrip , v , defMap ); err != nil {
176
+ return fmt .Errorf ("%s generate %s.go failed: %v" , ver .VersionNm , k , err )
177
+ }
178
+ }
179
+ return nil
180
+ }
181
+
182
+ // main program
183
+ /* func main2() {
184
+ flag.Parse()
185
+
186
+ err := os.Chdir(*baseDir)
187
+ if err != nil {
188
+ log.Fatalf("unable to set directory to %s: %v", *baseDir, err)
189
+ }
190
+ if !strings.HasPrefix(*baseDir, "/") {
191
+ if *baseDir, err = os.Getwd(); err != nil {
192
+ log.Fatalf("unable to retrieve working diretory: %v", err)
193
+ }
194
+ }
195
+ if err == nil && strings.HasPrefix(*baseDir, "/") {
196
+ *baseDir, err = os.Getwd()
197
+ }
198
+ doc, err := getDocument(*swaggerFile)
57
199
if err != nil {
58
200
log.Fatalf("%v", err)
59
201
}
@@ -83,7 +225,7 @@ func main() {
83
225
}
84
226
85
227
// generate model.go first
86
- if err := doModel (genTemplates .Lookup ("model.tmpl" ), defList , defMap ); err != nil {
228
+ if err := v. doModel(genTemplates.Lookup("model.tmpl"), defList, defMap); err != nil {
87
229
log.Fatalf("Generating model.go failed: %v", err)
88
230
}
89
231
@@ -123,12 +265,12 @@ func main() {
123
265
log.Fatalf("generate %s.go failed: %v", k, err)
124
266
}
125
267
}
126
- }
268
+ } */
127
269
128
270
// getDocument loads the swagger def file and applies overrides
129
- func getDocument () (* Document , error ) {
271
+ func getDocument (fn string ) (* Document , error ) {
130
272
// Open swagger file and parse
131
- f , err := os .Open (* swaggerFile )
273
+ f , err := os .Open (fn )
132
274
if err != nil {
133
275
return nil , fmt .Errorf ("Unable to open: %v" , err )
134
276
}
@@ -158,35 +300,36 @@ func getDocument() (*Document, error) {
158
300
}
159
301
160
302
// doModel generates the model.go in the model package
161
- func doModel (modelTempl * template.Template , defList []Definition , defMap map [string ]Definition ) error {
303
+ func (ver * Version ) doModel (defList []Definition , defMap map [string ]Definition ) error {
304
+ modelTempl := ver .Templates .Lookup ("model.tmpl" )
162
305
// create model.go
163
- f , err := makePackageFile ("model" ) //os.Create("model.go")
306
+ f , err := ver . makePackageFile ("model" ) //os.Create("model.go")
164
307
if err != nil {
165
308
return err
166
309
}
167
310
defer func () {
168
311
f .Close ()
169
- if err == nil && ! * skipFormat {
312
+ if err == nil && ! ver . SkipFormat {
170
313
exec .Command ("gofmt" , "-s" , "-w" , "model.go" ).Run ()
171
314
}
172
315
}()
173
316
// get field overrides and tab overrides
174
317
fldOverrides := GetFieldOverrides ()
175
- tabDefs := V21TabDefs ( defMap , fldOverrides )
318
+ tabDefs := TabDefs ( ver . VersionNm , defMap , fldOverrides )
176
319
var data = struct {
177
- Definitions []Definition
178
- DefMap map [string ]Definition
179
- FldOverrides map [string ]map [string ]string
180
- CustomCode string
181
- DocPrefix string
182
- VersionPrefix string
320
+ Definitions []Definition
321
+ DefMap map [string ]Definition
322
+ FldOverrides map [string ]map [string ]string
323
+ CustomCode string
324
+ DocPrefix string
325
+ VersionID string
183
326
}{
184
- Definitions : append (tabDefs , defList ... ), // Prepend tab definitions
185
- DefMap : defMap ,
186
- FldOverrides : fldOverrides ,
187
- CustomCode : CustomCode ,
188
- DocPrefix : * docprefix ,
189
- VersionPrefix : * version ,
327
+ Definitions : append (tabDefs , defList ... ), // Prepend tab definitions
328
+ DefMap : defMap ,
329
+ FldOverrides : fldOverrides ,
330
+ CustomCode : CustomCode ,
331
+ DocPrefix : ver . Prefix ,
332
+ VersionID : ver . VersionNm ,
190
333
}
191
334
return modelTempl .Execute (f , data )
192
335
}
@@ -206,13 +349,13 @@ type ExtOperation struct {
206
349
}
207
350
208
351
// doPackage creates a subpackage go file
209
- func doPackage (resTempl * template.Template , serviceName , description string , ops []Operation , defMap map [string ]Definition ) error {
352
+ func ( ver * Version ) doPackage (resTempl * template.Template , serviceName , description string , ops []Operation , defMap map [string ]Definition ) error {
210
353
packageName := strings .ToLower (serviceName )
211
354
comments := strings .Split (strings .TrimRight (description , "\n " ), "\n " )
212
355
if packageName == "uncategorized" {
213
356
comments = append (comments , "Uncategorized calls may change or move to other packages." )
214
357
}
215
- f , err := makePackageFile (packageName )
358
+ f , err := ver . makePackageFile (packageName )
216
359
if err != nil {
217
360
return err
218
361
}
@@ -235,26 +378,27 @@ func doPackage(resTempl *template.Template, serviceName, description string, ops
235
378
})
236
379
}
237
380
var data = struct {
238
- Service string
239
- Package string
240
- Directory string
241
- Operations []ExtOperation
242
- Comments []string
243
- Packages []string
244
- DocPrefix string
245
- VersionPrefix string
246
- VersionDef string
247
- AddDocLinks bool
381
+ Service string
382
+ Package string
383
+ Directory string
384
+ Operations []ExtOperation
385
+ Comments []string
386
+ Packages []string
387
+ DocPrefix string
388
+ VersionID string
389
+ CallVersion string
390
+ AddDocLinks bool
248
391
}{
249
- Service : serviceName ,
250
- Package : packageName ,
251
- Directory : * basePkg ,
252
- Operations : extOps ,
253
- Comments : comments ,
254
- Packages : []string {`"context"` , `"net/url"` },
255
- DocPrefix : * docprefix ,
256
- VersionPrefix : * version ,
257
- AddDocLinks : (serviceName != "Uncategorized" ),
392
+ Service : serviceName ,
393
+ Package : packageName ,
394
+ Directory : ver .BasePkg ,
395
+ Operations : extOps ,
396
+ Comments : comments ,
397
+ Packages : []string {`"context"` , `"net/url"` },
398
+ DocPrefix : ver .DocPrefix ,
399
+ VersionID : ver .VersionNm ,
400
+ CallVersion : ver .CallVersion ,
401
+ AddDocLinks : (serviceName != "Uncategorized" ),
258
402
}
259
403
importMap := make (map [string ]bool )
260
404
for _ , op := range extOps {
@@ -290,7 +434,7 @@ func doPackage(resTempl *template.Template, serviceName, description string, ops
290
434
data .Packages = append (data .Packages ,
291
435
"" ,
292
436
"\" " + * basePkg + "\" " ,
293
- "\" " + * basePkg + "/" + * version + "/model\" " )
437
+ "\" " + * basePkg + "/" + ver . VersionNm + "/model\" " )
294
438
295
439
defer func () {
296
440
f .Close ()
@@ -301,16 +445,16 @@ func doPackage(resTempl *template.Template, serviceName, description string, ops
301
445
return resTempl .Execute (f , data )
302
446
}
303
447
304
- func getEsignDir () string {
305
- p := path .Join (* baseDir , * version )
306
- if strings .HasPrefix (p , * version ) {
448
+ func ( ver * Version ) getEsignDir () string {
449
+ p := path .Join (ver . BaseDir , ver . VersionNm )
450
+ if strings .HasPrefix (p , ver . VersionNm ) {
307
451
p = "./" + p
308
452
}
309
453
return p
310
454
}
311
455
312
- func makePackageFile (packageName string ) (* os.File , error ) {
313
- pkgDir := getEsignDir () + "/" + packageName
456
+ func ( ver * Version ) makePackageFile (packageName string ) (* os.File , error ) {
457
+ pkgDir := ver . getEsignDir () + "/" + packageName
314
458
315
459
if err := os .Chdir (pkgDir ); err != nil {
316
460
if os .IsNotExist (err ) {
0 commit comments