Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] [Crystal] Free-Form Object results in "Error: undefined constant AnyType" #13685

Closed
5 of 6 tasks
grokify opened this issue Oct 13, 2022 · 1 comment · Fixed by #13737
Closed
5 of 6 tasks

[BUG] [Crystal] Free-Form Object results in "Error: undefined constant AnyType" #13685

grokify opened this issue Oct 13, 2022 · 1 comment · Fixed by #13737

Comments

@grokify
Copy link
Member

grokify commented Oct 13, 2022

Bug Report Checklist

  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator (example)?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
  • [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description

Generation of Crystal client using Free-Form object results in compile time error Error: undefined constant AnyType.

Free-form objects are described here: https://swagger.io/docs/specification/data-models/dictionaries/#free-form

Free-Form Objects

If the dictionary values can be of any type (aka free-form object), use additionalProperties: true:

type: object
additionalProperties: true

This is equivalent to:

type: object
additionalProperties: {}

Running crystal spec results in the following:

% crystal spec
Showing last frame. Use --error-trace for full trace.

In src/addlprops/models/pet.cr:27:34

 27 | property info : Hash(String, AnyType)?
                                   ^------
Error: undefined constant AnyType

This is due to the following generated code:

    # Optional properties
    @[JSON::Field(key: "info", type: Hash(String, AnyType)?, nillable: true, emit_null: false)]
    property info : Hash(String, AnyType)?

Ref: https://github.com/grokify/crystal-addlprops/blob/a07dab7def7d699cb52b30cd354cfd181e9cd6a4/src/addlprops/models/pet.cr#L25-L27

openapi-generator version

The following versions have been tested:

  • 6.2.0
  • openapi-generator-cli-7.0.0-20221012.083708-4.jar
OpenAPI declaration file content or url

The entire spec is here:

https://github.com/grokify/crystal-addlprops/blob/a07dab7def7d699cb52b30cd354cfd181e9cd6a4/spec_addlprop_oas3.yaml

The definition causing the issue is here:

        info:
          type: object
          additionalProperties: {}

The same result occurs for:

        info:
          type: object
          additionalProperties: true

Ref: https://github.com/grokify/crystal-addlprops/blob/a07dab7def7d699cb52b30cd354cfd181e9cd6a4/spec_addlprop_oas3.yaml#L42-L44

Generation Details

The generation command is here:

java -jar openapi-generator-cli.jar generate -i addlprop_spec.json -g crystal -o addlprops --additional-properties=shardName=addlprops,moduleName=Addlprops,shardLicense=MIT,shardVersion=0.1.0,shardAuthors=grokify,shardDescription=Additional\ Properties\ demo

Ref: https://github.com/grokify/crystal-addlprops/blob/d504e1da60eb1790f0972231d88f99871ec3a93a/generator.sh#L1

Steps to reproduce
  1. Run generator command to create the API client
  2. cd addlprops
  3. Patch src/addlprops/configuration.cr for issue Error: for empty hashes use '{} of KeyType => ValueType' by turning {} to Hash(String, String).new as seen here: https://github.com/grokify/crystal-addlprops/blob/d504e1da60eb1790f0972231d88f99871ec3a93a/src/addlprops/configuration.cr#L218-L221
  4. shards install
  5. crystal spec
Related issues/PRs

None

Suggest a fix

I was able to compile the client by changing Hash(String, AnyType) to Hash(String, Object).

@grokify grokify changed the title [BUG] [Crystal] Free-Form Object results in [BUG] [Crystal] Free-Form Object results in "Error: undefined constant AnyType" Oct 13, 2022
@cyangle
Copy link
Contributor

cyangle commented Oct 19, 2022

@grokify You can override the type mappings with command line option --type-mappings=AnyType=JSON::Any.

The double colons in JSON::Any are missing in the generated files and this issue is fixed in #13736

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants