apple / apple/swift-openapi-generator

Support mixed schemas of type: object + allOf/oneOf/anyOf

Open
#689 3 comments 2 reactions 0 assignees View on GitHub
kind/enhancement
Dominant language
Swift
Stars
2k
Forks
182
Avg merge
13h 28m
Merged PRs (30d)
5

Description

### Description

The GitHub API spec has something like this for the request body of the `checks/create` operation:

```yaml
type: object
properties:
name: ...
head_sha: ...
details_url: ...
external_id: ...
status: ...
started_at: ...
conclusion: ...
completed_at: ...
output: ...
actions: ...
required:
- name
- head_sha
oneOf:
- properties:
status:
enum:
- completed
required:
- status
- conclusion
additionalProperties: true
- properties:
status:
enum:
- queued
- in_progress
additionalProperties: true
```

But when Swift OpenAPI Generator generates this request body, it _only_ creates the `status` property from the `oneOf` section, and none of the other properties from the `properties` section.

### Reproduction

openapi.yaml:
https://github.com/github/rest-api-description/blob/main/descriptions/ghes-3.5/ghes-3.5.yaml

openapi-generator-config.yaml:
```yaml
generate:
- types
- client
accessModifier: public
filter:
tags:
- apps
- checks
```

### Package version(s)

```
.
├── swift-openapi-generator
│ ├── swift-algorithms
│ │ └── swift-numerics
│ ├── swift-collections
│ ├── openapikit
│ │ └── yams
│ ├── yams
│ └── swift-argument-parser
├── swift-openapi-runtime
│ └── swift-http-types
├── swift-openapi-urlsession
│ ├── swift-openapi-runtime
│ │ └── swift-http-types
│ ├── swift-http-types
│ └── swift-collections
├── swift-argument-parser
├── hummingbird
│ ├── swift-async-algorithms
│ │ └── swift-collections
│ ├── swift-atomics
│ ├── swift-collections
│ ├── swift-log
│ ├── swift-http-types
│ ├── swift-metrics
│ ├── swift-distributed-tracing
│ │ └── swift-service-context
│ ├── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-extras
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ ├── swift-nio-http2
│ │ │ ├── swift-nio
│ │ │ │ ├── swift-atomics
│ │ │ │ ├── swift-collections
│ │ │ │ └── swift-system
│ │ │ └── swift-atomics
│ │ └── swift-http-types
│ ├── swift-nio-http2
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-nio-ssl
│ │ └── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-transport-services
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-service-lifecycle
│ │ ├── swift-log
│ │ └── swift-async-algorithms
│ │ └── swift-collections
│ └── async-http-client
│ ├── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-ssl
│ │ └── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-http2
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-nio-extras
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ ├── swift-nio-http2
│ │ │ ├── swift-nio
│ │ │ │ ├── swift-atomics
│ │ │ │ ├── swift-collections
│ │ │ │ └── swift-system
│ │ │ └── swift-atomics
│ │ └── swift-http-types
│ ├── swift-nio-transport-services
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-log
│ ├── swift-atomics
│ └── swift-algorithms
│ └── swift-numerics
├── swift-openapi-hummingbird
│ ├── swift-openapi-runtime
│ │ └── swift-http-types
│ └── hummingbird
│ ├── swift-async-algorithms
│ │ └── swift-collections
│ ├── swift-atomics
│ ├── swift-collections
│ ├── swift-log
│ ├── swift-http-types
│ ├── swift-metrics
│ ├── swift-distributed-tracing
│ │ └── swift-service-context
│ ├── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-extras
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ ├── swift-nio-http2
│ │ │ ├── swift-nio
│ │ │ │ ├── swift-atomics
│ │ │ │ ├── swift-collections
│ │ │ │ └── swift-system
│ │ │ └── swift-atomics
│ │ └── swift-http-types
│ ├── swift-nio-http2
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-nio-ssl
│ │ └── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-transport-services
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-service-lifecycle
│ │ ├── swift-log
│ │ └── swift-async-algorithms
│ │ └── swift-collections
│ └── async-http-client
│ ├── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-ssl
│ │ └── swift-nio
│ │ ├── swift-atomics
│ │ ├── swift-collections
│ │ └── swift-system
│ ├── swift-nio-http2
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-nio-extras
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ ├── swift-nio-http2
│ │ │ ├── swift-nio
│ │ │ │ ├── swift-atomics
│ │ │ │ ├── swift-collections
│ │ │ │ └── swift-system
│ │ │ └── swift-atomics
│ │ └── swift-http-types
│ ├── swift-nio-transport-services
│ │ ├── swift-nio
│ │ │ ├── swift-atomics
│ │ │ ├── swift-collections
│ │ │ └── swift-system
│ │ └── swift-atomics
│ ├── swift-log
│ ├── swift-atomics
│ └── swift-algorithms
│ └── swift-numerics
└── jwt-kit
├── swift-crypto
│ └── swift-asn1
├── swift-certificates
│ ├── swift-crypto
│ │ └── swift-asn1
│ └── swift-asn1
└── swift-log
```

### Expected behavior

Expected to see all of the properties for the `requestBody` in the `Input` (e.g. `name`, `head_sha`, `details_url`, etc.), but I only have an enum with two cases that contain `status`.

### Environment

swift version: 6.0

### Additional information

_No response_

Contributor guide

Open the contributing guide

Research direction

Start with the linked ghes-3.5.yaml reproduction and openapi-generator-config.yaml, then run generation for the types and client targets filtered to apps and checks. Trace how the generator handles a schema with top-level properties plus oneOf, and verify that the generated request model retains both the shared properties and the oneOf-specific status fields.

Written by the indexing model from the issue text.

Assessment

Tech stack
openapi, swift
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.