Skip to content

Commit 72f1ed5

Browse files
committed
Add validation hook to configuration parsing
1 parent 9ebd6ae commit 72f1ed5

File tree

4 files changed

+22
-0
lines changed

4 files changed

+22
-0
lines changed

Source/SwiftLintCore/Models/Issue.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ public enum Issue: LocalizedError, Equatable {
2020
/// Some configuration keys are invalid.
2121
case invalidConfigurationKeys(ruleID: String, keys: Set<String>)
2222

23+
/// The configuration is inconsistent, that is options are mutually exclusive or one drives other values
24+
/// irrelevant.
25+
case inconsistentConfiguration(ruleID: String, message: String)
26+
2327
/// Used rule IDs are invalid.
2428
case invalidRuleIDs(Set<String>)
2529

@@ -154,6 +158,8 @@ public enum Issue: LocalizedError, Equatable {
154158
return "'\(old)' has been renamed to '\(new)' and will be completely removed in a future release."
155159
case let .invalidConfigurationKeys(id, keys):
156160
return "Configuration for '\(id)' rule contains the invalid key(s) \(keys.formatted)."
161+
case let .inconsistentConfiguration(id, message):
162+
return "Inconsistent configuration for '\(id)' rule: \(message)"
157163
case let .invalidRuleIDs(ruleIDs):
158164
return "The key(s) \(ruleIDs.formatted) used as rule identifier(s) is/are invalid."
159165
case let .ruleNotPresentInOnlyRules(id):

Source/SwiftLintCore/Protocols/RuleConfiguration.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ public protocol RuleConfiguration: Equatable {
1313
///
1414
/// - throws: Throws if the configuration is not in the expected format.
1515
mutating func apply(configuration: Any) throws
16+
17+
/// Run a sanity check on the configuration, perform optional postprocessing steps and/or warn about potential
18+
/// issues.
19+
mutating func validate() throws
1620
}
1721

1822
/// A configuration for a rule that allows to configure at least the severity.
@@ -30,6 +34,10 @@ public extension SeverityBasedRuleConfiguration {
3034

3135
public extension RuleConfiguration {
3236
var parameterDescription: RuleConfigurationDescription? { nil }
37+
38+
func validate() throws {
39+
// Do nothing by default.
40+
}
3341
}
3442

3543
public extension RuleConfiguration {

Source/SwiftLintCoreMacros/RuleConfigurationMacros.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ enum AutoConfigParser: MemberMacro {
8585
Issue.invalidConfigurationKeys(ruleID: Parent.identifier, keys: unknownKeys).print()
8686
}
8787
"""
88+
"""
89+
try validate()
90+
"""
8891
}),
8992
]
9093
}

Tests/MacroTests/AutoConfigParserTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ final class AutoConfigParserTests: XCTestCase {
4444
let unknownKeys = Set(configuration.keys).subtracting(supportedKeys)
4545
Issue.invalidConfigurationKeys(ruleID: Parent.identifier, keys: unknownKeys).print()
4646
}
47+
try validate()
4748
}
4849
}
4950
""",
@@ -90,6 +91,7 @@ final class AutoConfigParserTests: XCTestCase {
9091
let unknownKeys = Set(configuration.keys).subtracting(supportedKeys)
9192
Issue.invalidConfigurationKeys(ruleID: Parent.identifier, keys: unknownKeys).print()
9293
}
94+
try validate()
9395
}
9496
}
9597
""",
@@ -145,6 +147,7 @@ final class AutoConfigParserTests: XCTestCase {
145147
let unknownKeys = Set(configuration.keys).subtracting(supportedKeys)
146148
Issue.invalidConfigurationKeys(ruleID: Parent.identifier, keys: unknownKeys).print()
147149
}
150+
try validate()
148151
}
149152
}
150153
""",
@@ -171,6 +174,7 @@ final class AutoConfigParserTests: XCTestCase {
171174
let unknownKeys = Set(configuration.keys).subtracting(supportedKeys)
172175
Issue.invalidConfigurationKeys(ruleID: Parent.identifier, keys: unknownKeys).print()
173176
}
177+
try validate()
174178
}
175179
}
176180
""",
@@ -228,6 +232,7 @@ final class AutoConfigParserTests: XCTestCase {
228232
let unknownKeys = Set(configuration.keys).subtracting(supportedKeys)
229233
Issue.invalidConfigurationKeys(ruleID: Parent.identifier, keys: unknownKeys).print()
230234
}
235+
try validate()
231236
}
232237
}
233238
""",

0 commit comments

Comments
 (0)