|
1 | | -import Foundation |
| 1 | +import ObjectiveC |
2 | 2 |
|
3 | | -public enum InterposeError: LocalizedError { |
| 3 | +public enum InterposeError: Error { |
4 | 4 |
|
5 | 5 | /// No instance method found for the selector on the specified class. |
6 | 6 | /// |
@@ -85,34 +85,71 @@ public enum InterposeError: LocalizedError { |
85 | 85 | } |
86 | 86 |
|
87 | 87 | 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 | + } |
111 | 153 | } |
112 | 154 | } |
113 | | - |
114 | | - @discardableResult func log() -> InterposeError { |
115 | | - Interpose.log(self.errorDescription) |
116 | | - return self |
117 | | - } |
118 | 155 | } |
0 commit comments