Skip to content

Problem with optional enum query parameter? #10

@whophil

Description

@whophil

I am having trouble making calls to the API when the endpoint directly uses an optional enum query parameter.

I have followed this section of the docs, but am running into issues which do not seem to be covered.

I have created a minimal openapi.json as shown below. This API has one endpoint, /data/ which takes one query parameter unit_system, which is allowed to be either "SI" or "FPS" - or it can be null.

openapi.json
{
    "openapi": "3.1.0",
    "info":
    {
        "title": "FastAPI",
        "version": "0.1.0"
    },
    "paths":
    {
        "/data/":
        {
            "get":
            {
                "summary": "Get Data",
                "operationId": "get_data",
                "parameters":
                [
                    {
                        "name": "unit_system",
                        "in": "query",
                        "required": false,
                        "schema":
                        {
                            "anyOf":
                            [
                                {
                                    "$ref": "#/components/schemas/UnitSystem"
                                },
                                {
                                    "type": "null"
                                }
                            ],
                            "title": "Unit System"
                        }
                    }
                ],
                "responses":
                {
                    "200":
                    {
                        "description": "Successful Response",
                        "content":
                        {
                            "application/json":
                            {
                                "schema":
                                {
                                    "type": "string",
                                    "title": "Response Get Data"
                                }
                            }
                        }
                    },
                    "422":
                    {
                        "description": "Validation Error",
                        "content":
                        {
                            "application/json":
                            {
                                "schema":
                                {
                                    "$ref": "#/components/schemas/HTTPValidationError"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components":
    {
        "schemas":
        {
            "HTTPValidationError":
            {
                "properties":
                {
                    "detail":
                    {
                        "items":
                        {
                            "$ref": "#/components/schemas/ValidationError"
                        },
                        "type": "array",
                        "title": "Detail"
                    }
                },
                "type": "object",
                "title": "HTTPValidationError"
            },
            "UnitSystem":
            {
                "type": "string",
                "enum":
                [
                    "SI",
                    "FPS"
                ],
                "title": "UnitSystem"
            },
            "ValidationError":
            {
                "properties":
                {
                    "loc":
                    {
                        "items":
                        {
                            "anyOf":
                            [
                                {
                                    "type": "string"
                                },
                                {
                                    "type": "integer"
                                }
                            ]
                        },
                        "type": "array",
                        "title": "Location"
                    },
                    "msg":
                    {
                        "type": "string",
                        "title": "Message"
                    },
                    "type":
                    {
                        "type": "string",
                        "title": "Error Type"
                    }
                },
                "type": "object",
                "required":
                [
                    "loc",
                    "msg",
                    "type"
                ],
                "title": "ValidationError"
            }
        }
    }
}

I generate the client code via:

npx @openapitools/openapi-generator-cli \
	--custom-generator MATLAB/lib/jar/MATLABClientCodegen-openapi-generator-0.0.1.jar \
	generate \
	-g MATLAB \
	-i http://localhost:8000/openapi.json \
	--package-name exampleclient

This generates the following tree:

+exampleclient
├── +api
│   └── Default.m
├── +models
│   ├── FreeFormObject.m
│   ├── HTTPValidationError.m
│   ├── UnitSystem.m
│   ├── Unit_System.m
│   ├── ValidationError.m
│   └── ValidationError_loc_inner.m
├── BaseClient.m
├── CookieJar.m
├── JSONEnum.m
├── JSONMapper.m
├── JSONMapperMap.m
└── JSONPropertyInfo.m

After this, I run into issues when querying. The output below demonstrates trying to call the endpoint in a number of different ways. All of these fail on the Matlab side before even attempting to communicate with the API.

Am I making a mistake, or is this somehow an edge case that is currently not working?

Errors when attempting to use the generated enum models
>> client = exampleclient.api.Default(serverUri="http://localhost:8000")

client = 

  Default with properties:

              serverUri: [1×1 matlab.net.URI]
            httpOptions: [1×1 matlab.net.http.HTTPOptions]
    preferredAuthMethod: [0×0 string]
            bearerToken: '<unset>'
                 apiKey: '<unset>'
        httpCredentials: '<unset>'
                cookies: [1×1 exampleclient.CookieJar]

>> client.getData(unit_system="SI")
Error using matlab.net.QueryParameter>convert
Unable to convert the value of the query parameter
"unit_system" of type exampleclient.models.Unit_System
to a string.

Error in matlab.net.QueryParameter/string (line 351)
                    values = convert(obj.Name, value, obj.Literal);

Error in matlab.net.URI/string (line 673)
                query = '?' + string(obj.Query);

Error in matlab.net.URI/char (line 696)
            str = string(obj);

Error in matlab.net.http.RequestMessage>getProxySettings (line 2133)
    proxyInfo = matlab.internal.webservices.getProxyInfo(char(uri));

Error in matlab.net.http.RequestMessage/send (line 405)
                    [proxyURI, username, password] = getProxySettings(createURIFromInput(uri));

Error in exampleclient.api.Default/getData (line 175)
            [response, ~, history] = send(request, uri, httpOptions);
 
>> client.getData(unit_system=exampleclient.models.UnitSystem.SI)
Error using exampleclient.api.Default/getData
 client.getData(unit_system=exampleclient.models.UnitSystem.SI)
                            ↑
Invalid value for 'unit_system' argument. Value must be of type exampleclient.models.Unit_System or be convertible
to exampleclient.models.Unit_System.
 
>> client.getData(unit_system=exampleclient.models.Unit_System("SI"))
Error using matlab.net.QueryParameter>convert
Unable to convert the value of the query parameter "unit_system" of type exampleclient.models.Unit_System to a
string.

Error in matlab.net.QueryParameter/string (line 351)
                    values = convert(obj.Name, value, obj.Literal);

Error in matlab.net.URI/string (line 673)
                query = '?' + string(obj.Query);

Error in matlab.net.URI/char (line 696)
            str = string(obj);

Error in matlab.net.http.RequestMessage>getProxySettings (line 2133)
    proxyInfo = matlab.internal.webservices.getProxyInfo(char(uri));

Error in matlab.net.http.RequestMessage/send (line 405)
                    [proxyURI, username, password] = getProxySettings(createURIFromInput(uri));

Error in exampleclient.api.Default/getData (line 175)
            [response, ~, history] = send(request, uri, httpOptions);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions