apple / apple/swift-openapi-generator
Support mixed schemas of type: object + allOf/oneOf/anyOf
- 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
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