-
Notifications
You must be signed in to change notification settings - Fork 749
Expand file tree
/
Copy pathCodableParsingInterceptor.swift
More file actions
54 lines (45 loc) · 1.68 KB
/
CodableParsingInterceptor.swift
File metadata and controls
54 lines (45 loc) · 1.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import Foundation
public class CodableParsingInterceptor<FlexDecoder: FlexibleDecoder>: ApolloInterceptor {
public enum CodableParsingError: Error, LocalizedError {
case noResponseToParse
public var errorDescription: String? {
switch self {
case .noResponseToParse:
return "The Codable Parsing Interceptor was called before a response was received to be parsed. Double-check the order of your interceptors."
}
}
}
let decoder: FlexDecoder
var isCancelled: Bool = false
public init(decoder: FlexDecoder) {
self.decoder = decoder
}
public func interceptAsync<Operation: GraphQLOperation>(
chain: RequestChain,
request: HTTPRequest<Operation>,
response: HTTPResponse<Operation>?,
completion: @escaping (Result<GraphQLResult<Operation.Data>, Error>) -> Void) {
guard !self.isCancelled else {
return
}
guard let createdResponse = response else {
chain.handleErrorAsync(CodableParsingError.noResponseToParse,
request: request,
response: response,
completion: completion)
return
}
do {
let parsedData = try GraphQLResult<Operation.Data>(from: createdResponse.rawData, decoder: self.decoder)
createdResponse.parsedResponse = parsedData
chain.proceedAsync(request: request,
response: response,
completion: completion)
} catch {
chain.handleErrorAsync(error,
request: request,
response: createdResponse,
completion: completion)
}
}
}