Skip to content

Commit 762925d

Browse files
committed
Finished refactoring
1 parent 603970c commit 762925d

21 files changed

+136
-152
lines changed

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateAllAnyOneOf.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ extension TypesFileTranslator {
209209
let decoder: Declaration
210210
if let discriminator {
211211
let originalName = discriminator.propertyName
212-
let swiftName = context.asSwiftSafeName(originalName, .noncapitalized)
212+
let swiftName = context.safeNameGenerator.swiftMemberName(for: originalName)
213213
codingKeysDecls = [
214214
.enum(
215215
accessModifier: config.access,

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateRawEnum.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,12 @@ extension FileTranslator {
101101
// This is unlikely to be fixed, so handling that case here.
102102
// https://github.com/apple/swift-openapi-generator/issues/118
103103
if isNullable && anyValue is Void {
104-
try addIfUnique(id: .string(""), caseName: context.asSwiftSafeName("", .noncapitalized))
104+
try addIfUnique(id: .string(""), caseName: context.safeNameGenerator.swiftMemberName(for: ""))
105105
} else {
106106
guard let rawValue = anyValue as? String else {
107107
throw GenericError(message: "Disallowed value for a string enum '\(typeName)': \(anyValue)")
108108
}
109-
let caseName = context.asSwiftSafeName(rawValue, .noncapitalized)
109+
let caseName = context.safeNameGenerator.swiftMemberName(for: rawValue)
110110
try addIfUnique(id: .string(rawValue), caseName: caseName)
111111
}
112112
case .integer:

Sources/_OpenAPIGeneratorCore/Translator/CommonTypes/DiscriminatorExtensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ extension FileTranslator {
8080
/// - Parameter type: The `OneOfMappedType` for which to determine the case name.
8181
/// - Returns: A string representing the safe Swift name for the specified `OneOfMappedType`.
8282
func safeSwiftNameForOneOfMappedCase(_ type: OneOfMappedType) -> String {
83-
context.asSwiftSafeName(type.rawNames[0], .noncapitalized)
83+
context.safeNameGenerator.swiftMemberName(for: type.rawNames[0])
8484
}
8585
}
8686

Sources/_OpenAPIGeneratorCore/Translator/CommonTypes/StructBlueprint.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ struct PropertyBlueprint {
153153
extension PropertyBlueprint {
154154

155155
/// A name that is verified to be a valid Swift identifier.
156-
var swiftSafeName: String { context.asSwiftSafeName(originalName, .noncapitalized) }
156+
var swiftSafeName: String { context.safeNameGenerator.swiftMemberName(for: originalName) }
157157

158158
/// The JSON path to the property.
159159
///

Sources/_OpenAPIGeneratorCore/Translator/FileTranslator.swift

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,35 +44,50 @@ protocol FileTranslator {
4444
func translateFile(parsedOpenAPI: ParsedOpenAPIRepresentation) throws -> StructuredSwiftRepresentation
4545
}
4646

47+
/// A generator that allows overriding the documented name.
48+
struct OverridableSafeNameGenerator: SafeNameGenerator {
49+
50+
/// The upstream name generator for names that aren't overriden.
51+
var upstream: any SafeNameGenerator
52+
53+
/// A set of overrides, where the key is the documented name and the value the desired identifier.
54+
var overrides: [String: String]
55+
56+
func swiftTypeName(for documentedName: String) -> String {
57+
if let override = overrides[documentedName] { return override }
58+
return upstream.swiftTypeName(for: documentedName)
59+
}
60+
61+
func swiftMemberName(for documentedName: String) -> String {
62+
if let override = overrides[documentedName] { return override }
63+
return upstream.swiftMemberName(for: documentedName)
64+
}
65+
66+
func swiftContentTypeName(for contentType: ContentType) -> String {
67+
upstream.swiftContentTypeName(for: contentType)
68+
}
69+
}
70+
4771
extension FileTranslator {
4872

4973
/// A new context from the file translator.
5074
var context: TranslatorContext {
51-
let asSwiftSafeName: (String, SwiftNameOptions) -> String
75+
let safeNameGenerator: any SafeNameGenerator
5276
switch config.namingStrategy {
53-
case .defensive: asSwiftSafeName = { $0.safeForSwiftCode_defensive(options: $1) }
54-
case .idiomatic: asSwiftSafeName = { $0.safeForSwiftCode_idiomatic(options: $1) }
77+
case .defensive: safeNameGenerator = .defensive
78+
case .idiomatic: safeNameGenerator = .idiomatic
5579
}
56-
let overrides = config.nameOverrides
57-
return TranslatorContext(
58-
asSwiftSafeName: { name, options in
59-
if let override = overrides[name] { return override }
60-
return asSwiftSafeName(name, options)
61-
},
62-
namingStrategy: config.namingStrategy
80+
let overridingGenerator = OverridableSafeNameGenerator(
81+
upstream: safeNameGenerator,
82+
overrides: config.nameOverrides
6383
)
84+
return TranslatorContext(safeNameGenerator: overridingGenerator)
6485
}
6586
}
6687

6788
/// A set of configuration values for concrete file translators.
6889
struct TranslatorContext {
6990

70-
/// A closure that returns a copy of the string modified to be a valid Swift identifier.
71-
///
72-
/// - Parameter string: The string to convert to be safe for Swift.
73-
/// - Returns: A Swift-safe version of the input string.
74-
var asSwiftSafeName: (String, SwiftNameOptions) -> String
75-
76-
/// The naming strategy.
77-
var namingStrategy: NamingStrategy
91+
/// A type that generates safe names for use as Swift identifiers.
92+
var safeNameGenerator: any SafeNameGenerator
7893
}

Sources/_OpenAPIGeneratorCore/Translator/Multipart/MultipartContentInspector.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ extension FileTranslator {
120120
}
121121
var parts: [MultipartSchemaTypedContent] = try topLevelObject.properties.compactMap {
122122
(key, value) -> MultipartSchemaTypedContent? in
123-
let swiftSafeName = context.asSwiftSafeName(key, .capitalized)
123+
let swiftSafeName = context.safeNameGenerator.swiftTypeName(for: key)
124124
let typeName = typeName.appending(
125125
swiftComponent: swiftSafeName + Constants.Global.inlineTypeSuffix,
126126
jsonComponent: key

Sources/_OpenAPIGeneratorCore/Translator/Multipart/translateMultipart.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ extension TypesFileTranslator {
137137
switch part {
138138
case .documentedTyped(let documentedPart):
139139
let caseDecl: Declaration = .enumCase(
140-
name: context.asSwiftSafeName(documentedPart.originalName, .noncapitalized),
140+
name: context.safeNameGenerator.swiftMemberName(for: documentedPart.originalName),
141141
kind: .nameWithAssociatedValues([.init(type: .init(part.wrapperTypeUsage))])
142142
)
143143
let decl = try translateMultipartPartContent(
@@ -404,7 +404,7 @@ extension FileTranslator {
404404
switch part {
405405
case .documentedTyped(let part):
406406
let originalName = part.originalName
407-
let identifier = context.asSwiftSafeName(originalName, .noncapitalized)
407+
let identifier = context.safeNameGenerator.swiftMemberName(for: originalName)
408408
let contentType = part.partInfo.contentType
409409
let partTypeName = part.typeName
410410
let schema = part.schema
@@ -613,7 +613,7 @@ extension FileTranslator {
613613
switch part {
614614
case .documentedTyped(let part):
615615
let originalName = part.originalName
616-
let identifier = context.asSwiftSafeName(originalName, .noncapitalized)
616+
let identifier = context.safeNameGenerator.swiftMemberName(for: originalName)
617617
let contentType = part.partInfo.contentType
618618
let headersTypeName = part.typeName.appending(
619619
swiftComponent: Constants.Operation.Output.Payload.Headers.typeName,

Sources/_OpenAPIGeneratorCore/Translator/Operations/OperationDescription.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ extension OperationDescription {
8383
/// Uses the `operationID` value in the OpenAPI operation, if one was
8484
/// specified. Otherwise, computes a unique name from the operation's
8585
/// path and HTTP method.
86-
var methodName: String { context.asSwiftSafeName(operationID, .noncapitalized) }
86+
var methodName: String { context.safeNameGenerator.swiftMemberName(for: operationID) }
8787

8888
/// Returns a Swift-safe type name for the operation.
8989
///
9090
/// Uses the `operationID` value in the OpenAPI operation, if one was
9191
/// specified. Otherwise, computes a unique name from the operation's
9292
/// path and HTTP method.
93-
var operationTypeName: String { context.asSwiftSafeName(operationID, .capitalized) }
93+
var operationTypeName: String { context.safeNameGenerator.swiftTypeName(for: operationID) }
9494

9595
/// Returns the identifier for the operation.
9696
///
@@ -299,7 +299,7 @@ extension OperationDescription {
299299
}
300300
let newPath = OpenAPI.Path(newComponents, trailingSlash: path.trailingSlash)
301301
let names: [Expression] = orderedPathParameters.map { param in
302-
.identifierPattern("input").dot("path").dot(context.asSwiftSafeName(param, .noncapitalized))
302+
.identifierPattern("input").dot("path").dot(context.safeNameGenerator.swiftMemberName(for: param))
303303
}
304304
let arrayExpr: Expression = .literal(.array(names))
305305
return (newPath.rawValue, arrayExpr)

Sources/_OpenAPIGeneratorCore/Translator/Parameters/TypedParameter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extension TypedParameter {
4848
var name: String { parameter.name }
4949

5050
/// The name of the parameter sanitized to be a valid Swift identifier.
51-
var variableName: String { context.asSwiftSafeName(name, .noncapitalized) }
51+
var variableName: String { context.safeNameGenerator.swiftMemberName(for: name) }
5252

5353
/// A Boolean value that indicates whether the parameter must be specified
5454
/// when performing the OpenAPI operation.

Sources/_OpenAPIGeneratorCore/Translator/RequestBody/translateRequestBody.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ extension TypesFileTranslator {
5252
bodyMembers.append(contentsOf: inlineTypeDecls)
5353
}
5454
let contentType = content.content.contentType
55-
let identifier = typeAssigner.contentSwiftName(contentType)
55+
let identifier = context.safeNameGenerator.swiftContentTypeName(for: contentType)
5656
let associatedType = content.resolvedTypeUsage.withOptional(false)
5757
let contentCase: Declaration = .commentable(
5858
contentType.docComment(typeName: contentTypeName),
@@ -148,7 +148,7 @@ extension ClientFileTranslator {
148148
var cases: [SwitchCaseDescription] = try contents.map { typedContent in
149149
let content = typedContent.content
150150
let contentType = content.contentType
151-
let contentTypeIdentifier = typeAssigner.contentSwiftName(contentType)
151+
let contentTypeIdentifier = context.safeNameGenerator.swiftContentTypeName(for: contentType)
152152
let contentTypeHeaderValue = contentType.headerValueForSending
153153

154154
let extraBodyAssignArgs: [FunctionArgumentDescription]
@@ -251,7 +251,7 @@ extension ServerFileTranslator {
251251
argumentNames: ["value"],
252252
body: [
253253
.expression(
254-
.dot(typeAssigner.contentSwiftName(typedContent.content.contentType))
254+
.dot(context.safeNameGenerator.swiftContentTypeName(for: typedContent.content.contentType))
255255
.call([.init(label: nil, expression: .identifierPattern("value"))])
256256
)
257257
]

0 commit comments

Comments
 (0)