diff --git a/Cargo.toml b/Cargo.toml index c0a9253d..04a30337 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ serde = { version = "1.0.104", features = ["derive"] } serde_json = "1.0.48" spin = "0.5.2" thiserror = "1.0.11" +static_assertions = "1.1.0" # Feature optional dependencies uuid = { version = "0.8.1", optional = true, features = ["v4", "serde"] } diff --git a/derive/src/enum.rs b/derive/src/enum.rs index e3e5859b..f2d350c3 100644 --- a/derive/src/enum.rs +++ b/derive/src/enum.rs @@ -121,6 +121,8 @@ pub fn generate(enum_args: &args::Enum, input: &DeriveInput) -> Result Result< #crate_name::Value::Object(map) } } + + impl #crate_name::type_mark::TypeMarkInputObject for #ident {} }; Ok(expanded.into()) } diff --git a/derive/src/interface.rs b/derive/src/interface.rs index cc4df74c..a90f4f17 100644 --- a/derive/src/interface.rs +++ b/derive/src/interface.rs @@ -326,6 +326,8 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result #crate_name::resolver_utils::resolve_object(ctx, self).await } } + + impl #generics #crate_name::type_mark::TypeMarkInterface for #ident #generics {} }; Ok(expanded.into()) } diff --git a/derive/src/object.rs b/derive/src/object.rs index 40709288..ad992a11 100644 --- a/derive/src/object.rs +++ b/derive/src/object.rs @@ -521,6 +521,8 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result< #crate_name::resolver_utils::resolve_object(ctx, self).await } } + + impl #generics #crate_name::type_mark::TypeMarkObject for #self_ty #where_clause {} }; Ok(expanded.into()) } diff --git a/derive/src/scalar.rs b/derive/src/scalar.rs index 07683ff5..dc6d862e 100644 --- a/derive/src/scalar.rs +++ b/derive/src/scalar.rs @@ -68,6 +68,8 @@ pub fn generate(scalar_args: &args::Scalar, item_impl: &mut ItemImpl) -> Result< Ok(#crate_name::ScalarType::to_value(self).into_json().unwrap()) } } + + impl #generic #crate_name::type_mark::TypeMarkScalar for #self_ty #where_clause {} }; Ok(expanded.into()) } diff --git a/derive/src/simple_object.rs b/derive/src/simple_object.rs index 8269af74..0b5d974c 100644 --- a/derive/src/simple_object.rs +++ b/derive/src/simple_object.rs @@ -192,6 +192,8 @@ pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result Result< ::std::boxed::Box::pin(#crate_name::futures::stream::once(async { Err(error) })) } } + + impl #crate_name::type_mark::TypeMarkSubscription for #self_ty #where_clause {} }; Ok(expanded.into()) } diff --git a/derive/src/union.rs b/derive/src/union.rs index d5f5b93d..f64f6e1e 100644 --- a/derive/src/union.rs +++ b/derive/src/union.rs @@ -69,6 +69,8 @@ pub fn generate(union_args: &args::Interface, input: &DeriveInput) -> Result for #ident #generics { fn from(obj: #p) -> Self { @@ -149,6 +151,8 @@ pub fn generate(union_args: &args::Interface, input: &DeriveInput) -> Result TypeMarkObject for Connection {} diff --git a/src/types/connection/edge.rs b/src/types/connection/edge.rs index 9b87ccb7..78d65d1a 100644 --- a/src/types/connection/edge.rs +++ b/src/types/connection/edge.rs @@ -1,6 +1,7 @@ use crate::connection::EmptyFields; use crate::parser::types::Field; use crate::resolver_utils::{resolve_object, ObjectType}; +use crate::type_mark::TypeMarkObject; use crate::types::connection::CursorType; use crate::{registry, Context, ContextSelectionSet, OutputValueType, Positioned, Result, Type}; use indexmap::map::IndexMap; @@ -137,3 +138,5 @@ where resolve_object(ctx, self).await } } + +impl TypeMarkObject for Edge {} diff --git a/src/types/empty_mutation.rs b/src/types/empty_mutation.rs index 52c993b5..071e9bd8 100644 --- a/src/types/empty_mutation.rs +++ b/src/types/empty_mutation.rs @@ -1,5 +1,6 @@ use crate::parser::types::Field; use crate::resolver_utils::ObjectType; +use crate::type_mark::TypeMarkObject; use crate::{ registry, Context, ContextSelectionSet, Error, OutputValueType, Positioned, QueryError, Result, Type, @@ -67,3 +68,5 @@ impl OutputValueType for EmptyMutation { }) } } + +impl TypeMarkObject for EmptyMutation {} diff --git a/src/types/empty_subscription.rs b/src/types/empty_subscription.rs index 9b65402e..f0f3a041 100644 --- a/src/types/empty_subscription.rs +++ b/src/types/empty_subscription.rs @@ -1,3 +1,4 @@ +use crate::type_mark::TypeMarkSubscription; use crate::{registry, Context, Error, Pos, QueryError, Result, SubscriptionType, Type}; use futures::{stream, Stream}; use std::borrow::Cow; @@ -47,3 +48,5 @@ impl SubscriptionType for EmptySubscription { })) } } + +impl TypeMarkSubscription for EmptySubscription {} diff --git a/src/types/merged_object.rs b/src/types/merged_object.rs index 558b9eb6..50dfdd33 100644 --- a/src/types/merged_object.rs +++ b/src/types/merged_object.rs @@ -1,6 +1,7 @@ use crate::parser::types::Field; use crate::registry::{MetaType, Registry}; use crate::resolver_utils::{resolve_object, ObjectType}; +use crate::type_mark::{TypeMarkObject, TypeMarkSubscription}; use crate::{ CacheControl, Context, ContextSelectionSet, Error, OutputValueType, Positioned, QueryError, Result, SimpleObject, Subscription, SubscriptionType, Type, @@ -100,6 +101,8 @@ where } } +impl TypeMarkObject for MergedObject {} + impl SubscriptionType for MergedObject where A: SubscriptionType + Send + Sync, @@ -121,6 +124,8 @@ where } } +impl TypeMarkSubscription for MergedObject {} + #[doc(hidden)] #[derive(SimpleObject, Default)] #[graphql(internal)] diff --git a/src/types/query_root.rs b/src/types/query_root.rs index f3728360..de72a570 100644 --- a/src/types/query_root.rs +++ b/src/types/query_root.rs @@ -6,6 +6,7 @@ use crate::{ Result, SimpleObject, Type, }; +use crate::type_mark::TypeMarkObject; use indexmap::map::IndexMap; use std::borrow::Cow; @@ -152,3 +153,5 @@ impl OutputValueType for QueryRoot { resolve_object(ctx, self).await } } + +impl TypeMarkObject for QueryRoot {}