Skip to content

Commit 9d64fb7

Browse files
authored
fix(go-sdk-generator): generator does not generate enum code correct (#150)
* fix: generator does not generate enum code correct - enums which aren't definied in a ref within the API spec, were handled like normal strings * add reserved word mapping: type -> types
1 parent 7facca0 commit 9d64fb7

File tree

2 files changed

+138
-2
lines changed

2 files changed

+138
-2
lines changed

scripts/generate-sdk/languages/go.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ generate_go_sdk() {
160160
--git-repo-id ${GIT_REPO_ID} \
161161
--global-property apis,models,modelTests=true,modelDocs=false,apiDocs=false,supportingFiles \
162162
--additional-properties=isGoSubmodule=true,enumClassPrefix=true,generateInterfaces=true,$regional_api \
163-
--http-user-agent stackit-sdk-go/${service}
164-
163+
--http-user-agent stackit-sdk-go/${service} \
164+
--reserved-words-mappings type=types
165165
# Remove unnecessary files
166166
rm ${SERVICES_FOLDER}/${service}/.openapi-generator-ignore
167167
rm ${SERVICES_FOLDER}/${service}/.openapi-generator/FILES

templates/go/model_simple.mustache

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,136 @@ func set{{classname}}{{getter}}AttributeType(arg *{{classname}}{{getter}}Attribu
277277
{{/isDate}}
278278
{{#isEnumRef}}
279279
{{! special handling for enums}}
280+
{{#isEnum}}
281+
// isEnum
282+
283+
// {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} {{{description}}}{{^description}}the model '{{{classname}}}'{{/description}}
284+
type {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} {{dataType}}
285+
286+
// List of {{name}}
287+
const (
288+
{{#allowableValues}}
289+
{{#enumVars}}
290+
{{^-first}}
291+
{{/-first}}
292+
{{{classname.toUpperCase}}}{{{enumName}}}_{{name}} {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} = {{{value}}}
293+
{{/enumVars}}
294+
{{/allowableValues}}
295+
)
296+
297+
// All allowed values of {{{classname}}} enum
298+
var Allowed{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}EnumValues = []{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}{
299+
{{#allowableValues}}
300+
{{#enumVars}}
301+
{{{value}}},
302+
{{/enumVars}}
303+
{{/allowableValues}}
304+
}
305+
306+
func (v *{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) UnmarshalJSON(src []byte) error {
307+
var value {{dataType}}
308+
err := json.Unmarshal(src, &value)
309+
if err != nil {
310+
return err
311+
}
312+
// Allow unmarshalling zero value for testing purposes
313+
var zeroValue {{dataType}}
314+
if value == zeroValue {
315+
return nil
316+
}
317+
enumTypeValue := {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}(value)
318+
for _, existing := range Allowed{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}EnumValues {
319+
if existing == enumTypeValue {
320+
*v = enumTypeValue
321+
return nil
322+
}
323+
}
324+
325+
return fmt.Errorf("%+v is not a valid {{classname}}", value)
326+
}
327+
328+
// New{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}FromValue returns a pointer to a valid {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}
329+
// for the value passed as argument, or an error if the value passed is not allowed by the enum
330+
func New{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}FromValue(v {{dataType}}) (*{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}, error) {
331+
ev := {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}(v)
332+
if ev.IsValid() {
333+
return &ev, nil
334+
} else {
335+
return nil, fmt.Errorf("invalid value '%v' for {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}: valid values are %v", v, Allowed{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}EnumValues)
336+
}
337+
}
338+
339+
// IsValid return true if the value is valid for the enum, false otherwise
340+
func (v {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) IsValid() bool {
341+
for _, existing := range Allowed{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}EnumValues {
342+
if existing == v {
343+
return true
344+
}
345+
}
346+
return false
347+
}
348+
349+
// Ptr returns reference to {{{name}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} value
350+
func (v {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) Ptr() *{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} {
351+
return &v
352+
}
353+
354+
type Nullable{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} struct {
355+
value *{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}
356+
isSet bool
357+
}
358+
359+
func (v Nullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) Get() *{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} {
360+
return v.value
361+
}
362+
363+
func (v *Nullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) Set(val *{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) {
364+
v.value = val
365+
v.isSet = true
366+
}
367+
368+
func (v Nullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) IsSet() bool {
369+
return v.isSet
370+
}
371+
372+
func (v *Nullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) Unset() {
373+
v.value = nil
374+
v.isSet = false
375+
}
376+
377+
func NewNullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}(val *{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) *Nullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} {
378+
return &Nullable{{classname}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}{value: val, isSet: true}
379+
}
380+
381+
func (v Nullable{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) MarshalJSON() ([]byte, error) {
382+
return json.Marshal(v.value)
383+
}
384+
385+
func (v *Nullable{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}) UnmarshalJSON(src []byte) error {
386+
v.isSet = true
387+
return json.Unmarshal(src, &v.value)
388+
}
389+
390+
type {{classname}}{{getter}}AttributeType = *{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}
391+
type {{classname}}{{getter}}ArgType = {{#isNullable}}*{{/isNullable}}{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}
392+
type {{classname}}{{getter}}RetType = {{#isNullable}}*{{/isNullable}}{{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}}
393+
func get{{classname}}{{getter}}AttributeTypeOk(arg {{classname}}{{getter}}AttributeType) (ret {{classname}}{{getter}}RetType, ok bool) {
394+
if arg == nil {
395+
{{#isNullable}}
396+
return nil,false
397+
{{/isNullable}}
398+
{{^isNullable}}
399+
return ret,false
400+
{{/isNullable}}
401+
}
402+
return {{^isNullable}}*{{/isNullable}}arg,true
403+
}
404+
405+
func set{{classname}}{{getter}}AttributeType(arg *{{classname}}{{getter}}AttributeType, val {{classname}}{{getter}}RetType) {
406+
*arg={{^isNullable}}&{{/isNullable}}val
407+
}
408+
{{/isEnum}}
409+
{{^isEnum}}
280410
// isEnumRef
281411
type {{classname}}{{getter}}AttributeType = *{{^isNumeric}}{{dataType}}{{/isNumeric}}{{#isNumeric}}int64{{/isNumeric}}
282412
type {{classname}}{{getter}}ArgType = {{#isNullable}}*{{/isNullable}}{{^isNumeric}}{{dataType}}{{/isNumeric}}{{#isNumeric}}int64{{/isNumeric}}
@@ -296,6 +426,7 @@ func get{{classname}}{{getter}}AttributeTypeOk(arg {{classname}}{{getter}}Attrib
296426
func set{{classname}}{{getter}}AttributeType(arg *{{classname}}{{getter}}AttributeType, val {{classname}}{{getter}}RetType) {
297427
*arg={{^isNullable}}&{{/isNullable}}val
298428
}
429+
{{/isEnum}}
299430
{{/isEnumRef}}
300431
{{#isModel}}
301432
{{! special handling for recursive datatypes}}
@@ -542,8 +673,13 @@ func New{{classname}}WithDefaults() *{{classname}} {
542673
{{#defaultValue}}
543674
{{^vendorExtensions.x-golang-is-container}}
544675
{{^isReadOnly}}
676+
{{#isEnum}}
677+
var {{nameInCamelCase}} {{{classname}}}{{#lambda.titlecase}}{{nameInCamelCase}}{{/lambda.titlecase}} = {{{.}}}
678+
{{/isEnum}}
679+
{{^isEnum}}
545680
{{!we use datatypeWithEnum here, since it will represent the non-nullable name of the datatype, e.g. int64 for NullableInt64}}
546681
var {{nameInCamelCase}} {{#isInteger}}int64{{/isInteger}}{{#isNumber}}float64{{/isNumber}}{{^isNumber}}{{^isInteger}}{{dataType}}{{/isInteger}}{{/isNumber}} = {{{.}}}
682+
{{/isEnum}}
547683
{{#isNullable}}
548684
this.{{name}} = *New{{dataType}}(&{{nameInCamelCase}})
549685
{{/isNullable}}

0 commit comments

Comments
 (0)