@@ -6,8 +6,8 @@ use indexmap::IndexMap;
6
6
7
7
use crate :: {
8
8
dynamic:: {
9
- field:: BoxResolverFn , r#type:: Type , resolve:: resolve_container, FieldFuture , FieldValue ,
10
- Object , ResolverContext , Scalar , SchemaError , Subscription ,
9
+ field:: BoxResolverFn , r#type:: Type , resolve:: resolve_container, DynamicRequest ,
10
+ FieldFuture , FieldValue , Object , ResolverContext , Scalar , SchemaError , Subscription ,
11
11
} ,
12
12
extensions:: { ExtensionFactory , Extensions } ,
13
13
registry:: { MetaType , Registry } ,
@@ -284,21 +284,21 @@ impl Schema {
284
284
self . 0 . env . registry . export_sdl ( options)
285
285
}
286
286
287
- async fn execute_once ( & self , env : QueryEnv ) -> Response {
287
+ async fn execute_once ( & self , env : QueryEnv , root_value : & FieldValue < ' static > ) -> Response {
288
288
// execute
289
289
let ctx = env. create_context ( & self . 0 . env , None , & env. operation . node . selection_set ) ;
290
290
let res = match & env. operation . node . ty {
291
291
OperationType :: Query => {
292
292
async move { self . query_root ( ) }
293
293
. and_then ( |query_root| {
294
- resolve_container ( self , query_root, & ctx, & FieldValue :: NULL , false )
294
+ resolve_container ( self , query_root, & ctx, root_value , false )
295
295
} )
296
296
. await
297
297
}
298
298
OperationType :: Mutation => {
299
299
async move { self . mutation_root ( ) }
300
300
. and_then ( |query_root| {
301
- resolve_container ( self , query_root, & ctx, & FieldValue :: NULL , true )
301
+ resolve_container ( self , query_root, & ctx, root_value , true )
302
302
} )
303
303
. await
304
304
}
@@ -320,15 +320,15 @@ impl Schema {
320
320
}
321
321
322
322
/// Execute a GraphQL query.
323
- pub async fn execute ( & self , request : impl Into < Request > ) -> Response {
323
+ pub async fn execute ( & self , request : impl Into < DynamicRequest > ) -> Response {
324
324
let request = request. into ( ) ;
325
325
let extensions = self . create_extensions ( Default :: default ( ) ) ;
326
326
let request_fut = {
327
327
let extensions = extensions. clone ( ) ;
328
328
async move {
329
329
match prepare_request (
330
330
extensions,
331
- request,
331
+ request. inner ,
332
332
Default :: default ( ) ,
333
333
& self . 0 . env . registry ,
334
334
self . 0 . validation_mode ,
@@ -340,7 +340,7 @@ impl Schema {
340
340
{
341
341
Ok ( ( env, cache_control) ) => {
342
342
let fut = async {
343
- self . execute_once ( env. clone ( ) )
343
+ self . execute_once ( env. clone ( ) , & request . root_value )
344
344
. await
345
345
. cache_control ( cache_control)
346
346
} ;
@@ -360,7 +360,7 @@ impl Schema {
360
360
/// Execute a GraphQL subscription with session data.
361
361
pub fn execute_stream_with_session_data (
362
362
& self ,
363
- request : impl Into < Request > ,
363
+ request : impl Into < DynamicRequest > ,
364
364
session_data : Arc < Data > ,
365
365
) -> impl Stream < Item = Response > + Send + Unpin {
366
366
let schema = self . clone ( ) ;
@@ -381,7 +381,7 @@ impl Schema {
381
381
382
382
let ( env, _) = match prepare_request(
383
383
extensions,
384
- request,
384
+ request. inner ,
385
385
session_data,
386
386
& schema. 0 . env. registry,
387
387
schema. 0 . validation_mode,
@@ -398,7 +398,7 @@ impl Schema {
398
398
} ;
399
399
400
400
if env. operation. node. ty != OperationType :: Subscription {
401
- yield schema. execute_once( env) . await ;
401
+ yield schema. execute_once( env, & request . root_value ) . await ;
402
402
return ;
403
403
}
404
404
@@ -408,7 +408,7 @@ impl Schema {
408
408
& env. operation. node. selection_set,
409
409
) ;
410
410
let mut streams = Vec :: new( ) ;
411
- subscription. collect_streams( & schema, & ctx, & mut streams) ;
411
+ subscription. collect_streams( & schema, & ctx, & mut streams, & request . root_value ) ;
412
412
413
413
let mut stream = futures_util:: stream:: select_all( streams) ;
414
414
while let Some ( resp) = stream. next( ) . await {
@@ -422,7 +422,7 @@ impl Schema {
422
422
/// Execute a GraphQL subscription.
423
423
pub fn execute_stream (
424
424
& self ,
425
- request : impl Into < Request > ,
425
+ request : impl Into < DynamicRequest > ,
426
426
) -> impl Stream < Item = Response > + Send + Unpin {
427
427
self . execute_stream_with_session_data ( request, Default :: default ( ) )
428
428
}
@@ -482,8 +482,9 @@ mod tests {
482
482
use tokio:: sync:: Mutex ;
483
483
484
484
use crate :: {
485
- dynamic:: * , extensions:: * , value, PathSegment , Request , Response , ServerError ,
486
- ServerResult , ValidationResult , Value ,
485
+ dynamic:: { DynamicRequestExt , * } ,
486
+ extensions:: * ,
487
+ value, PathSegment , Request , Response , ServerError , ServerResult , ValidationResult , Value ,
487
488
} ;
488
489
489
490
#[ tokio:: test]
@@ -528,6 +529,32 @@ mod tests {
528
529
) ;
529
530
}
530
531
532
+ #[ tokio:: test]
533
+ async fn root_value ( ) {
534
+ let query =
535
+ Object :: new ( "Query" ) . field ( Field :: new ( "value" , TypeRef :: named ( TypeRef :: INT ) , |ctx| {
536
+ FieldFuture :: new ( async {
537
+ Ok ( Some ( Value :: Number (
538
+ ( * ctx. parent_value . try_downcast_ref :: < i32 > ( ) ?) . into ( ) ,
539
+ ) ) )
540
+ } )
541
+ } ) ) ;
542
+
543
+ let schema = Schema :: build ( "Query" , None , None )
544
+ . register ( query)
545
+ . finish ( )
546
+ . unwrap ( ) ;
547
+ assert_eq ! (
548
+ schema
549
+ . execute( "{ value }" . root_value( FieldValue :: owned_any( 100 ) ) )
550
+ . await
551
+ . into_result( )
552
+ . unwrap( )
553
+ . data,
554
+ value!( { "value" : 100 , } )
555
+ ) ;
556
+ }
557
+
531
558
#[ tokio:: test]
532
559
async fn field_alias ( ) {
533
560
let query =
0 commit comments