Skip to content
Snippets Groups Projects
Commit 58da4504 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add client error callback handler

parent ef518c4a
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!18Update Bindings
import Bindings
import XCTestDynamicOverlay
public struct ClientErrorCallback {
public init(handle: @escaping (ClientError) -> Void) {
self.handle = handle
}
public var handle: (ClientError) -> Void
}
extension ClientErrorCallback {
public static let unimplemented = ClientErrorCallback(
handle: XCTUnimplemented("\(Self.self)")
)
}
extension ClientErrorCallback {
func makeBindingsClientError() -> BindingsClientErrorProtocol {
class Reporter: NSObject, BindingsClientErrorProtocol {
init(_ callback: ClientErrorCallback) {
self.callback = callback
}
let callback: ClientErrorCallback
func report(_ source: String?, message: String?, trace: String?) {
guard let source = source else {
fatalError("BindingsClientError.report received `nil` source")
}
guard let message = message else {
fatalError("BindingsClientError.report received `nil` message")
}
guard let trace = trace else {
fatalError("BindingsClientError.report received `nil` trace")
}
callback.handle(ClientError(
source: source,
message: message,
trace: trace
))
}
}
return Reporter(self)
}
}
...@@ -10,6 +10,7 @@ public struct Cmix { ...@@ -10,6 +10,7 @@ public struct Cmix {
public var startNetworkFollower: CmixStartNetworkFollower public var startNetworkFollower: CmixStartNetworkFollower
public var stopNetworkFollower: CmixStopNetworkFollower public var stopNetworkFollower: CmixStopNetworkFollower
public var waitForNetwork: CmixWaitForNetwork public var waitForNetwork: CmixWaitForNetwork
public var registerClientErrorCallback: CmixRegisterClientErrorCallback
} }
extension Cmix { extension Cmix {
...@@ -23,7 +24,8 @@ extension Cmix { ...@@ -23,7 +24,8 @@ extension Cmix {
networkFollowerStatus: .live(bindingsCmix), networkFollowerStatus: .live(bindingsCmix),
startNetworkFollower: .live(bindingsCmix), startNetworkFollower: .live(bindingsCmix),
stopNetworkFollower: .live(bindingsCmix), stopNetworkFollower: .live(bindingsCmix),
waitForNetwork: .live(bindingsCmix) waitForNetwork: .live(bindingsCmix),
registerClientErrorCallback: .live(bindingsCmix)
) )
} }
} }
...@@ -38,6 +40,7 @@ extension Cmix { ...@@ -38,6 +40,7 @@ extension Cmix {
networkFollowerStatus: .unimplemented, networkFollowerStatus: .unimplemented,
startNetworkFollower: .unimplemented, startNetworkFollower: .unimplemented,
stopNetworkFollower: .unimplemented, stopNetworkFollower: .unimplemented,
waitForNetwork: .unimplemented waitForNetwork: .unimplemented,
registerClientErrorCallback: .unimplemented
) )
} }
import Bindings
import XCTestDynamicOverlay
public struct CmixRegisterClientErrorCallback {
public var run: (ClientErrorCallback) -> Void
public func callAsFunction(
_ callback: ClientErrorCallback
) {
run(callback)
}
}
extension CmixRegisterClientErrorCallback {
public static func live(_ bindingsCmix: BindingsCmix) -> CmixRegisterClientErrorCallback {
CmixRegisterClientErrorCallback { callback in
bindingsCmix.registerClientErrorCallback(
callback.makeBindingsClientError()
)
}
}
}
extension CmixRegisterClientErrorCallback {
public static let unimplemented = CmixRegisterClientErrorCallback(
run: XCTUnimplemented("\(Self.self)")
)
}
import Bindings
public struct ClientErrorListener {
public var listen: (@escaping (ClientError) -> Void) -> Void
public func callAsFunction(callback: @escaping (ClientError) -> Void) {
listen(callback)
}
}
extension ClientErrorListener {
public static func live(bindingsClient: BindingsCmix) -> ClientErrorListener {
ClientErrorListener { callback in
let listener = Listener(onReport: callback)
bindingsClient.registerClientErrorCallback(listener)
}
}
}
private final class Listener: NSObject, BindingsClientErrorProtocol {
init(onReport: @escaping (ClientError) -> Void) {
self.onReport = onReport
super.init()
}
let onReport: (ClientError) -> Void
func report(_ source: String?, message: String?, trace: String?) {
guard let source = source else {
fatalError("BindingsClientError.source is `nil`")
}
guard let message = message else {
fatalError("BindingsClientError.message is `nil`")
}
guard let trace = trace else {
fatalError("BindingsClientError.trace is `nil`")
}
onReport(ClientError(source: source, message: message, trace: trace))
}
}
#if DEBUG
extension ClientErrorListener {
public static let failing = ClientErrorListener { _ in
fatalError("Not implemented")
}
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment