Skip to content

Commit 6593b1b

Browse files
authored
Add a CLI option for selecting the naming strategy (#708)
### Motivation The recently introduced naming strategy is only configurable in the config file, but pure CLI users might also want to use it without creating a config file. ### Modifications Add a `--naming-strategy` option to the `swift-openapi-generator` CLI. ### Result Users can use the new naming strategy without creating a config file, if they didn't have one before. ### Test Plan Tested manually on a sample project.
1 parent 9c01b32 commit 6593b1b

File tree

4 files changed

+19
-7
lines changed

4 files changed

+19
-7
lines changed

Sources/_OpenAPIGeneratorCore/Config.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
/// A strategy for turning OpenAPI identifiers into Swift identifiers.
16-
public enum NamingStrategy: String, Sendable, Codable, Equatable {
16+
public enum NamingStrategy: String, Sendable, Codable, Equatable, CaseIterable {
1717

1818
/// A defensive strategy that can handle any OpenAPI identifier and produce a non-conflicting Swift identifier.
1919
///
@@ -54,6 +54,9 @@ public struct Config: Sendable {
5454
/// Defaults to `defensive`.
5555
public var namingStrategy: NamingStrategy
5656

57+
/// The default naming strategy.
58+
public static let defaultNamingStrategy: NamingStrategy = .defensive
59+
5760
/// A map of OpenAPI identifiers to desired Swift identifiers, used instead of the naming strategy.
5861
public var nameOverrides: [String: String]
5962

@@ -76,7 +79,7 @@ public struct Config: Sendable {
7679
access: AccessModifier,
7780
additionalImports: [String] = [],
7881
filter: DocumentFilter? = nil,
79-
namingStrategy: NamingStrategy = .defensive,
82+
namingStrategy: NamingStrategy = Config.defaultNamingStrategy,
8083
nameOverrides: [String: String] = [:],
8184
featureFlags: FeatureFlags = []
8285
) {

Sources/_OpenAPIGeneratorCore/Layers/StructuredSwiftRepresentation.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ struct ImportDescription: Equatable, Codable {
5050
/// A description of an access modifier.
5151
///
5252
/// For example: `public`.
53-
public enum AccessModifier: String, Sendable, Equatable, Codable {
53+
public enum AccessModifier: String, Sendable, Equatable, Codable, CaseIterable {
5454

5555
/// A declaration accessible outside of the module.
5656
case `public`

Sources/swift-openapi-generator/GenerateOptions+runGenerator.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ extension _GenerateOptions {
3030
func runGenerator(outputDirectory: URL, pluginSource: PluginSource?, isDryRun: Bool) async throws {
3131
let config = try loadedConfig()
3232
let sortedModes = try resolvedModes(config)
33-
let resolvedAccessModifier = resolvedAccessModifier(config) ?? Config.defaultAccessModifier
33+
let resolvedAccessModifier = resolvedAccessModifier(config)
3434
let resolvedAdditionalImports = resolvedAdditionalImports(config)
3535
let resolvedNamingStragy = resolvedNamingStrategy(config)
3636
let resolvedNameOverrides = resolvedNameOverrides(config)

Sources/swift-openapi-generator/GenerateOptions.swift

+12-3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ struct _GenerateOptions: ParsableArguments {
3333
"The access modifier to use for the API of generated code. Default: \(Config.defaultAccessModifier.rawValue)"
3434
) var accessModifier: AccessModifier?
3535

36+
@Option(
37+
help:
38+
"The strategy for converting OpenAPI names into Swift names. Default: \(Config.defaultNamingStrategy.rawValue)"
39+
) var namingStrategy: NamingStrategy?
40+
3641
@Option(help: "Additional import to add to all generated files.") var additionalImport: [String] = []
3742

3843
@Option(help: "Pre-release feature to enable. Options: \(FeatureFlag.prettyListing).") var featureFlag:
@@ -44,6 +49,7 @@ struct _GenerateOptions: ParsableArguments {
4449
}
4550

4651
extension AccessModifier: ExpressibleByArgument {}
52+
extension NamingStrategy: ExpressibleByArgument {}
4753

4854
extension _GenerateOptions {
4955

@@ -60,10 +66,10 @@ extension _GenerateOptions {
6066
/// Returns the access modifier requested by the user.
6167
/// - Parameter config: The configuration specified by the user.
6268
/// - Returns: The access modifier requested by the user, or nil if the default should be used.
63-
func resolvedAccessModifier(_ config: _UserConfig?) -> AccessModifier? {
69+
func resolvedAccessModifier(_ config: _UserConfig?) -> AccessModifier {
6470
if let accessModifier { return accessModifier }
6571
if let accessModifier = config?.accessModifier { return accessModifier }
66-
return nil
72+
return Config.defaultAccessModifier
6773
}
6874

6975
/// Returns a list of additional imports requested by the user.
@@ -78,7 +84,10 @@ extension _GenerateOptions {
7884
/// Returns the naming strategy requested by the user.
7985
/// - Parameter config: The configuration specified by the user.
8086
/// - Returns: The naming strategy requestd by the user.
81-
func resolvedNamingStrategy(_ config: _UserConfig?) -> NamingStrategy { config?.namingStrategy ?? .defensive }
87+
func resolvedNamingStrategy(_ config: _UserConfig?) -> NamingStrategy {
88+
if let namingStrategy { return namingStrategy }
89+
return config?.namingStrategy ?? Config.defaultNamingStrategy
90+
}
8291

8392
/// Returns the name overrides requested by the user.
8493
/// - Parameter config: The configuration specified by the user.

0 commit comments

Comments
 (0)