github.com/emreu/go-swagger@v0.22.1/generator/client.go (about) 1 // Copyright 2015 go-swagger maintainers 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package generator 16 17 import ( 18 "encoding/json" 19 "errors" 20 "fmt" 21 "os" 22 "path" 23 "path/filepath" 24 "sort" 25 26 "github.com/go-openapi/analysis" 27 "github.com/go-openapi/runtime" 28 "github.com/go-openapi/swag" 29 ) 30 31 // GenerateClient generates a client library for a swagger spec document. 32 func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpts) error { 33 templates.LoadDefaults() 34 if opts == nil { 35 return errors.New("gen opts are required") 36 } 37 38 if opts.Template != "" { 39 if err := templates.LoadContrib(opts.Template); err != nil { 40 return err 41 } 42 } 43 44 templates.SetAllowOverride(opts.AllowTemplateOverride) 45 46 if opts.TemplateDir != "" { 47 if err := templates.LoadDir(opts.TemplateDir); err != nil { 48 return err 49 } 50 } 51 52 if err := opts.CheckOpts(); err != nil { 53 return err 54 } 55 56 // Load the spec 57 _, specDoc, err := loadSpec(opts.Spec) 58 if err != nil { 59 return err 60 } 61 62 // Validate and Expand. specDoc is in/out param. 63 specDoc, err = validateAndFlattenSpec(opts, specDoc) 64 if err != nil { 65 return err 66 } 67 68 analyzed := analysis.New(specDoc.Spec()) 69 70 models, err := gatherModels(specDoc, modelNames) 71 if err != nil { 72 return err 73 } 74 75 operations := gatherOperations(analyzed, operationIDs) 76 77 if len(operations) == 0 { 78 return errors.New("no operations were selected") 79 } 80 81 defaultScheme := opts.DefaultScheme 82 if defaultScheme == "" { 83 defaultScheme = sHTTP 84 } 85 86 defaultConsumes := opts.DefaultConsumes 87 if defaultConsumes == "" { 88 defaultConsumes = runtime.JSONMime 89 } 90 91 defaultProduces := opts.DefaultProduces 92 if defaultProduces == "" { 93 defaultProduces = runtime.JSONMime 94 } 95 96 generator := appGenerator{ 97 Name: appNameOrDefault(specDoc, name, "rest"), 98 SpecDoc: specDoc, 99 Analyzed: analyzed, 100 Models: models, 101 Operations: operations, 102 Target: opts.Target, 103 DumpData: opts.DumpData, 104 Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, "client"), 105 APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"), 106 ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), 107 ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), 108 ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), 109 OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), 110 Principal: opts.Principal, 111 DefaultScheme: defaultScheme, 112 DefaultProduces: defaultProduces, 113 DefaultConsumes: defaultConsumes, 114 GenOpts: opts, 115 } 116 generator.Receiver = "o" 117 return (&clientGenerator{generator}).Generate() 118 } 119 120 type clientGenerator struct { 121 appGenerator 122 } 123 124 func (c *clientGenerator) Generate() error { 125 app, err := c.makeCodegenApp() 126 if app.Name == "" { 127 app.Name = "APIClient" 128 } 129 baseImport := c.GenOpts.LanguageOpts.baseImport(c.Target) 130 131 if c.GenOpts.ExistingModels == "" { 132 if app.Imports == nil { 133 app.Imports = make(map[string]string) 134 } 135 pkgAlias := c.GenOpts.LanguageOpts.ManglePackageName(c.ModelsPackage, "models") 136 app.Imports[pkgAlias] = path.Join( 137 filepath.ToSlash(baseImport), 138 c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ModelPackage, "models")) 139 } else { 140 app.DefaultImports = append(app.DefaultImports, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ExistingModels, "")) 141 } 142 if err != nil { 143 return err 144 } 145 146 if c.DumpData { 147 bb, _ := json.MarshalIndent(swag.ToDynamicJSON(app), "", " ") 148 fmt.Fprintln(os.Stdout, string(bb)) 149 return nil 150 } 151 152 if c.GenOpts.IncludeModel { 153 for _, mod := range app.Models { 154 modCopy := mod 155 modCopy.IncludeValidator = true 156 if !mod.IsStream { 157 if err := c.GenOpts.renderDefinition(&modCopy); err != nil { 158 return err 159 } 160 } 161 } 162 } 163 164 if c.GenOpts.IncludeHandler { 165 sort.Sort(app.OperationGroups) 166 for i := range app.OperationGroups { 167 opGroup := app.OperationGroups[i] 168 opGroup.DefaultImports = app.DefaultImports 169 opGroup.RootPackage = c.ClientPackage 170 opGroup.GenOpts = c.GenOpts 171 app.OperationGroups[i] = opGroup 172 sort.Sort(opGroup.Operations) 173 for _, op := range opGroup.Operations { 174 opCopy := op 175 if opCopy.Package == "" { 176 opCopy.Package = c.Package 177 } 178 if err := c.GenOpts.renderOperation(&opCopy); err != nil { 179 return err 180 } 181 } 182 app.DefaultImports = append(app.DefaultImports, 183 path.Join( 184 filepath.ToSlash(baseImport), 185 c.GenOpts.LanguageOpts.ManglePackagePath(c.ClientPackage, "client"), 186 opGroup.Name)) 187 188 if err := c.GenOpts.renderOperationGroup(&opGroup); err != nil { 189 return err 190 } 191 } 192 } 193 194 if c.GenOpts.IncludeSupport { 195 if err := c.GenOpts.renderApplication(&app); err != nil { 196 return err 197 } 198 } 199 200 return nil 201 }