Bootstrap codegen for scalars
This commit is contained in:
parent
5a3bd6c8a9
commit
21c7a3a653
2 changed files with 59 additions and 1 deletions
|
@ -2,7 +2,7 @@
|
||||||
//!
|
//!
|
||||||
//! [`str`]: primitive@std::str
|
//! [`str`]: primitive@std::str
|
||||||
|
|
||||||
use std::{sync::Arc, rc::Rc};
|
use std::{rc::Rc, sync::Arc};
|
||||||
|
|
||||||
use futures::future;
|
use futures::future;
|
||||||
|
|
||||||
|
|
|
@ -330,6 +330,8 @@ impl ToTokens for Definition {
|
||||||
self.impl_from_input_value_tokens().to_tokens(into);
|
self.impl_from_input_value_tokens().to_tokens(into);
|
||||||
self.impl_parse_scalar_value_tokens().to_tokens(into);
|
self.impl_parse_scalar_value_tokens().to_tokens(into);
|
||||||
self.impl_reflection_traits_tokens().to_tokens(into);
|
self.impl_reflection_traits_tokens().to_tokens(into);
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
self.impl_resolve_input_value_tokens().to_tokens(into);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,6 +526,37 @@ impl Definition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns generated code implementing [`resolve::InputValue`] trait for
|
||||||
|
/// this [GraphQL scalar][1].
|
||||||
|
///
|
||||||
|
/// [`resolve::InputValue`]: juniper::resolve::InputValue
|
||||||
|
/// [1]: https://spec.graphql.org/October2021#sec-Scalars
|
||||||
|
fn impl_resolve_input_value_tokens(&self) -> TokenStream {
|
||||||
|
let scalar = &self.scalar;
|
||||||
|
|
||||||
|
let conversion = self.methods.expand_try_from_input_value(scalar);
|
||||||
|
|
||||||
|
let (ty, mut generics) = self.impl_self_and_generics(false);
|
||||||
|
generics.params.push(parse_quote! { '__inp });
|
||||||
|
let (impl_gens, _, where_clause) = generics.split_for_impl();
|
||||||
|
|
||||||
|
quote! {
|
||||||
|
#[automatically_derived]
|
||||||
|
impl#impl_gens ::juniper::resolve::InputValue<'__inp, #scalar> for #ty
|
||||||
|
#where_clause
|
||||||
|
{
|
||||||
|
type Error = ::juniper::FieldError<#scalar>;
|
||||||
|
|
||||||
|
fn try_from_input_value(
|
||||||
|
input: &'__inp ::juniper::graphql::InputValue<#scalar>,
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
|
#conversion
|
||||||
|
.map_err(::juniper::IntoFieldError::<#scalar>::into_field_error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns generated code implementing [`ParseScalarValue`] trait for this
|
/// Returns generated code implementing [`ParseScalarValue`] trait for this
|
||||||
/// [GraphQL scalar][1].
|
/// [GraphQL scalar][1].
|
||||||
///
|
///
|
||||||
|
@ -790,6 +823,31 @@ impl Methods {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Expands [`resolve::InputValue::try_from_input_value()`][0] method.
|
||||||
|
///
|
||||||
|
/// [0]: juniper::resolve::InputValue::try_from_input_value
|
||||||
|
fn expand_try_from_input_value(&self, scalar: &scalar::Type) -> TokenStream {
|
||||||
|
match self {
|
||||||
|
Self::Custom { from_input, .. }
|
||||||
|
| Self::Delegated {
|
||||||
|
from_input: Some(from_input),
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
quote! { #from_input(input) }
|
||||||
|
}
|
||||||
|
|
||||||
|
Self::Delegated { field, .. } => {
|
||||||
|
let field_ty = field.ty();
|
||||||
|
let self_constructor = field.closure_constructor();
|
||||||
|
|
||||||
|
quote! {
|
||||||
|
<#field_ty as ::juniper::resolve::InputValue<'__inp, #scalar>>::try_from_input_value(input)
|
||||||
|
.map(#self_constructor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Expands [`ParseScalarValue::from_str`] method.
|
/// Expands [`ParseScalarValue::from_str`] method.
|
||||||
///
|
///
|
||||||
/// [`ParseScalarValue::from_str`]: juniper::ParseScalarValue::from_str
|
/// [`ParseScalarValue::from_str`]: juniper::ParseScalarValue::from_str
|
||||||
|
|
Loading…
Add table
Reference in a new issue