59 lines
1.3 KiB
Swift
59 lines
1.3 KiB
Swift
import Combine
|
|
import Foundation
|
|
import WatchConnectivity
|
|
|
|
enum ServersLoadingError: Error, Equatable {
|
|
case unactive
|
|
case unreachable
|
|
case locked
|
|
case undecodable(Error)
|
|
|
|
static func == (lhs: ServersLoadingError, rhs: ServersLoadingError) -> Bool {
|
|
switch (lhs, rhs) {
|
|
case (.unactive, .unactive), (.unreachable, .unreachable), (.locked, .locked), (.undecodable, .undecodable):
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
protocol ServersLoading {
|
|
func loadServers() -> AnyPublisher<Void, ServersLoadingError>
|
|
}
|
|
|
|
final class ServersLoader: NSObject {
|
|
@Dependency private var database: ServersDatabase
|
|
|
|
private let session: WatchSessionProtocol
|
|
|
|
init(session: WatchSessionProtocol = RetriableWatchSession()) {
|
|
self.session = session
|
|
super.init()
|
|
}
|
|
}
|
|
|
|
// MARK: - ServersLoading
|
|
|
|
extension ServersLoader: ServersLoading {
|
|
func loadServers() -> AnyPublisher<Void, ServersLoadingError> {
|
|
Future<Void, ServersLoadingError> { [self] promise in
|
|
session.sendMessage { result in
|
|
switch result {
|
|
case .success(let message):
|
|
for server in message.servers {
|
|
DispatchQueue.main.async {
|
|
self.database.process(updatedServer: server)
|
|
}
|
|
}
|
|
|
|
promise(.success(()))
|
|
case .failure(let error):
|
|
promise(.failure(error))
|
|
}
|
|
}
|
|
}
|
|
.eraseToAnyPublisher()
|
|
}
|
|
}
|