Impl graphql::Enum trait for enums [skip ci]

This commit is contained in:
tyranron 2022-06-27 17:05:01 +02:00
parent 4257e72c75
commit fa03c7fa4d
No known key found for this signature in database
GPG key ID: 762E144FB230A4F0
2 changed files with 104 additions and 4 deletions

View file

@ -6,9 +6,22 @@ pub use crate::{
macros::{input_value, value, vars},
resolve::Type,
value::Value,
GraphQLScalar as Scalar,
GraphQLEnum as Enum, GraphQLScalar as Scalar,
};
pub trait Enum<
'inp,
TypeInfo: ?Sized,
Context: ?Sized,
ScalarValue: 'inp,
Behavior: ?Sized = behavior::Standard,
>:
InputType<'inp, TypeInfo, ScalarValue, Behavior>
+ OutputType<TypeInfo, Context, ScalarValue, Behavior>
{
fn assert_enum();
}
/*
pub trait Interface<S>: OutputType<S>
+ resolve::TypeName

View file

@ -445,9 +445,9 @@ impl ToTokens for Definition {
self.impl_resolve_value_async().to_tokens(into);
self.impl_resolve_to_input_value().to_tokens(into);
self.impl_resolve_input_value().to_tokens(into);
//self.impl_graphql_input_type().to_tokens(into);
//self.impl_graphql_output_type().to_tokens(into);
//self.impl_graphql_enum().to_tokens(into);
self.impl_graphql_input_type().to_tokens(into);
self.impl_graphql_output_type().to_tokens(into);
self.impl_graphql_enum().to_tokens(into);
self.impl_reflect().to_tokens(into);
}
}
@ -479,6 +479,93 @@ impl Definition {
}
}
/// Returns generated code implementing [`graphql::InputType`] trait for
/// this [GraphQL enum][0].
///
/// [`graphql::InputType`]: juniper::graphql::InputType
/// [0]: https://spec.graphql.org/October2021#sec-Enums
#[must_use]
fn impl_graphql_input_type(&self) -> TokenStream {
let bh = &self.behavior;
let (ty, generics) = self.ty_and_generics();
let (inf, generics) = self.mix_type_info(generics);
let (sv, generics) = self.mix_scalar_value(generics);
let (lt, mut generics) = self.mix_input_lifetime(generics, &sv);
generics.make_where_clause().predicates.push(parse_quote! {
Self: ::juniper::resolve::Type<#inf, #sv, #bh>
+ ::juniper::resolve::ToInputValue<#sv, #bh>
+ ::juniper::resolve::InputValue<#lt, #sv, #bh>
});
let (impl_gens, _, where_clause) = generics.split_for_impl();
quote! {
#[automatically_derived]
impl#impl_gens ::juniper::graphql::InputType<#lt, #inf, #sv, #bh>
for #ty #where_clause
{
fn assert_input_type() {}
}
}
}
/// Returns generated code implementing [`graphql::OutputType`] trait for
/// this [GraphQL enum][0].
///
/// [`graphql::OutputType`]: juniper::graphql::OutputType
/// [0]: https://spec.graphql.org/October2021#sec-Enums
#[must_use]
fn impl_graphql_output_type(&self) -> TokenStream {
let bh = &self.behavior;
let (ty, generics) = self.ty_and_generics();
let (inf, generics) = self.mix_type_info(generics);
let (cx, generics) = self.mix_context(generics);
let (sv, mut generics) = self.mix_scalar_value(generics);
generics.make_where_clause().predicates.push(parse_quote! {
Self: ::juniper::resolve::Type<#inf, #sv, #bh>
+ ::juniper::resolve::Value<#inf, #cx, #sv, #bh>
+ ::juniper::resolve::ValueAsync<#inf, #cx, #sv, #bh>
});
let (impl_gens, _, where_clause) = generics.split_for_impl();
quote! {
#[automatically_derived]
impl#impl_gens ::juniper::graphql::OutputType<#inf, #cx, #sv, #bh>
for #ty #where_clause
{
fn assert_output_type() {}
}
}
}
/// Returns generated code implementing [`graphql::Enum`] trait for this
/// [GraphQL enum][0].
///
/// [`graphql::Enum`]: juniper::graphql::Enum
/// [0]: https://spec.graphql.org/October2021#sec-Enums
#[must_use]
fn impl_graphql_enum(&self) -> TokenStream {
let bh = &self.behavior;
let (ty, generics) = self.ty_and_generics();
let (inf, generics) = self.mix_type_info(generics);
let (cx, generics) = self.mix_context(generics);
let (sv, generics) = self.mix_scalar_value(generics);
let (lt, mut generics) = self.mix_input_lifetime(generics, &sv);
generics.make_where_clause().predicates.push(parse_quote! {
Self: ::juniper::graphql::InputType<#lt, #inf, #sv, #bh>
+ ::juniper::graphql::OutputType<#inf, #cx, #sv, #bh>
});
let (impl_gens, _, where_clause) = generics.split_for_impl();
quote! {
#[automatically_derived]
impl#impl_gens ::juniper::graphql::Enum<#lt, #inf, #cx, #sv, #bh>
for #ty #where_clause
{
fn assert_enum() {}
}
}
}
/// Returns generated code implementing [`GraphQLType`] trait for this
/// [GraphQL enum][0].
///