Skip to content

Commit 00e4346

Browse files
authored
Merge pull request #451 from mattpolzin/feature/442/parameter-header-features
Add OAS 3.2.0 parameter header features
2 parents 8508f98 + cb27c62 commit 00e4346

27 files changed

+924
-452
lines changed

Sources/OpenAPIKit/Parameter/DereferencedParameter.swift

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,26 +90,59 @@ extension OpenAPI.Parameter: ExternallyDereferenceable {
9090
// next line:
9191
// let (newSchemaOrContent, components) = try await schemaOrContent.externallyDereferenced(with: loader)
9292

93-
let newSchemaOrContent: Either<SchemaContext, OpenAPI.Content.Map>
93+
let newContext: OpenAPI.Parameter.Context
9494
let newComponents: OpenAPI.Components
9595
let newMessages: [Loader.Message]
9696

97-
switch schemaOrContent {
98-
case .a(let schemaContext):
99-
let (context, components, messages) = try await schemaContext.externallyDereferenced(with: loader)
100-
newSchemaOrContent = .a(context)
101-
newComponents = components
102-
newMessages = messages
103-
case .b(let contentMap):
104-
let (map, components, messages) = try await contentMap.externallyDereferenced(with: loader)
105-
newSchemaOrContent = .b(map)
106-
newComponents = components
107-
newMessages = messages
97+
switch context {
98+
case .query(required: let required, allowEmptyValue: let allowEmptyValue, schemaOrContent: let schemaOrContent):
99+
let newSchemaOrContent: Either<OpenAPI.Parameter.SchemaContext, OpenAPI.Content.Map>
100+
(newSchemaOrContent, newComponents, newMessages) = try await externallyDereference(schemaOrContent: schemaOrContent, with: Loader.self)
101+
102+
newContext = .query(required: required, allowEmptyValue: allowEmptyValue, schemaOrContent: newSchemaOrContent)
103+
104+
case .header(required: let required, schemaOrContent: let schemaOrContent):
105+
let newSchemaOrContent: Either<OpenAPI.Parameter.SchemaContext, OpenAPI.Content.Map>
106+
(newSchemaOrContent, newComponents, newMessages) = try await externallyDereference(schemaOrContent: schemaOrContent, with: Loader.self)
107+
108+
newContext = .header(required: required, schemaOrContent: newSchemaOrContent)
109+
110+
case .path(schemaOrContent: let schemaOrContent):
111+
let newSchemaOrContent: Either<OpenAPI.Parameter.SchemaContext, OpenAPI.Content.Map>
112+
(newSchemaOrContent, newComponents, newMessages) = try await externallyDereference(schemaOrContent: schemaOrContent, with: Loader.self)
113+
114+
newContext = .path(schemaOrContent: newSchemaOrContent)
115+
116+
case .cookie(required: let required, schemaOrContent: let schemaOrContent):
117+
let newSchemaOrContent: Either<OpenAPI.Parameter.SchemaContext, OpenAPI.Content.Map>
118+
(newSchemaOrContent, newComponents, newMessages) = try await externallyDereference(schemaOrContent: schemaOrContent, with: Loader.self)
119+
120+
newContext = .cookie(required: required, schemaOrContent: newSchemaOrContent)
121+
122+
case .querystring(required: let required, content: let content):
123+
let newContent: OpenAPI.Content.Map
124+
(newContent, newComponents, newMessages) = try await content.externallyDereferenced(with: Loader.self)
125+
126+
newContext = .querystring(required: required, content: newContent)
108127
}
109128

110129
var newParameter = self
111-
newParameter.schemaOrContent = newSchemaOrContent
130+
newParameter.context = newContext
112131

113132
return (newParameter, newComponents, newMessages)
114133
}
115134
}
135+
136+
fileprivate func externallyDereference<Loader: ExternalLoader>(
137+
schemaOrContent: Either<OpenAPI.Parameter.SchemaContext, OpenAPI.Content.Map>,
138+
with loader: Loader.Type
139+
) async throws -> (Either<OpenAPI.Parameter.SchemaContext, OpenAPI.Content.Map>, OpenAPI.Components, [Loader.Message]) {
140+
switch schemaOrContent {
141+
case .a(let schemaContext):
142+
let (context, components, messages) = try await schemaContext.externallyDereferenced(with: loader)
143+
return (.a(context), components, messages)
144+
case .b(let contentMap):
145+
let (map, components, messages) = try await contentMap.externallyDereferenced(with: loader)
146+
return (.b(map), components, messages)
147+
}
148+
}

0 commit comments

Comments
 (0)