-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGraphQLJSONEncoder+ContentEncoder.swift
More file actions
79 lines (75 loc) · 3 KB
/
Copy pathGraphQLJSONEncoder+ContentEncoder.swift
File metadata and controls
79 lines (75 loc) · 3 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import GraphQL
import Vapor
extension GraphQLJSONEncoder: @retroactive ContentEncoder {
public func encode<E: Encodable>(
_ encodable: E,
to body: inout NIOCore.ByteBuffer,
headers: inout NIOHTTP1.HTTPHeaders
) throws {
try encode(encodable, to: &body, headers: &headers, userInfo: [:])
}
public func encode<E: Encodable>(
_ encodable: E,
to body: inout ByteBuffer,
headers: inout HTTPHeaders,
userInfo: [CodingUserInfoKey: Sendable]
) throws {
headers.contentType = .jsonGraphQL
if !userInfo.isEmpty { // Changing a coder's userInfo is a thread-unsafe mutation, operate on a copy
let encoder = GraphQLJSONEncoder.custom(
dates: dateEncodingStrategy,
data: dataEncodingStrategy,
keys: keyEncodingStrategy,
format: outputFormatting,
floats: nonConformingFloatEncodingStrategy
) // don't use userInfo parameter of `JSONEncoder.custom()` until Swift 6.2 is required
encoder.userInfo = self.userInfo.merging(userInfo) { $1 }
try body.writeBytes(encoder.encode(encodable))
} else {
try body.writeBytes(encode(encodable))
}
}
}
extension GraphQLJSONEncoder {
/// Convenience for creating a customized ``Foundation/GraphQLJSONEncoder``.
///
/// let encoder: GraphQLJSONEncoder = .custom(dates: .millisecondsSince1970)
///
/// - Parameters:
/// - dates: Date encoding strategy.
/// - data: Data encoding strategy.
/// - keys: Key encoding strategy.
/// - format: Output formatting.
/// - floats: Non-conforming float encoding strategy.
/// - userInfo: Coder userInfo.
/// - Returns: Newly created ``Foundation/JSONEncoder``.
public static func custom(
dates dateStrategy: GraphQLJSONEncoder.DateEncodingStrategy? = nil,
data dataStrategy: GraphQLJSONEncoder.DataEncodingStrategy? = nil,
keys keyStrategy: GraphQLJSONEncoder.KeyEncodingStrategy? = nil,
format outputFormatting: GraphQLJSONEncoder.OutputFormatting? = nil,
floats floatStrategy: GraphQLJSONEncoder.NonConformingFloatEncodingStrategy? = nil,
userInfo: [CodingUserInfoKey: Sendable]? = nil
) -> GraphQLJSONEncoder {
let json = GraphQLJSONEncoder()
if let dateStrategy = dateStrategy {
json.dateEncodingStrategy = dateStrategy
}
if let dataStrategy = dataStrategy {
json.dataEncodingStrategy = dataStrategy
}
if let keyStrategy = keyStrategy {
json.keyEncodingStrategy = keyStrategy
}
if let outputFormatting = outputFormatting {
json.outputFormatting = outputFormatting
}
if let floatStrategy = floatStrategy {
json.nonConformingFloatEncodingStrategy = floatStrategy
}
if let userInfo = userInfo {
json.userInfo = userInfo
}
return json
}
}