Skip to content

Commit adb2152

Browse files
Generated enums for server variables are now feature flagged
1 parent 0508b76 commit adb2152

File tree

8 files changed

+5331
-165
lines changed

8 files changed

+5331
-165
lines changed

Sources/_OpenAPIGeneratorCore/FeatureFlags.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
public enum FeatureFlag: String, Hashable, Codable, CaseIterable, Sendable {
2929
// needs to be here for the enum to compile
3030
case empty
31+
32+
/// When enabled any server URL templating variables that have a defined
33+
/// enum field will be generated as an enum instead of raw Strings.
34+
case serverVariablesAsEnums = "ServerVariablesEnums"
3135
}
3236

3337
/// A set of enabled feature flags.

Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateServers.swift

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,49 +14,33 @@
1414
import OpenAPIKit
1515

1616
extension TypesFileTranslator {
17-
1817
/// Returns a declaration of a server URL static method defined in
19-
/// the OpenAPI document.
18+
/// the OpenAPI document. Also appends server variables enums
19+
/// into the variables namespace parameter, if any enums were
20+
/// generated.
2021
/// - Parameters:
2122
/// - index: The index of the server in the list of servers defined
2223
/// in the OpenAPI document.
2324
/// - server: The server URL information.
25+
/// - variablesNamespace: The enum namespace which is to contain
26+
/// any variable enum definitions that may be required.
2427
/// - Returns: A static method declaration, and a name for the variable to
2528
/// declare the method under.
26-
func translateServer(index: Int, server: OpenAPI.Server) -> Declaration {
27-
let methodName = "\(Constants.ServerURL.propertyPrefix)\(index+1)"
28-
let safeVariables = server.variables.map { (key, value) in
29-
(originalKey: key, swiftSafeKey: swiftSafeName(for: key), value: value)
30-
}
31-
let parameters: [ParameterDescription] = safeVariables.map { (originalKey, swiftSafeKey, value) in
32-
let memberPath: [String] = [
33-
Constants.ServerURL.variablesNamespace,
34-
translateServerVariablesEnumName(for: index),
35-
translateVariableToEnumName((originalKey, value))
36-
]
37-
return .init(
38-
label: swiftSafeName(for: originalKey),
39-
type: .member(memberPath),
40-
defaultValue: .identifierType(.member(memberPath + CollectionOfOne(Constants.ServerURL.defaultPropertyName)))
41-
)
42-
}
43-
let variableInitializers: [Expression] = safeVariables.map { (originalKey, swiftSafeKey, value) in
44-
return .dot("init")
45-
.call(
46-
[
47-
.init(label: "name", expression: .literal(originalKey)),
48-
.init(
49-
label: "value",
50-
expression: .memberAccess(.init(
51-
left: .identifierPattern(swiftSafeKey),
52-
right: "rawValue"
53-
))
54-
),
55-
]
56-
)
29+
func translateServer(index: Int, server: OpenAPI.Server, variablesNamespace: inout EnumDescription) -> Declaration {
30+
let serverVariables = translateServerVariableNamespace(index: index, server: server, variablesNamespaceName: variablesNamespace.name)
31+
32+
if let serverVariablesNamespace = serverVariables.decl {
33+
variablesNamespace.members.append(serverVariablesNamespace)
5734
}
35+
36+
let parameters = serverVariables.variables.map(\.parameter)
37+
let variableInitializers = serverVariables.variables.map(\.initializer)
38+
let functionComments = serverVariables.variables.map(\.functionComment)
39+
40+
let methodName = "\(Constants.ServerURL.propertyPrefix)\(index + 1)"
41+
5842
let methodDecl = Declaration.commentable(
59-
.functionComment(abstract: server.description, parameters: safeVariables.map { ($1, $2.description) }),
43+
.functionComment(abstract: server.description, parameters: functionComments),
6044
.function(
6145
accessModifier: config.access,
6246
kind: .function(name: methodName, isStatic: true),
@@ -87,10 +71,24 @@ extension TypesFileTranslator {
8771
/// - Parameter servers: The servers to include in the extension.
8872
/// - Returns: A declaration of an enum namespace of the server URLs type.
8973
func translateServers(_ servers: [OpenAPI.Server]) -> Declaration {
90-
var serverDecls = servers.enumerated().map(translateServer)
74+
var variablesNamespace = EnumDescription(
75+
accessModifier: config.access,
76+
name: Constants.ServerURL.variablesNamespace
77+
)
78+
79+
var serverDecls: [Declaration] = []
80+
81+
82+
for (index, decl) in servers.enumerated() {
83+
let serverDecl = translateServer(index: index, server: decl, variablesNamespace: &variablesNamespace)
84+
serverDecls.append(serverDecl)
85+
}
9186

92-
if let variablesDecl = translateServersVariables(servers) {
93-
serverDecls.insert(variablesDecl, at: 0)
87+
if !variablesNamespace.members.isEmpty {
88+
serverDecls.insert(.commentable(
89+
.doc("Server URL variables defined in the OpenAPI document."),
90+
.enum(variablesNamespace)
91+
), at: 0)
9492
}
9593

9694
return .commentable(

0 commit comments

Comments
 (0)