Skip to content

Commit 6b11721

Browse files
author
Julian VIVES
committed
graphql-rust#605 First attempt async interfaces
1 parent c09be69 commit 6b11721

File tree

2 files changed

+114
-2
lines changed

2 files changed

+114
-2
lines changed

juniper/src/macros/interface.rs

+112
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,118 @@ macro_rules! graphql_interface {
255255
}
256256
}
257257
);
258+
259+
$crate::__juniper_impl_trait!(
260+
impl<$($scalar)* $(, $lifetimes)* > GraphQLTypeAsync for $name where (
261+
Self: $crate::GraphQLType<$crate::__juniper_insert_generic!($($scalar)+)> + Send + Sync,
262+
Self::Context: Send + Sync,
263+
Self::TypeInfo: Send + Sync,
264+
)
265+
{
266+
#[allow(unused_variables)]
267+
fn resolve_field_async<'__b>(
268+
&'__b $main_self,
269+
info: &'__b Self::TypeInfo,
270+
field: &'__b str,
271+
args: &'__b $crate::Arguments<$crate::__juniper_insert_generic!($($scalar)+)>,
272+
executor: &'__b $crate::Executor<Self::Context, $crate::__juniper_insert_generic!($($scalar)+)>
273+
) -> $crate::BoxFuture<'__b, $crate::ExecutionResult<$crate::__juniper_insert_generic!($($scalar)+)>>
274+
where
275+
$crate::__juniper_insert_generic!($($scalar)+): Send + Sync,
276+
{
277+
use $crate::GraphQLType;
278+
let v = $main_self.resolve_field(info, field, args, executor);
279+
Box::pin(futures::future::ready(v))
280+
}
281+
}
282+
);
283+
/*$crate::__juniper_impl_trait!(
284+
impl<$($scalar)* $(, $lifetimes)* > GraphQLTypeAsync for $name
285+
{
286+
/*fn resolve_into_type_async<$($lifetimes)? >(
287+
&$($lifetimes)? $main_self,
288+
info: &$($lifetimes)? Self::TypeInfo,
289+
type_name: &str,
290+
_: Option<$($lifetimes)? [$crate::Selection<$($lifetimes,)? $crate::__juniper_insert_generic!($($scalar)*)>]>,
291+
executor: &$($lifetimes)? $crate::Executor<$($lifetimes,)? $($lifetimes,)? Self::Context, $crate::__juniper_insert_generic!($($scalar)*)>,
292+
) -> $crate::BoxFuture<$($lifetimes,)? $crate::ExecutionResult<$crate::__juniper_insert_generic!($($scalar)*)>> {
293+
$(let $resolver_ctx = &executor.context();)*
294+
295+
$(
296+
if type_name == (<$resolver_src as $crate::GraphQLType<_>>::name(&())).unwrap() {
297+
return executor.resolve_async(&(), &$resolver_expr);
298+
}
299+
)*
300+
301+
panic!("Concrete type not handled by instance resolvers on {}", $($outname)*);
302+
}*/
303+
}
304+
);*/
305+
/*$crate::__juniper_impl_trait!(
306+
impl<$($scalar)* $(, $lifetimes)* > GraphQLTypeAsync for $name {
307+
fn resolve_into_type_async<$($lifetimes)* >(
308+
&$($lifetimes)* $main_self,
309+
info: &$($lifetimes)* Self::TypeInfo,
310+
type_name: &str,
311+
_: Option<'___a, [$crate::Selection<'___a, $crate::__juniper_insert_generic!($($scalar)*)>]>,
312+
executor: &'___a $crate::Executor<'___a, '___a, Self::Context, $crate::__juniper_insert_generic!($($scalar)*)>,
313+
) -> $crate::BoxFuture<'___a, $crate::ExecutionResult<$crate::__juniper_insert_generic!($($scalar)*)>> {
314+
$(let $resolver_ctx = &executor.context();)*
315+
316+
$(
317+
if type_name == (<$resolver_src as $crate::GraphQLType<_>>::name(&())).unwrap() {
318+
return executor.resolve_async(&(), &$resolver_expr);
319+
}
320+
)*
321+
322+
panic!("Concrete type not handled by instance resolvers on {}", $($outname)*);
323+
}
324+
325+
#[allow(unused_variables)]
326+
fn resolve_field_async<'___a>(
327+
&'___a $main_self,
328+
_info: &'___a Self::TypeInfo,
329+
_field_name: &'___a str,
330+
_arguments: &'___a $crate::Arguments<$crate::__juniper_insert_generic!($($scalar)+)>,
331+
_executor: &'___a $crate::Executor<Self::Context, $crate::__juniper_insert_generic!($($scalar)+)>,
332+
) -> $crate::BoxFuture<'___a, $crate::ExecutionResult<$crate::__juniper_insert_generic!($($scalar)+)>> {
333+
$(
334+
if _field_name == &$crate::to_camel_case(stringify!($fn_name)) {
335+
return Box::pin(async move {
336+
let f = (|| {
337+
$(
338+
let $arg_name: $arg_ty = args.get(&$crate::to_camel_case(stringify!($arg_name)))
339+
.expect(concat!(
340+
"Argument ",
341+
stringify!($arg_name),
342+
" missing - validation must have failed"
343+
));
344+
)*
345+
$(
346+
let $executor = &_executor;
347+
)*
348+
$body
349+
});
350+
351+
let result: $return_ty = f();
352+
let resolve = $crate::IntoResolvable::into(result, _executor.context());
353+
match resolve {
354+
Ok(Some((ctx, r))) => {
355+
_executor.replaced_context(ctx)
356+
.resolve_with_ctx_async(&(), &r)
357+
.await
358+
},
359+
Ok(None) => Ok($crate::Value::null()),
360+
Err(e) => Err(e)
361+
}
362+
});
363+
}
364+
)*
365+
366+
panic!("Field {} not found on type {}", _field_name, $($outname)*)
367+
}
368+
}
369+
);*/
258370
};
259371

260372
(

juniper/src/macros/tests/interface.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,13 @@ graphql_interface!(ResolversWithTrailingComma: () |&self| {
115115

116116
#[crate::graphql_object_internal(
117117
// FIXME: make async work
118-
noasync
119118
)]
120119
impl<'a> Root {
121120
fn custom_name() -> CustomName {
122121
CustomName {}
123122
}
124123

125-
fn with_lifetime() -> WithLifetime<'a> {
124+
async fn with_lifetime() -> WithLifetime<'a> {
126125
WithLifetime { data: PhantomData }
127126
}
128127
fn with_generics() -> WithGenerics<i32> {
@@ -254,6 +253,7 @@ async fn introspect_with_generics() {
254253
.await;
255254
}
256255

256+
257257
#[tokio::test]
258258
async fn introspect_description_first() {
259259
run_type_info_query("DescriptionFirst", |object, fields| {

0 commit comments

Comments
 (0)