#[macro_export(local_inner_macros)]
macro_rules! graphql_scalar {
( @as_expr, $e:expr) => { $e };
( @maybe_apply, None, $func:ident, $val:expr ) => { $val };
( @maybe_apply, $arg:tt, $func:ident, $val:expr ) => { $val.$func($arg) };
(
@generate,
( $name:ty, $outname:expr, $descr:tt ),
(
( $resolve_selfvar:ident, $resolve_retval:ty, $resolve_body:block ),
( $fiv_arg:ident, $fiv_result:ty, $fiv_body:block )
)
) => {
impl $crate::GraphQLType for $name {
type Context = ();
type TypeInfo = ();
fn name(_: &()) -> Option<&str> {
Some(graphql_scalar!( @as_expr, $outname ))
}
fn meta<'r>(
info: &(),
registry: &mut $crate::Registry<'r>
) -> $crate::meta::MetaType<'r> {
graphql_scalar!(
@maybe_apply, $descr, description,
registry.build_scalar_type::<Self>(info))
.into_meta()
}
fn resolve(
&$resolve_selfvar,
_: &(),
_: Option<&[$crate::Selection]>,
_: &$crate::Executor<Self::Context>) -> $resolve_retval {
$resolve_body
}
}
impl $crate::ToInputValue for $name {
fn to_input_value(&$resolve_selfvar) -> $crate::InputValue {
$crate::ToInputValue::to_input_value(&$resolve_body)
}
}
impl $crate::FromInputValue for $name {
fn from_input_value($fiv_arg: &$crate::InputValue) -> $fiv_result {
$fiv_body
}
}
};
(
@parse,
$meta:tt,
$acc:tt,
) => {
graphql_scalar!( @generate, $meta, $acc );
};
(
@parse,
$meta:tt,
( $_ignored:tt, $fiv:tt ),
resolve(&$selfvar:ident) -> $retval:ty $body:block $($rest:tt)*
) => {
graphql_scalar!( @parse, $meta, ( ($selfvar, $retval, $body), $fiv ), $($rest)* );
};
(
@parse,
$meta:tt,
( $resolve:tt, $_ignored:tt ),
from_input_value($arg:ident: &InputValue) -> $result:ty $body:block $($rest:tt)*
) => {
graphql_scalar!( @parse, $meta, ( $resolve, ( $arg, $result, $body ) ), $($rest)* );
};
(
@parse,
( $name:ty, $outname:expr, $_ignored:tt ),
$acc:tt,
description: $descr:tt $($rest:tt)*
) => {
graphql_scalar!( @parse, ( $name, $outname, $descr ), $acc, $($rest)* );
};
( $name:ty as $outname:tt { $( $items:tt )* }) => {
graphql_scalar!( @parse, ( $name, $outname, None ), ( None, None ), $($items)* );
};
( $name:ty { $( $items:tt )* }) => {
graphql_scalar!( @parse, ( $name, __graphql__stringify!($name), None ), ( None, None ), $($items)* );
};
}