@@ -14,21 +14,30 @@ def is_promise(value):
14
14
return type (value ) == Promise
15
15
16
16
17
- def on_complete_resolver (__func , __resolver , * args , ** kwargs ):
18
- result = __resolver (* args , ** kwargs )
17
+ def on_complete_resolver (__func , exe_context , info , __resolver , * args , ** kwargs ):
18
+ try :
19
+ result = __resolver (* args , ** kwargs )
20
+ except Exception , e :
21
+ exe_context .errors .append (e )
22
+ return None
23
+
19
24
if is_promise (result ):
20
25
return result .then (__func )
21
26
return __func (result )
22
27
23
28
24
- def complete_list_value (inner_resolver , result ):
29
+ def complete_list_value (inner_resolver , exe_context , info , result ):
25
30
assert isinstance (result , collections .Iterable ), \
26
31
('User Error: expected iterable, but did not find one ' +
27
32
'for field {}.{}.' ).format (info .parent_type , info .field_name )
28
33
29
34
completed_results = []
30
35
for item in result :
31
- completed_item = inner_resolver (item )
36
+ try :
37
+ completed_item = inner_resolver (item )
38
+ except Exception , e :
39
+ completed_item = None
40
+ exe_context .errors .append (e )
32
41
completed_results .append (completed_item )
33
42
34
43
return completed_results
@@ -44,44 +53,44 @@ def complete_nonnull_value(result):
44
53
return result
45
54
46
55
47
- def field_resolver (field , fragment = None ):
48
- return type_resolver (field .type , field .resolver , fragment )
56
+ def field_resolver (field , fragment = None , exe_context = None , info = None ):
57
+ return type_resolver (field .type , field .resolver , fragment , exe_context , info )
49
58
50
59
51
- def type_resolver (return_type , resolver , fragment = None ):
60
+ def type_resolver (return_type , resolver , fragment = None , exe_context = None , info = None ):
52
61
if isinstance (return_type , GraphQLNonNull ):
53
- return type_resolver_non_null (return_type , resolver , fragment )
62
+ return type_resolver_non_null (return_type , resolver , fragment , exe_context , info )
54
63
55
64
if isinstance (return_type , (GraphQLScalarType , GraphQLEnumType )):
56
- return type_resolver_leaf (return_type , resolver )
65
+ return type_resolver_leaf (return_type , resolver , exe_context , info )
57
66
58
67
if isinstance (return_type , (GraphQLList )):
59
- return type_resolver_list (return_type , resolver , fragment )
68
+ return type_resolver_list (return_type , resolver , fragment , exe_context , info )
60
69
61
70
if isinstance (return_type , (GraphQLObjectType )):
62
71
assert fragment and fragment .type == return_type
63
- return partial (on_complete_resolver , fragment .resolve , resolver )
72
+ return partial (on_complete_resolver , fragment .resolve , exe_context , info , resolver )
64
73
# return partial(fragment.resolver, resolver)
65
74
66
75
if isinstance (return_type , (GraphQLInterfaceType , GraphQLUnionType )):
67
76
assert fragment
68
- return partial (on_complete_resolver , fragment .resolve , resolver )
77
+ return partial (on_complete_resolver , fragment .resolve , exe_context , info , resolver )
69
78
# return partial(fragment.resolver, resolver)
70
79
# return partial(fragment.abstract_resolver, resolver, return_type)
71
80
72
81
raise Exception ("The resolver have to be created for a fragment" )
73
82
74
83
75
- def type_resolver_non_null (return_type , resolver , fragment = None ):
84
+ def type_resolver_non_null (return_type , resolver , fragment , exe_context , info ):
76
85
resolver = type_resolver (return_type .of_type , resolver )
77
- return partial (on_complete_resolver , complete_nonnull_value , resolver )
86
+ return partial (on_complete_resolver , complete_nonnull_value , exe_context , info , resolver )
78
87
79
88
80
- def type_resolver_leaf (return_type , resolver ):
81
- return partial (on_complete_resolver , return_type .serialize , resolver )
89
+ def type_resolver_leaf (return_type , resolver , exe_context , info ):
90
+ return partial (on_complete_resolver , return_type .serialize , exe_context , info , resolver )
82
91
83
92
84
- def type_resolver_list (return_type , resolver , fragment = None ):
93
+ def type_resolver_list (return_type , resolver , fragment , exe_context , info ):
85
94
inner_resolver = type_resolver (return_type .of_type , lambda item : item , fragment )
86
- list_complete = partial (complete_list_value , inner_resolver )
87
- return partial (on_complete_resolver , list_complete , resolver )
95
+ list_complete = partial (complete_list_value , inner_resolver , exe_context , info )
96
+ return partial (on_complete_resolver , list_complete , exe_context , info , resolver )
0 commit comments