Skip to content

Commit 795fa34

Browse files
committed
Polished InterposeError’s conformance to Equatable
1 parent 7f8c048 commit 795fa34

File tree

1 file changed

+67
-30
lines changed

1 file changed

+67
-30
lines changed

Sources/InterposeKit/InterposeError.swift

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import Foundation
1+
import ObjectiveC
22

3-
public enum InterposeError: LocalizedError {
3+
public enum InterposeError: Error {
44

55
/// No instance method found for the selector on the specified class.
66
///
@@ -85,34 +85,71 @@ public enum InterposeError: LocalizedError {
8585
}
8686

8787
extension InterposeError: Equatable {
88-
// Lazy equating via string compare
89-
public static func == (lhs: InterposeError, rhs: InterposeError) -> Bool {
90-
return lhs.errorDescription == rhs.errorDescription
91-
}
92-
93-
public var errorDescription: String {
94-
switch self {
95-
case .methodNotFound(let `class`, let selector):
96-
return "Method not found: -[\(`class`) \(selector)]"
97-
case .methodNotDirectlyImplemented(let `class`, let selector):
98-
return "Method not directly implemented: -[\(`class`) \(selector)]"
99-
case .implementationNotFound(let `class`, let selector):
100-
return "Implementation not found: -[\(`class`) \(selector)]"
101-
case .revertCorrupted(let `class`, let selector, let IMP):
102-
return "Unexpected Implementation in -[\(`class`) \(selector)]: \(String(describing: IMP))"
103-
case .subclassCreationFailed(let subclassName, let object):
104-
return "Failed to allocate class pair: \(object), \(subclassName)"
105-
case .kvoDetected(let obj):
106-
return "Unable to hook object that uses Key Value Observing: \(obj)"
107-
case .unexpectedDynamicSubclass(let obj, let actualClass):
108-
return "Unable to hook \(type(of: obj)) posing as \(NSStringFromClass(actualClass))/"
109-
case .unknownError(let reason):
110-
return reason
88+
public static func == (lhs: Self, rhs: Self) -> Bool {
89+
switch lhs {
90+
case let .methodNotFound(lhsClass, lhsSelector):
91+
switch rhs {
92+
case let .methodNotFound(rhsClass, rhsSelector):
93+
return lhsClass == rhsClass && lhsSelector == rhsSelector
94+
default:
95+
return false
96+
}
97+
98+
case let .methodNotDirectlyImplemented(lhsClass, lhsSelector):
99+
switch rhs {
100+
case let .methodNotDirectlyImplemented(rhsClass, rhsSelector):
101+
return lhsClass == rhsClass && lhsSelector == rhsSelector
102+
default:
103+
return false
104+
}
105+
106+
case let .implementationNotFound(lhsClass, lhsSelector):
107+
switch rhs {
108+
case let .implementationNotFound(rhsClass, rhsSelector):
109+
return lhsClass == rhsClass && lhsSelector == rhsSelector
110+
default:
111+
return false
112+
}
113+
114+
case let .revertCorrupted(lhsClass, lhsSelector, lhsIMP):
115+
switch rhs {
116+
case let .revertCorrupted(rhsClass, rhsSelector, rhsIMP):
117+
return lhsClass == rhsClass && lhsSelector == rhsSelector && lhsIMP == rhsIMP
118+
default:
119+
return false
120+
}
121+
122+
case let .subclassCreationFailed(lhsName, lhsObject):
123+
switch rhs {
124+
case let .subclassCreationFailed(rhsName, rhsObject):
125+
return lhsName == rhsName && lhsObject === rhsObject
126+
default:
127+
return false
128+
}
129+
130+
case let .kvoDetected(lhsObject):
131+
switch rhs {
132+
case let .kvoDetected(rhsObject):
133+
return lhsObject === rhsObject
134+
default:
135+
return false
136+
}
137+
138+
case let .unexpectedDynamicSubclass(lhsObject, lhsClass):
139+
switch rhs {
140+
case let .unexpectedDynamicSubclass(rhsObject, rhsClass):
141+
return lhsObject === rhsObject && lhsClass == rhsClass
142+
default:
143+
return false
144+
}
145+
146+
case let .unknownError(lhsReason):
147+
switch rhs {
148+
case let .unknownError(rhsReason):
149+
return lhsReason == rhsReason
150+
default:
151+
return false
152+
}
111153
}
112154
}
113-
114-
@discardableResult func log() -> InterposeError {
115-
Interpose.log(self.errorDescription)
116-
return self
117-
}
118155
}

0 commit comments

Comments
 (0)