From dcdfd5f8cfdfd3e0f856d73b59d9126715b93a3a Mon Sep 17 00:00:00 2001 From: Elvis Nunez Date: Sun, 1 Nov 2020 09:51:00 +0100 Subject: [PATCH] Revert "Merge pull request #273 from agarmash/remove-custom-result-type" This reverts commit 43ab355b9e9c6a34e3c813ff6e338aff599f9acb, reversing changes made to 87bf5e0a1d693d9c1213825e017230aedc8836fd. --- Cache.xcodeproj/project.pbxproj | 8 ++++ Source/Shared/Library/CacheResult.swift | 16 +++++++ Source/Shared/Storage/AsyncStorage.swift | 48 +++++++++---------- .../iOS/Tests/Storage/AsyncStorageTests.swift | 4 +- Tests/iOS/Tests/Storage/StorageTests.swift | 2 +- 5 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 Source/Shared/Library/CacheResult.swift diff --git a/Cache.xcodeproj/project.pbxproj b/Cache.xcodeproj/project.pbxproj index 4b3d8b5..1482ccb 100644 --- a/Cache.xcodeproj/project.pbxproj +++ b/Cache.xcodeproj/project.pbxproj @@ -101,6 +101,9 @@ D28A1D241F6FFEF60030DF81 /* ObjectConverterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D285143E1F6FFE1F00C674D1 /* ObjectConverterTests.swift */; }; D28C9BAC1F67ECD400C180C1 /* TestHelper+iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5291CDF1C28374800B702C9 /* TestHelper+iOS.swift */; }; D28C9BAF1F67EF8300C180C1 /* UIImage+ExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5291DA01C28405900B702C9 /* UIImage+ExtensionsTests.swift */; }; + D292DAFD1F6A970B0060F614 /* CacheResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D292DAFC1F6A970B0060F614 /* CacheResult.swift */; }; + D292DAFE1F6A970B0060F614 /* CacheResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D292DAFC1F6A970B0060F614 /* CacheResult.swift */; }; + D292DAFF1F6A970B0060F614 /* CacheResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D292DAFC1F6A970B0060F614 /* CacheResult.swift */; }; D2CF981E1F69427C00CE8F68 /* TestCase+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CF981B1F69427C00CE8F68 /* TestCase+Extensions.swift */; }; D2CF981F1F69427C00CE8F68 /* TestCase+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CF981B1F69427C00CE8F68 /* TestCase+Extensions.swift */; }; D2CF98201F69427C00CE8F68 /* TestCase+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2CF981B1F69427C00CE8F68 /* TestCase+Extensions.swift */; }; @@ -203,6 +206,7 @@ D27014A420D129EB003B45C7 /* TransformerFactory.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = TransformerFactory.swift; sourceTree = ""; tabWidth = 4; }; D285143E1F6FFE1F00C674D1 /* ObjectConverterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectConverterTests.swift; sourceTree = ""; }; D28897041F8B79B300C61DEE /* JSONDecoder+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+Extensions.swift"; sourceTree = ""; }; + D292DAFC1F6A970B0060F614 /* CacheResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheResult.swift; sourceTree = ""; }; D292DB001F6AA06B0060F614 /* SyncStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncStorageTests.swift; sourceTree = ""; }; D292DB031F6AA0730060F614 /* AsyncStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncStorageTests.swift; sourceTree = ""; }; D2CF981B1F69427C00CE8F68 /* TestCase+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TestCase+Extensions.swift"; sourceTree = ""; }; @@ -351,6 +355,7 @@ D2CF98571F694FFA00CE8F68 /* ImageWrapper.swift */, D2CF98591F694FFA00CE8F68 /* StorageError.swift */, D2CF98861F695B8F00CE8F68 /* Types.swift */, + D292DAFC1F6A970B0060F614 /* CacheResult.swift */, D2D4CC151FA3145000E4A2D5 /* MD5.swift */, D2D4CC1F1FA3411300E4A2D5 /* JSONDictionaryWrapper.swift */, D2D4CC231FA3426B00E4A2D5 /* JSONArrayWrapper.swift */, @@ -798,6 +803,7 @@ D27014A720D129EB003B45C7 /* TransformerFactory.swift in Sources */, D270147E20D107DA003B45C7 /* SyncStorage.swift in Sources */, 2292AB7D252A14520031F3B9 /* URL+Extensions.swift in Sources */, + D292DAFF1F6A970B0060F614 /* CacheResult.swift in Sources */, D21B669A1F6A724300125DE1 /* Date+Extensions.swift in Sources */, 0E79164C250E2AA500A71666 /* Hasher+constantAccrossExecutions.swift in Sources */, D21B66891F6A723C00125DE1 /* ImageWrapper.swift in Sources */, @@ -887,6 +893,7 @@ D27014A620D129EB003B45C7 /* TransformerFactory.swift in Sources */, D270147D20D107DA003B45C7 /* SyncStorage.swift in Sources */, 2292AB7C252A14520031F3B9 /* URL+Extensions.swift in Sources */, + D292DAFE1F6A970B0060F614 /* CacheResult.swift in Sources */, D21B66991F6A724200125DE1 /* Date+Extensions.swift in Sources */, 0E79164B250E2AA500A71666 /* Hasher+constantAccrossExecutions.swift in Sources */, D21B66801F6A723C00125DE1 /* ImageWrapper.swift in Sources */, @@ -938,6 +945,7 @@ D270148C20D113EA003B45C7 /* Optional+Extension.swift in Sources */, D2CF98601F694FFA00CE8F68 /* DiskConfig.swift in Sources */, D270147020D1018A003B45C7 /* Transformer.swift in Sources */, + D292DAFD1F6A970B0060F614 /* CacheResult.swift in Sources */, D27014A520D129EB003B45C7 /* TransformerFactory.swift in Sources */, D2D4CC241FA3426B00E4A2D5 /* JSONArrayWrapper.swift in Sources */, 2292AB7B252A14520031F3B9 /* URL+Extensions.swift in Sources */, diff --git a/Source/Shared/Library/CacheResult.swift b/Source/Shared/Library/CacheResult.swift new file mode 100644 index 0000000..2f2d10f --- /dev/null +++ b/Source/Shared/Library/CacheResult.swift @@ -0,0 +1,16 @@ +import Foundation + +/// Used for callback in async operations. +public enum CacheResult { + case value(T) + case error(Error) + + public func map(_ transform: (T) -> U) -> CacheResult { + switch self { + case .value(let value): + return CacheResult.value(transform(value)) + case .error(let error): + return CacheResult.error(error) + } + } +} diff --git a/Source/Shared/Storage/AsyncStorage.swift b/Source/Shared/Storage/AsyncStorage.swift index 032ea08..5d61d9f 100644 --- a/Source/Shared/Storage/AsyncStorage.swift +++ b/Source/Shared/Storage/AsyncStorage.swift @@ -14,34 +14,34 @@ public class AsyncStorage { } extension AsyncStorage { - public func entry(forKey key: Key, completion: @escaping (Result, Error>) -> Void) { + public func entry(forKey key: Key, completion: @escaping (CacheResult>) -> Void) { serialQueue.async { [weak self] in guard let `self` = self else { - completion(.failure(StorageError.deallocated)) + completion(CacheResult.error(StorageError.deallocated)) return } do { let anEntry = try self.innerStorage.entry(forKey: key) - completion(.success(anEntry)) + completion(CacheResult.value(anEntry)) } catch { - completion(.failure(error)) + completion(CacheResult.error(error)) } } } - public func removeObject(forKey key: Key, completion: @escaping (Result<(), Error>) -> Void) { + public func removeObject(forKey key: Key, completion: @escaping (CacheResult<()>) -> Void) { serialQueue.async { [weak self] in guard let `self` = self else { - completion(.failure(StorageError.deallocated)) + completion(CacheResult.error(StorageError.deallocated)) return } do { try self.innerStorage.removeObject(forKey: key) - completion(.success(())) + completion(CacheResult.value(())) } catch { - completion(.failure(error)) + completion(CacheResult.error(error)) } } } @@ -50,56 +50,56 @@ extension AsyncStorage { _ object: Value, forKey key: Key, expiry: Expiry? = nil, - completion: @escaping (Result<(), Error>) -> Void) { + completion: @escaping (CacheResult<()>) -> Void) { serialQueue.async { [weak self] in guard let `self` = self else { - completion(.failure(StorageError.deallocated)) + completion(CacheResult.error(StorageError.deallocated)) return } do { try self.innerStorage.setObject(object, forKey: key, expiry: expiry) - completion(.success(())) + completion(CacheResult.value(())) } catch { - completion(.failure(error)) + completion(CacheResult.error(error)) } } } - public func removeAll(completion: @escaping (Result<(), Error>) -> Void) { + public func removeAll(completion: @escaping (CacheResult<()>) -> Void) { serialQueue.async { [weak self] in guard let `self` = self else { - completion(.failure(StorageError.deallocated)) + completion(CacheResult.error(StorageError.deallocated)) return } do { try self.innerStorage.removeAll() - completion(.success(())) + completion(CacheResult.value(())) } catch { - completion(.failure(error)) + completion(CacheResult.error(error)) } } } - public func removeExpiredObjects(completion: @escaping (Result<(), Error>) -> Void) { + public func removeExpiredObjects(completion: @escaping (CacheResult<()>) -> Void) { serialQueue.async { [weak self] in guard let `self` = self else { - completion(.failure(StorageError.deallocated)) + completion(CacheResult.error(StorageError.deallocated)) return } do { try self.innerStorage.removeExpiredObjects() - completion(.success(())) + completion(CacheResult.value(())) } catch { - completion(.failure(error)) + completion(CacheResult.error(error)) } } } - public func object(forKey key: Key, completion: @escaping (Result) -> Void) { - entry(forKey: key, completion: { (result: Result, Error>) in + public func object(forKey key: Key, completion: @escaping (CacheResult) -> Void) { + entry(forKey: key, completion: { (result: CacheResult>) in completion(result.map({ entry in return entry.object })) @@ -108,8 +108,8 @@ extension AsyncStorage { public func existsObject( forKey key: Key, - completion: @escaping (Result) -> Void) { - object(forKey: key, completion: { (result: Result) in + completion: @escaping (CacheResult) -> Void) { + object(forKey: key, completion: { (result: CacheResult) in completion(result.map({ _ in return true })) diff --git a/Tests/iOS/Tests/Storage/AsyncStorageTests.swift b/Tests/iOS/Tests/Storage/AsyncStorageTests.swift index 63158dc..7ced640 100644 --- a/Tests/iOS/Tests/Storage/AsyncStorageTests.swift +++ b/Tests/iOS/Tests/Storage/AsyncStorageTests.swift @@ -25,7 +25,7 @@ final class AsyncStorageTests: XCTestCase { storage.setObject(user, forKey: "user", completion: { _ in }) storage.object(forKey: "user", completion: { result in switch result { - case .success(let cachedUser): + case .value(let cachedUser): XCTAssertEqual(cachedUser, self.user) expectation.fulfill() default: @@ -52,7 +52,7 @@ final class AsyncStorageTests: XCTestCase { then("all are removed") { intStorage.existsObject(forKey: "key-99", completion: { result in switch result { - case .success: + case .value: XCTFail() default: expectation.fulfill() diff --git a/Tests/iOS/Tests/Storage/StorageTests.swift b/Tests/iOS/Tests/Storage/StorageTests.swift index 80f3f18..f267f19 100644 --- a/Tests/iOS/Tests/Storage/StorageTests.swift +++ b/Tests/iOS/Tests/Storage/StorageTests.swift @@ -33,7 +33,7 @@ final class StorageTests: XCTestCase { storage.async.object(forKey: "user", completion: { result in switch result { - case .success(let cachedUser): + case .value(let cachedUser): XCTAssertEqual(cachedUser, self.user) expectation.fulfill() default: