You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

client.go 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. package generator
  15. import (
  16. "encoding/json"
  17. "errors"
  18. "fmt"
  19. "os"
  20. "path"
  21. "path/filepath"
  22. "sort"
  23. "github.com/go-openapi/analysis"
  24. "github.com/go-openapi/runtime"
  25. "github.com/go-openapi/swag"
  26. )
  27. // GenerateClient generates a client library for a swagger spec document.
  28. func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpts) error {
  29. templates.LoadDefaults()
  30. if opts == nil {
  31. return errors.New("gen opts are required")
  32. }
  33. if opts.Template != "" {
  34. if err := templates.LoadContrib(opts.Template); err != nil {
  35. return err
  36. }
  37. }
  38. if opts.TemplateDir != "" {
  39. if err := templates.LoadDir(opts.TemplateDir); err != nil {
  40. return err
  41. }
  42. }
  43. if err := opts.CheckOpts(); err != nil {
  44. return err
  45. }
  46. // Load the spec
  47. _, specDoc, err := loadSpec(opts.Spec)
  48. if err != nil {
  49. return err
  50. }
  51. // Validate and Expand. specDoc is in/out param.
  52. specDoc, err = validateAndFlattenSpec(opts, specDoc)
  53. if err != nil {
  54. return err
  55. }
  56. analyzed := analysis.New(specDoc.Spec())
  57. models, err := gatherModels(specDoc, modelNames)
  58. if err != nil {
  59. return err
  60. }
  61. operations := gatherOperations(analyzed, operationIDs)
  62. if len(operations) == 0 {
  63. return errors.New("no operations were selected")
  64. }
  65. defaultScheme := opts.DefaultScheme
  66. if defaultScheme == "" {
  67. defaultScheme = sHTTP
  68. }
  69. defaultConsumes := opts.DefaultConsumes
  70. if defaultConsumes == "" {
  71. defaultConsumes = runtime.JSONMime
  72. }
  73. defaultProduces := opts.DefaultProduces
  74. if defaultProduces == "" {
  75. defaultProduces = runtime.JSONMime
  76. }
  77. generator := appGenerator{
  78. Name: appNameOrDefault(specDoc, name, "rest"),
  79. SpecDoc: specDoc,
  80. Analyzed: analyzed,
  81. Models: models,
  82. Operations: operations,
  83. Target: opts.Target,
  84. DumpData: opts.DumpData,
  85. Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, "client"),
  86. APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"),
  87. ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"),
  88. ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"),
  89. ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"),
  90. OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"),
  91. Principal: opts.Principal,
  92. DefaultScheme: defaultScheme,
  93. DefaultProduces: defaultProduces,
  94. DefaultConsumes: defaultConsumes,
  95. GenOpts: opts,
  96. }
  97. generator.Receiver = "o"
  98. return (&clientGenerator{generator}).Generate()
  99. }
  100. type clientGenerator struct {
  101. appGenerator
  102. }
  103. func (c *clientGenerator) Generate() error {
  104. app, err := c.makeCodegenApp()
  105. if app.Name == "" {
  106. app.Name = "APIClient"
  107. }
  108. baseImport := c.GenOpts.LanguageOpts.baseImport(c.Target)
  109. if c.GenOpts.ExistingModels == "" {
  110. if app.Imports == nil {
  111. app.Imports = make(map[string]string)
  112. }
  113. pkgAlias := c.GenOpts.LanguageOpts.ManglePackageName(c.ModelsPackage, "models")
  114. app.Imports[pkgAlias] = path.Join(
  115. filepath.ToSlash(baseImport),
  116. c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ModelPackage, "models"))
  117. } else {
  118. app.DefaultImports = append(app.DefaultImports, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ExistingModels, ""))
  119. }
  120. if err != nil {
  121. return err
  122. }
  123. if c.DumpData {
  124. bb, _ := json.MarshalIndent(swag.ToDynamicJSON(app), "", " ")
  125. fmt.Fprintln(os.Stdout, string(bb))
  126. return nil
  127. }
  128. if c.GenOpts.IncludeModel {
  129. for _, mod := range app.Models {
  130. modCopy := mod
  131. modCopy.IncludeValidator = true
  132. if !mod.IsStream {
  133. if err := c.GenOpts.renderDefinition(&modCopy); err != nil {
  134. return err
  135. }
  136. }
  137. }
  138. }
  139. if c.GenOpts.IncludeHandler {
  140. sort.Sort(app.OperationGroups)
  141. for i := range app.OperationGroups {
  142. opGroup := app.OperationGroups[i]
  143. opGroup.DefaultImports = app.DefaultImports
  144. opGroup.RootPackage = c.ClientPackage
  145. opGroup.GenOpts = c.GenOpts
  146. app.OperationGroups[i] = opGroup
  147. sort.Sort(opGroup.Operations)
  148. for _, op := range opGroup.Operations {
  149. opCopy := op
  150. if opCopy.Package == "" {
  151. opCopy.Package = c.Package
  152. }
  153. if err := c.GenOpts.renderOperation(&opCopy); err != nil {
  154. return err
  155. }
  156. }
  157. app.DefaultImports = append(app.DefaultImports,
  158. path.Join(
  159. filepath.ToSlash(baseImport),
  160. c.GenOpts.LanguageOpts.ManglePackagePath(c.ClientPackage, "client"),
  161. opGroup.Name))
  162. if err := c.GenOpts.renderOperationGroup(&opGroup); err != nil {
  163. return err
  164. }
  165. }
  166. }
  167. if c.GenOpts.IncludeSupport {
  168. if err := c.GenOpts.renderApplication(&app); err != nil {
  169. return err
  170. }
  171. }
  172. return nil
  173. }