#[macro_export(local_inner_macros)]
macro_rules! graphql_object {
( @as_item, $i:item) => { $i };
( @as_expr, $e:expr) => { $e };
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
field deprecated
$reason:tt
$name:ident
$args:tt -> $t:ty
as $desc:tt
$body:block
$( $rest:tt )*
) => {
$acc.push(__graphql__args!(
@apply_args,
$reg,
$reg.field_convert::<$t, _, Self::Context>(
&$crate::to_camel_case(__graphql__stringify!($name)), $info)
.description($desc)
.deprecated($reason),
$info,
$args));
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*);
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
field deprecated $reason:tt $name:ident $args:tt -> $t:ty $body:block $( $rest:tt )*
) => {
$acc.push(__graphql__args!(
@apply_args,
$reg,
$reg.field_convert::<$t, _, Self::Context>(
&$crate::to_camel_case(__graphql__stringify!($name)), $info)
.deprecated($reason),
$info,
$args));
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*);
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
field $name:ident $args:tt -> $t:ty as $desc:tt $body:block $( $rest:tt )*
) => {
$acc.push(__graphql__args!(
@apply_args,
$reg,
$reg.field_convert::<$t, _, Self::Context>(
&$crate::to_camel_case(__graphql__stringify!($name)), $info)
.description($desc),
$info,
$args));
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*);
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
field $name:ident $args:tt -> $t:ty $body:block $( $rest:tt )*
) => {
$acc.push(__graphql__args!(
@apply_args,
$reg,
$reg.field_convert::<$t, _, Self::Context>(
&$crate::to_camel_case(__graphql__stringify!($name)), $info),
$info,
$args));
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*);
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
description : $value:tt $( $rest:tt )*
) => {
$descr = Some(graphql_object!(@as_expr, $value));
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*)
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
interfaces : $value:tt $( $rest:tt )*
) => {
graphql_object!(@assign_interfaces, $reg, $ifaces, $value);
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*)
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr, , $( $rest:tt )*
) => {
graphql_object!(@gather_object_meta, $reg, $acc, $info, $descr, $ifaces, $( $rest )*)
};
(
@gather_object_meta,
$reg:expr, $acc:expr, $info:expr, $descr:expr, $ifaces:expr,
) => {};
( @assign_interfaces, $reg:expr, $tgt:expr, [ $($t:ty,)* ] ) => {
$tgt = Some(__graphql__vec![
$($reg.get_type::<$t>(&())),*
]);
};
( @assign_interfaces, $reg:expr, $tgt:expr, [ $($t:ty),* ] ) => {
$tgt = Some(__graphql__vec![
$($reg.get_type::<$t>(&())),*
]);
};
(
( $($lifetime:tt)* );
$name:ty; $ctxt:ty; $outname:expr; $mainself:ident; $($items:tt)*
) => {
graphql_object!(@as_item, impl<$($lifetime)*> $crate::GraphQLType for $name {
type Context = $ctxt;
type TypeInfo = ();
fn name(_: &()) -> Option<&str> {
Some($outname)
}
#[allow(unused_assignments)]
#[allow(unused_mut)]
fn meta<'r>(
info: &(),
registry: &mut $crate::Registry<'r>
) -> $crate::meta::MetaType<'r> {
let mut fields = Vec::new();
let mut description = None;
let mut interfaces: Option<Vec<$crate::Type>> = None;
graphql_object!(
@gather_object_meta,
registry, fields, info, description, interfaces, $($items)*
);
let mut mt = registry.build_object_type::<$name>(info, &fields);
if let Some(description) = description {
mt = mt.description(description);
}
if let Some(interfaces) = interfaces {
mt = mt.interfaces(&interfaces);
}
mt.into_meta()
}
fn concrete_type_name(&self, _: &Self::Context, _: &()) -> String {
$outname.to_owned()
}
#[allow(unused_variables)]
#[allow(unused_mut)]
fn resolve_field(
&$mainself,
info: &(),
field: &str,
args: &$crate::Arguments,
executor: &$crate::Executor<Self::Context>
)
-> $crate::ExecutionResult
{
__graphql__build_field_matches!(
($outname, $mainself, field, args, executor),
(),
$($items)*);
}
});
};
(
<$( $lifetime:tt ),*> $name:ty : $ctxt:ty as $outname:tt | &$mainself:ident | {
$( $items:tt )*
}
) => {
graphql_object!(
( $($lifetime),* ); $name; $ctxt; $outname; $mainself; $( $items )*);
};
(
$name:ty : $ctxt:ty as $outname:tt | &$mainself:ident | {
$( $items:tt )*
}
) => {
graphql_object!(
( ); $name; $ctxt; $outname; $mainself; $( $items )*);
};
(
$name:ty : $ctxt:ty | &$mainself:ident | {
$( $items:tt )*
}
) => {
graphql_object!(
( ); $name; $ctxt; (__graphql__stringify!($name)); $mainself; $( $items )*);
};
}