Convert AccountDelegate.createFolder to async/await.

This commit is contained in:
Brent Simmons
2023-10-10 21:21:52 -07:00
parent 490095fd73
commit 378e116b5c
11 changed files with 95 additions and 84 deletions

View File

@@ -634,8 +634,8 @@ public enum FetchType {
delegate.restoreFeed(for: self, feed: feed, container: container, completion: completion)
}
public func addFolder(_ name: String, completion: @escaping (Result<Folder, Error>) -> Void) {
delegate.createFolder(for: self, name: name, completion: completion)
public func addFolder(_ name: String) async throws -> Folder {
try await delegate.createFolder(for: self, name: name)
}
public func removeFolder(_ folder: Folder, completion: @escaping (Result<Void, Error>) -> Void) {

View File

@@ -32,7 +32,7 @@ import Secrets
func importOPML(for account:Account, opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void)
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> Void)
func createFolder(for account: Account, name: String) async throws -> Folder
func renameFolder(for account: Account, with folder: Folder, to name: String, completion: @escaping (Result<Void, Error>) -> Void)
func removeFolder(for account: Account, with folder: Folder, completion: @escaping (Result<Void, Error>) -> Void)

View File

@@ -282,11 +282,13 @@ public enum FeedbinAccountDelegateError: String, Error {
}
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> Void) {
if let folder = account.ensureFolder(with: name) {
completion(.success(folder))
} else {
completion(.failure(FeedbinAccountDelegateError.invalidParameter))
func createFolder(for account: Account, name: String) async throws -> Folder {
try await withCheckedThrowingContinuation { continuation in
if let folder = account.ensureFolder(with: name) {
continuation.resume(returning: folder)
} else {
continuation.resume(throwing: FeedbinAccountDelegateError.invalidParameter)
}
}
}

View File

@@ -163,11 +163,13 @@ final class LocalAccountDelegate: AccountDelegate, Logging {
completion(.success(()))
}
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> Void) {
if let folder = account.ensureFolder(with: name) {
completion(.success(folder))
} else {
completion(.failure(FeedbinAccountDelegateError.invalidParameter))
func createFolder(for account: Account, name: String) async throws -> Folder {
try await withCheckedThrowingContinuation { continuation in
if let folder = account.ensureFolder(with: name) {
continuation.resume(returning: folder)
} else {
continuation.resume(throwing: FeedbinAccountDelegateError.invalidParameter)
}
}
}

View File

@@ -352,21 +352,23 @@ final class NewsBlurAccountDelegate: AccountDelegate, Logging {
completion(.success(()))
}
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> ()) {
func createFolder(for account: Account, name: String) async throws -> Folder {
self.refreshProgress.addToNumberOfTasksAndRemaining(1)
caller.addFolder(named: name) { result in
self.refreshProgress.completeTask()
return try await withCheckedThrowingContinuation { continuation in
caller.addFolder(named: name) { result in
self.refreshProgress.completeTask()
switch result {
case .success():
if let folder = account.ensureFolder(with: name) {
completion(.success(folder))
} else {
completion(.failure(NewsBlurError.invalidParameter))
switch result {
case .success():
if let folder = account.ensureFolder(with: name) {
continuation.resume(returning: folder)
} else {
continuation.resume(throwing: NewsBlurError.invalidParameter)
}
case .failure(let error):
continuation.resume(throwing: error)
}
case .failure(let error):
completion(.failure(error))
}
}
}
@@ -584,12 +586,11 @@ final class NewsBlurAccountDelegate: AccountDelegate, Logging {
}
let group = DispatchGroup()
group.enter()
createFolder(for: account, name: folderName) { result in
group.leave()
switch result {
case .success(let folder):
Task { @MainActor in
do {
let folder = try await createFolder(for: account, name: folderName)
for feed in feedsToRestore {
group.enter()
self.restoreFeed(for: account, feed: feed, container: folder) { result in
@@ -598,12 +599,15 @@ final class NewsBlurAccountDelegate: AccountDelegate, Logging {
case .success:
break
case .failure(let error):
self.logger.error("Restore folder feed error: \(error.localizedDescription, privacy: .public)")
self.logger.error("Restore folder feed error: \(error.localizedDescription, privacy: .public)")
}
}
}
case .failure(let error):
self.logger.error("Restore folder feed error: \(error.localizedDescription, privacy: .public)")
group.leave()
} catch {
self.logger.error("Restore folder feed error: \(error.localizedDescription, privacy: .public)")
group.leave()
}
}

View File

@@ -290,11 +290,13 @@ public enum ReaderAPIAccountDelegateError: LocalizedError {
func importOPML(for account:Account, opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void) {
}
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> Void) {
if let folder = account.ensureFolder(with: name) {
completion(.success(folder))
} else {
completion(.failure(ReaderAPIAccountDelegateError.invalidParameter))
func createFolder(for account: Account, name: String) async throws -> Folder {
try await withCheckedThrowingContinuation { continuation in
if let folder = account.ensureFolder(with: name) {
continuation.resume(returning: folder)
} else {
continuation.resume(throwing: ReaderAPIAccountDelegateError.invalidParameter)
}
}
}

View File

@@ -286,21 +286,24 @@ final class CloudKitAccountDelegate: AccountDelegate, Logging {
}
}
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> Void) {
func createFolder(for account: Account, name: String) async throws -> Folder {
refreshProgress.addToNumberOfTasksAndRemaining(1)
accountZone.createFolder(name: name) { result in
self.refreshProgress.completeTask()
switch result {
case .success(let externalID):
if let folder = account.ensureFolder(with: name) {
folder.externalID = externalID
completion(.success(folder))
} else {
completion(.failure(FeedbinAccountDelegateError.invalidParameter))
return try await withCheckedThrowingContinuation { continuation in
accountZone.createFolder(name: name) { result in
self.refreshProgress.completeTask()
switch result {
case .success(let externalID):
if let folder = account.ensureFolder(with: name) {
folder.externalID = externalID
continuation.resume(returning: folder)
} else {
continuation.resume(throwing: FeedbinAccountDelegateError.invalidParameter)
}
case .failure(let error):
self.processAccountError(account, error)
continuation.resume(throwing: error)
}
case .failure(let error):
self.processAccountError(account, error)
completion(.failure(error))
}
}
}

View File

@@ -244,25 +244,27 @@ final class FeedlyAccountDelegate: AccountDelegate, Logging {
}
}
func createFolder(for account: Account, name: String, completion: @escaping (Result<Folder, Error>) -> Void) {
func createFolder(for account: Account, name: String) async throws -> Folder {
let progress = refreshProgress
progress.addToNumberOfTasksAndRemaining(1)
caller.createCollection(named: name) { result in
progress.completeTask()
switch result {
case .success(let collection):
if let folder = account.ensureFolder(with: collection.label) {
folder.externalID = collection.id
completion(.success(folder))
} else {
// Is the name empty? Or one of the global resource names?
completion(.failure(FeedlyAccountDelegateError.unableToAddFolder(name)))
return try await withCheckedThrowingContinuation { continuation in
caller.createCollection(named: name) { result in
progress.completeTask()
switch result {
case .success(let collection):
if let folder = account.ensureFolder(with: collection.label) {
folder.externalID = collection.id
continuation.resume(returning: folder)
} else {
// Is the name empty? Or one of the global resource names?
continuation.resume(throwing: FeedlyAccountDelegateError.unableToAddFolder(name))
}
case .failure(let error):
continuation.resume(throwing: error)
}
case .failure(let error):
completion(.failure(error))
}
}
}

View File

@@ -100,11 +100,10 @@ private extension AddFolderWindowController {
return
}
account.addFolder(folderName) { result in
switch result {
case .success:
break
case .failure(let error):
Task { @MainActor in
do {
try await account.addFolder(folderName)
} catch {
NSApplication.shared.presentError(error)
}
}

View File

@@ -440,9 +440,9 @@ private extension SidebarOutlineDataSource {
return
}
destinationAccount.addFolder(folder.name ?? "") { result in
switch result {
case .success(let destinationFolder):
Task { @MainActor in
do {
let destinationFolder = try await destinationAccount.addFolder(folder.name ?? "")
for feed in folder.topLevelFeeds {
if let existingFeed = destinationAccount.existingFeed(withURL: feed.url) {
destinationAccount.addFeed(existingFeed, to: destinationFolder) { result in
@@ -464,7 +464,7 @@ private extension SidebarOutlineDataSource {
}
}
}
case .failure(let error):
} catch {
NSApplication.shared.presentError(error)
}
}

View File

@@ -82,16 +82,13 @@ class ScriptableFolder: NSObject, UniqueIdScriptingObject, ScriptingObjectContai
return
}
account.addFolder(name) { result in
switch result {
case .success(let folder):
let scriptableAccount = ScriptableAccount(account)
let scriptableFolder = ScriptableFolder(folder, container:scriptableAccount)
command.resumeExecution(withResult:scriptableFolder.objectSpecifier)
case .failure:
command.resumeExecution(withResult:nil)
}
do {
let folder = try await account.addFolder(name)
let scriptableAccount = ScriptableAccount(account)
let scriptableFolder = ScriptableFolder(folder, container:scriptableAccount)
command.resumeExecution(withResult:scriptableFolder.objectSpecifier)
} catch {
command.resumeExecution(withResult:nil)
}
}