-
Notifications
You must be signed in to change notification settings - Fork 749
Expand file tree
/
Copy pathSelectionSetModelExecutionSource.swift
More file actions
51 lines (44 loc) · 1.54 KB
/
SelectionSetModelExecutionSource.swift
File metadata and controls
51 lines (44 loc) · 1.54 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
#if !COCOAPODS
import ApolloMigrationAPI
#endif
/// A `GraphQLExecutionSource` designed for use when the data source is a generated model's
/// `SelectionSet` data.
struct SelectionSetModelExecutionSource: GraphQLExecutionSource, CacheKeyComputingExecutionSource {
typealias RawObjectData = DataDict
typealias FieldCollector = CustomCacheDataWritingFieldSelectionCollector
var shouldAttemptDeferredFragmentExecution: Bool { false }
func resolveField(
with info: FieldExecutionInfo,
on object: DataDict
) -> PossiblyDeferred<AnyHashable?> {
.immediate(.success(object._data[info.responseKeyForField]))
}
func opaqueObjectDataWrapper(for rawData: DataDict) -> ObjectData {
ObjectData(_transformer: DataTransformer(), _rawData: rawData._data)
}
struct DataTransformer: _ObjectData_Transformer {
func transform(_ value: AnyHashable) -> (any ScalarType)? {
switch value {
case let scalar as any ScalarType:
return scalar
case let customScalar as any CustomScalarType:
return customScalar._jsonValue as? (any ScalarType)
default: return nil
}
}
func transform(_ value: AnyHashable) -> ObjectData? {
switch value {
case let object as DataDict:
return ObjectData(_transformer: self, _rawData: object._data)
default: return nil
}
}
func transform(_ value: AnyHashable) -> ListData? {
switch value {
case let list as [AnyHashable]:
return ListData(_transformer: self, _rawData: list)
default: return nil
}
}
}
}