github.com/josephspurrier/go-swagger@v0.2.1-0.20221129144919-1f672a142a00/cmd/swagger/commands/generate/model.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 generate 16 17 import ( 18 "errors" 19 "log" 20 21 "github.com/go-swagger/go-swagger/generator" 22 ) 23 24 type modelOptions struct { 25 ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` 26 Models []string `long:"model" short:"M" description:"specify a model to include in generation, repeat for multiple (defaults to all)"` 27 ExistingModels string `long:"existing-models" description:"use pre-generated models e.g. github.com/foobar/model"` 28 StrictAdditionalProperties bool `long:"strict-additional-properties" description:"disallow extra properties when additionalProperties is set to false"` 29 KeepSpecOrder bool `long:"keep-spec-order" description:"keep schema properties order identical to spec file"` 30 AllDefinitions bool `long:"all-definitions" description:"generate all model definitions regardless of usage in operations" hidden:"deprecated"` 31 StructTags []string `long:"struct-tags" description:"the struct tags to generate, repeat for multiple (defaults to json)"` 32 } 33 34 func (mo modelOptions) apply(opts *generator.GenOpts) { 35 opts.ModelPackage = mo.ModelPackage 36 opts.Models = mo.Models 37 opts.ExistingModels = mo.ExistingModels 38 opts.StrictAdditionalProperties = mo.StrictAdditionalProperties 39 opts.PropertiesSpecOrder = mo.KeepSpecOrder 40 opts.IgnoreOperations = mo.AllDefinitions 41 opts.StructTags = mo.StructTags 42 } 43 44 // WithModels adds the model options group. 45 // 46 // This group is available to all commands that need some model generation. 47 type WithModels struct { 48 Models modelOptions `group:"Options for model generation"` 49 } 50 51 // Model the generate model file command. 52 // 53 // Define the options that are specific to the "swagger generate model" command. 54 type Model struct { 55 WithShared 56 WithModels 57 58 NoStruct bool `long:"skip-struct" description:"when present will not generate the model struct" hidden:"deprecated"` 59 Name []string `long:"name" short:"n" description:"the model to generate, repeat for multiple (defaults to all). Same as --models"` 60 AcceptDefinitionsOnly bool `long:"accept-definitions-only" description:"accepts a partial swagger spec with only the definitions key"` 61 } 62 63 func (m Model) apply(opts *generator.GenOpts) { 64 m.Shared.apply(opts) 65 m.Models.apply(opts) 66 67 opts.IncludeModel = !m.NoStruct 68 opts.IncludeValidator = !m.NoStruct 69 opts.AcceptDefinitionsOnly = m.AcceptDefinitionsOnly 70 } 71 72 func (m Model) log(rp string) { 73 log.Println(`Generation completed! 74 75 For this generation to compile you need to have some packages in your go.mod: 76 77 * github.com/go-openapi/validate 78 * github.com/go-openapi/strfmt 79 80 You can get these now with: go mod tidy`) 81 } 82 83 func (m *Model) generate(opts *generator.GenOpts) error { 84 return generator.GenerateModels(append(m.Name, m.Models.Models...), opts) 85 } 86 87 // Execute generates a model file 88 func (m *Model) Execute(args []string) error { 89 90 if m.Shared.DumpData && len(append(m.Name, m.Models.Models...)) > 1 { 91 return errors.New("only 1 model at a time is supported for dumping data") 92 } 93 94 if m.Models.ExistingModels != "" { 95 log.Println("warning: Ignoring existing-models flag when generating models.") 96 } 97 return createSwagger(m) 98 }