OpenAPITools / openapi-generator

OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
https://openapi-generator.tech
Apache License 2.0
21.67k stars 6.54k forks source link

Go Generator Incorrectly handles string with decimal format #10836

Open zh4ngx opened 2 years ago

zh4ngx commented 2 years ago

Bug Report Checklist

Description

When handling properties with

type: string
format: decimal

the golang generator incorrectly assumes a JSON float/numeric type. This causes an Unmarshall error when encountering a string in the API response.

openapi-generator version

5.3.0

OpenAPI declaration file content or url

https://raw.githubusercontent.com/alpacahq/bkdocs/564d49f52bc91bb180b15b2b900253a1e7c53846/assets/openapi.yaml

Generation Details
Steps to reproduce

Start a new golang project in go 1.16 or higher. Run go mod init in the project Create a folder for the openapi package and cd to the folder Run

openapi-generator-cli generate -g go -i https://raw.githubusercontent.com/alpacahq/bkdocs/564d49f52bc91bb180b15b2b900253a1e7c53846/assets/openapi.yaml -o .

Then go mod tidy

IF you have an Alpaca Broker account, then you can reproduce this fully. Otherwise, here is what happens:

You make an API call that would return fields annotated as above. You will get an Unmarshall error because you are attempting to Unmarshall a string into a float64.

One thing to note - generating for akka-scala seems to build in the correct conversions. BigDecimal is used, but it correctly parses a string response from the API.

Related issues/PRs

Could not find anything.

Suggest a fix

Fixing the struct tag should do the trick -

from

DollarBills float64 `json:"dollarBills"` 

to

DollarBills float64 `json:"dollarBills,string"` 

Can this be modified in the template or generator logic?

zh4ngx commented 2 years ago

I did find these lines here:

https://github.com/OpenAPITools/openapi-generator/blob/5c3a869c97e47f88da23d98a8cf2e8598387e63e/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java#L2018-L2021

This was merged in a PR back in Nov 2020 https://github.com/OpenAPITools/openapi-generator/pull/7808

In this file:

modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java

we have this:


    public static boolean isDecimalSchema(Schema schema) {
        if (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) // type: string
                && "number".equals(schema.getFormat())) { // format: number
            return true;
        }
        return false;
    }
zh4ngx commented 2 years ago

I believe the fix would result in "string" being added to this line the the mustache template:

https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/resources/go/model_simple.mustache#L22

    {{name}} {{^required}}{{^isNullable}}*{{/isNullable}}{{/required}}{{{dataType}}} `json:"{{baseName}}{{^required}},omitempty{{/required}}"{{#withXml}} xml:"{{baseName}}{{#isXmlAttribute}},attr{{/isXmlAttribute}}"{{/withXml}}{{#vendorExtensions.x-go-custom-tag}} {{{.}}}{{/vendorExtensions.x-go-custom-tag}}`