github.com/thetreep/go-swagger@v0.0.0-20240223100711-35af64f14f01/generator/templates/cli/schema.gotmpl (about) 1 {{/*util functions to generate register and retrieve functions for a model*/}} 2 3 {{ define "modelschemacli" }} 4 {{/*some guards to prevent rendering unsupported models types. TODO: remove this guard*/}} 5 {{if or .IsPrimitive .IsComplexObject }} 6 {{ template "modelschemacliinternal" . }} 7 {{ else }} 8 // Name: [{{.Name}}], Type:[{{ .GoType }}], register and retrieve functions are not rendered by go-swagger cli 9 {{ end }} 10 {{ end }} 11 12 {{/*since register and retrieve are the same for properties and all of, share them here*/}} 13 {{ define "propertyregistor" }} 14 {{- if .IsPrimitive }} 15 {{ template "primitiveregistrator" . }} 16 {{- else if .IsArray }} 17 // warning: {{.Name}} {{ .GoType }} array type is not supported by go-swagger cli yet 18 {{- else if .IsMap }} 19 // warning: {{.Name}} {{ .GoType }} map type is not supported by go-swagger cli yet 20 {{- else if .IsComplexObject }} {{/* struct case */}} 21 {{ template "flagnamevar" . }} 22 if err := registerModel{{pascalize (dropPackage .GoType) }}Flags(depth + 1, {{ camelize .Name }}FlagName, cmd); err != nil{ 23 return err 24 } 25 {{- else }} 26 // warning: {{.Name}} {{ .GoType }} unkown type is not supported by go-swagger cli yet 27 {{- end }} 28 {{ end }} 29 30 {{ define "propertyretriever" }} 31 {{- $flagNameVar := printf "%vFlagName" (camelize .Name) }} 32 {{- $flagValueVar := printf "%vFlagValue" (camelize .Name) }} 33 {{ $flagNameVar }} := fmt.Sprintf("%v.{{ .Name }}", cmdPrefix) 34 if cmd.Flags().Changed({{ $flagNameVar }}) { 35 {{- if .IsPrimitive }} 36 {{ template "primitiveretriever" . }} 37 retAdded = true 38 {{- else if .IsArray }} 39 // warning: {{ .Name }} array type {{ .GoType }} is not supported by go-swagger cli yet 40 {{- else if .IsMap }} 41 // warning: {{ .Name }} map type {{ .GoType }} is not supported by go-swagger cli yet 42 {{- else if .IsComplexObject }} 43 // info: complex object {{.Name}} {{.GoType}} is retrieved outside this Changed() block 44 {{- else }} 45 // warning: {{.Name}} {{ .GoType }} unkown type is not supported by go-swagger cli yet 46 {{- end }} 47 } 48 {{- if and .IsComplexObject (not .IsArray) (not .IsMap) (not .IsStream) }} 49 {{ $flagValueVar }} := m.{{pascalize .Name}} 50 if swag.IsZero({{ $flagValueVar }}){ 51 {{ $flagValueVar }} = {{if .IsNullable }}&{{end}}{{if containsPkgStr .GoType}}{{ .GoType }}{{else}}{{ .Pkg }}.{{.GoType}}{{ end }}{} 52 } 53 {{/* always lift the payload to pointer and pass to model retrieve function. If .GoType has pkg str, use it, else use .Pkg+.GoType */}} 54 err, {{camelize .Name }}Added := retrieveModel{{pascalize (dropPackage .GoType) }}Flags(depth + 1, {{if not .IsNullable }}&{{end}}{{ $flagValueVar }}, {{ $flagNameVar }}, cmd) 55 if err != nil{ 56 return err, false 57 } 58 retAdded = retAdded || {{camelize .Name }}Added 59 if {{camelize .Name }}Added { 60 m.{{pascalize .Name}} = {{ $flagValueVar }} 61 } 62 {{- end }} 63 {{ end }} 64 65 {{ define "modelschemacliinternal" }} {{/*used by model definition and in params model*/}} 66 {{- $modelName := .Name }} 67 {{/*model package is filled by generator*/}} 68 {{ $modelPkg := toPackageName .Pkg}} 69 {{ $modelType := .GoType }} 70 71 // register flags to command 72 func registerModel{{pascalize .Name}}Flags(depth int, cmdPrefix string, cmd *cobra.Command) error { 73 {{ range .AllOf }} 74 {{- if not .IsAnonymous }}{{/* named type composition */}} 75 {{ if or .IsPrimitive .IsComplexObject }} 76 // register embedded {{ .GoType }} flags 77 {{/*defer all of registration to the model's regristor method. embed should not lift cmdPrefix */}} 78 if err := registerModel{{ pascalize (dropPackage .GoType) }}Flags(depth, cmdPrefix, cmd); err != nil{ 79 return err 80 } 81 {{ else }} 82 // {{ .Name }} {{ .GoType }} register is skipped 83 {{ end }} 84 {{ else }}{{/*inline definition. assume only properties are used*/}} 85 // register anonymous fields for {{.Name}} 86 {{ $anonName := .Name }} 87 {{ range .Properties }} 88 if err := register{{ pascalize $modelName }}PropAnon{{pascalize $anonName }}{{ pascalize .Name }}(depth, cmdPrefix, cmd); err != nil{ 89 return err 90 } 91 {{ end }} 92 {{ end }} 93 {{ end }} 94 {{ range .Properties }} 95 if err := register{{ pascalize $modelName }}Prop{{ pascalize .Name }}(depth, cmdPrefix, cmd); err != nil{ 96 return err 97 } 98 {{ end }} 99 return nil 100 } 101 102 {{ range .AllOf }} 103 {{- if .IsAnonymous }}{{/* inline definition. schema case is defered. */}} 104 // inline definition name {{ .Name }}, type {{.GoType}} 105 {{ $anonName := .Name }} 106 {{ range .Properties }} 107 func register{{ pascalize $modelName }}PropAnon{{pascalize $anonName }}{{ pascalize .Name }}(depth int, cmdPrefix string, cmd *cobra.Command) error { 108 if depth > maxDepth { 109 return nil 110 } 111 {{ template "propertyregistor" . }} 112 return nil 113 } 114 {{ end }} 115 {{ end }} 116 {{ end }} 117 118 {{/*register functions for each fields in this model */}} 119 {{ range .Properties }} 120 func register{{ pascalize $modelName }}Prop{{ pascalize .Name }}(depth int, cmdPrefix string, cmd *cobra.Command) error{ 121 if depth > maxDepth { 122 return nil 123 } 124 {{ template "propertyregistor" .}} 125 return nil 126 } 127 {{ end }} {{/*Properties*/}} 128 129 // retrieve flags from commands, and set value in model. Return true if any flag is passed by user to fill model field. 130 func retrieveModel{{pascalize $modelName }}Flags(depth int, m *{{if containsPkgStr .GoType}}{{ .GoType }}{{else}}{{ .Pkg }}.{{.GoType}}{{ end }}, cmdPrefix string, cmd *cobra.Command) (error, bool) { 131 retAdded := false 132 {{ range .AllOf }} 133 {{- if not .IsAnonymous }}{{/* named type composition */}} 134 {{ if or .IsPrimitive .IsComplexObject }} 135 // retrieve model {{.GoType}} 136 err, {{camelize .Name }}Added := retrieveModel{{ pascalize (dropPackage .GoType) }}Flags(depth, &m.{{pascalize (dropPackage .GoType) }}, cmdPrefix, cmd) 137 if err != nil{ 138 return err, false 139 } 140 retAdded = retAdded || {{camelize .Name }}Added 141 {{ else }} {{/*inline anonymous case*/}} 142 143 {{ end }} 144 {{- else }} 145 // retrieve allOf {{.Name}} fields 146 {{ $anonName := .Name }} 147 {{ range .Properties }} 148 err, {{camelize .Name}}Added := retrieve{{ pascalize $modelName }}PropAnon{{pascalize $anonName }}{{ pascalize .Name }}Flags(depth, m, cmdPrefix, cmd) 149 if err != nil{ 150 return err, false 151 } 152 retAdded = retAdded || {{ camelize .Name }}Added 153 {{ end }} 154 {{- end }} 155 {{ end }} 156 {{ range .Properties }} 157 err, {{ camelize .Name }}Added := retrieve{{pascalize $modelName }}Prop{{pascalize .Name }}Flags(depth, m, cmdPrefix, cmd) 158 if err != nil{ 159 return err, false 160 } 161 retAdded = retAdded || {{ camelize .Name }}Added 162 {{ end }} 163 return nil, retAdded 164 } 165 166 {{ range .AllOf }} 167 {{- if .IsAnonymous }}{{/* inline definition. schema case is defered. */}} 168 // define retrieve functions for fields for inline definition name {{ .Name }} 169 {{ $anonName := .Name }} 170 {{ range .Properties }} {{/*anonymous fields will be registered directly on parent model*/}} 171 func retrieve{{ pascalize $modelName }}PropAnon{{pascalize $anonName }}{{ pascalize .Name }}Flags(depth int, m *{{if containsPkgStr $modelType}}{{ $modelType }}{{else}}{{ $modelPkg }}.{{$modelType}}{{ end }},cmdPrefix string, cmd *cobra.Command) (error,bool) { 172 if depth > maxDepth { 173 return nil, false 174 } 175 retAdded := false 176 {{ template "propertyretriever" . }} 177 return nil, retAdded 178 } 179 {{ end }} 180 {{ end }} 181 {{ end }} 182 183 {{ range .Properties }} 184 func retrieve{{pascalize $modelName }}Prop{{pascalize .Name }}Flags(depth int, m *{{if $modelPkg}}{{$modelPkg}}.{{ dropPackage $modelType }}{{else}}{{ $modelType }}{{end}}, cmdPrefix string, cmd *cobra.Command) (error, bool) { 185 if depth > maxDepth { 186 return nil, false 187 } 188 retAdded := false 189 {{ template "propertyretriever" . }} 190 return nil, retAdded 191 } 192 {{ end }} {{/*properties*/}} 193 {{ end }} {{/*define*/}}