mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Convert AccountDelegate.createFolder to async/await.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user