42 lines
1.1 KiB
Swift
42 lines
1.1 KiB
Swift
import Foundation
|
|
import Models
|
|
import SwiftGraphQL
|
|
|
|
public extension DataService {
|
|
func validateUsernamePublisher(username: String) async throws {
|
|
let query = Selection.Query {
|
|
try $0.validateUsername(username: username)
|
|
}
|
|
|
|
let path = appEnvironment.graphqlPath
|
|
|
|
return try await withCheckedThrowingContinuation { continuation in
|
|
send(query, to: path) { result in
|
|
switch result {
|
|
case let .success(payload):
|
|
if payload.data {
|
|
continuation.resume()
|
|
} else {
|
|
continuation.resume(throwing: UsernameAvailabilityError.nameUnavailable)
|
|
}
|
|
case let .failure(error):
|
|
continuation.resume(throwing: UsernameAvailabilityError.make(from: error))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private extension UsernameAvailabilityError {
|
|
static func make(from httpError: HttpError) -> UsernameAvailabilityError {
|
|
switch httpError {
|
|
case .badURL, .badpayload, .badstatus:
|
|
return .internalServer
|
|
case .timeout, .network:
|
|
return .network
|
|
case .cancelled:
|
|
return .unknown
|
|
}
|
|
}
|
|
}
|