apple / swift-openapi-generator

Generate Swift client and server code from an OpenAPI document.
https://swiftpackageindex.com/apple/swift-openapi-generator/documentation
Apache License 2.0
1.23k stars 89 forks source link

Optional type alias issue #512

Closed Kyle-Ye closed 4 months ago

Kyle-Ye commented 4 months ago

Description

draft_sequence has appeared multi place in openapi.yml file. Its type is "Int?" here.

So I add an OptionalInt type to rest myself from repeating. But the generated code is a little unexpected.

Reproduction

paths:
  "/t/{id}.json":
    get:
      ...
      responses:
        '200':
          description: specific posts
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  draft_sequence:
                    $ref: '#/components/schemas/OptionalInt'

components:
  schemas:
    OptionalInt:
      type:
      - integer
      - 'null'

Package version(s)

1.2.0

Expected behavior

public var draft_sequence: Components.Schemas.OptionalInt

/// - Remark: Generated from `#/components/schemas/OptionalInt`.
public typealias OptionalInt = Swift.Int?

Actual behavior

public var draft_sequence: Components.Schemas.OptionalInt?

/// - Remark: Generated from `#/components/schemas/OptionalInt`.
public typealias OptionalInt = Swift.Int

Environment

Swift 5.9.2

Additional information

None

simonjbeaumont commented 4 months ago

@Kyle-Ye yes, it's current behaviour that we propagate the optionality to the point of use, and strip it from the type alias or struct in the components. The reason this has resulted in confusing looking code is the explicit use of "Optional" in the type name in the OpenAPI document.

While this might have been unexpected, does it present you with any issues? It's hard to tell from this example since it seems to be semantically equivalent, but maybe the snippet above is a simplification of what you are trying to achieve, and that, in your actual use case, draft_sequence is actually a much more complex type?

If so, what's it's rough shape? Is it an object?

Kyle-Ye commented 4 months ago

yes, it's current behaviour that we propagate the optionality to the point of use, and strip it from the type alias or struct in the components. The reason this has resulted in confusing looking code is the explicit use of "Optional" in the type name in the OpenAPI document.

While this might have been unexpected, does it present you with any issues? It's hard to tell from this example since it seems to be semantically equivalent, but maybe the snippet above is a simplification of what you are trying to achieve, and that, in your actual use case, draft_sequence is actually a much more complex type?

If so, what's it's rough shape? Is it an object?

Got it. I'll update the name instead. eg. OptionalInt to DraftSequence so that we'll get the following result.

public var draft_sequence: Components.Schemas.DraftSequence?

/// - Remark: Generated from `#/components/schemas/OptionalInt`.
public typealias DraftSequence = Swift.Int