#![allow(unused_variables)] #![allow(dead_code)] #![allow(unreachable_code)] use crate::parser::parse_query; use crate::validation::visitor::{visit, Visitor, VisitorContext}; use crate::*; #[InputObject(internal)] struct TestInput { id: i32, name: String, } #[Enum(internal)] enum DogCommand { Sit, Heel, Down, } struct Dog; #[Object(internal)] impl Dog { async fn name(&self, surname: Option) -> Option { unimplemented!() } async fn nickname(&self) -> Option { unimplemented!() } async fn bark_volume(&self) -> Option { unimplemented!() } async fn barks(&self) -> Option { unimplemented!() } async fn does_know_command(&self, dog_command: Option) -> Option { unimplemented!() } async fn is_housetrained(&self, #[arg(default = "true")] at_other_homes: bool) -> Option { unimplemented!() } async fn is_at_location(&self, x: Option, y: Option) -> Option { unimplemented!() } } #[Enum(internal)] enum FurColor { Brown, Black, Tan, Spotted, } struct Cat; #[Object(internal)] impl Cat { async fn name(&self, surname: Option) -> Option { unimplemented!() } async fn nickname(&self) -> Option { unimplemented!() } async fn meows(&self) -> Option { unimplemented!() } async fn meow_volume(&self) -> Option { unimplemented!() } async fn fur_color(&self) -> Option { unimplemented!() } } #[Union(internal)] enum CatOrDog { Cat(Cat), Dog(Dog), } struct Human; #[Object(internal)] impl Human { async fn name(&self, surname: Option) -> Option { unimplemented!() } async fn pets(&self) -> Option>> { unimplemented!() } async fn relatives(&self) -> Option> { unimplemented!() } async fn iq(&self) -> Option { unimplemented!() } } struct Alien; #[Object(internal)] impl Alien { async fn name(&self, surname: Option) -> Option { unimplemented!() } async fn iq(&self) -> Option { unimplemented!() } async fn num_eyes(&self) -> Option { unimplemented!() } } #[Union(internal)] enum DogOrHuman { Dog(Dog), Human(Human), } #[Union(internal)] enum HumanOrAlien { Human(Human), Alien(Alien), } #[Interface( internal, field( name = "name", type = "Option", arg(name = "surname", type = "Option") ) )] enum Being { Dog(Dog), Cat(Cat), Human(Human), Alien(Alien), } #[Interface( internal, field( name = "name", type = "Option", arg(name = "surname", type = "Option") ) )] enum Pet { Dog(Dog), Cat(Cat), } #[Interface( internal, field( name = "name", type = "Option", arg(name = "surname", type = "Option") ) )] enum Canine { Dog(Dog), } #[Interface(internal, field(name = "iq", type = "Option"))] enum Intelligent { Human(Human), Alien(Alien), } #[InputObject(internal)] struct ComplexInput { required_field: bool, int_field: Option, string_field: Option, boolean_field: Option, string_list_field: Option>>, } struct ComplicatedArgs; #[Object(internal)] impl ComplicatedArgs { async fn int_arg_field(&self, int_arg: Option) -> Option { unimplemented!() } async fn non_null_int_arg_field(&self, non_null_int_arg: i32) -> Option { unimplemented!() } async fn string_arg_field(&self, string_arg: Option) -> Option { unimplemented!() } async fn boolean_arg_field(&self, boolean_arg: Option) -> Option { unimplemented!() } async fn enum_arg_field(&self, enum_arg: Option) -> Option { unimplemented!() } async fn float_arg_field(&self, float_arg: Option) -> Option { unimplemented!() } async fn id_arg_field(&self, id_arg: Option) -> Option { unimplemented!() } async fn string_list_arg_field( &self, string_list_arg: Option>>, ) -> Option { unimplemented!() } async fn complex_arg_field(&self, complex_arg: Option) -> Option { unimplemented!() } async fn multiple_reqs(&self, req1: i32, req2: i32) -> Option { unimplemented!() } async fn multiple_opts( &self, #[arg(default = "0")] opt1: i32, #[arg(default = "0")] opt2: i32, ) -> Option { unimplemented!() } async fn multiple_opt_and_req( &self, req1: i32, req2: i32, #[arg(default = "0")] opt1: i32, #[arg(default = "0")] opt2: i32, ) -> Option { unimplemented!() } } pub struct QueryRoot; #[Object(internal)] impl QueryRoot { async fn human(&self, id: Option) -> Option { unimplemented!() } async fn alien(&self) -> Option { unimplemented!() } async fn dog(&self) -> Option { unimplemented!() } async fn cat(&self) -> Option { unimplemented!() } async fn pet(&self) -> Option { unimplemented!() } async fn being(&self) -> Option { unimplemented!() } async fn intelligent(&self) -> Option { unimplemented!() } async fn cat_or_dog(&self) -> Option { unimplemented!() } async fn dog_or_human(&self) -> Option { unimplemented!() } async fn human_or_alien(&self) -> Option { unimplemented!() } async fn complicated_args(&self) -> Option { unimplemented!() } } pub struct MutationRoot; #[Object(internal)] impl MutationRoot { async fn test_input( &self, #[arg(default = r#"{id: 423, name: "foo"}"#)] input: TestInput, ) -> i32 { unimplemented!() } } pub struct SubscriptionRoot; #[Subscription(internal)] impl SubscriptionRoot {} pub fn expect_passes_rule<'a, V, F>(factory: F, query_source: &str) where V: Visitor<'a> + 'a, F: Fn() -> V, { expect_passes_rule_with_schema( QueryRoot, MutationRoot, SubscriptionRoot, factory, query_source, ); } pub fn expect_fails_rule<'a, V, F>(factory: F, query_source: &str) where V: Visitor<'a> + 'a, F: Fn() -> V, { expect_fails_rule_with_schema( QueryRoot, MutationRoot, SubscriptionRoot, factory, query_source, ); } pub fn validate<'a, Query, Mutation, Subscription, V, F>( query: Query, mutation: Mutation, subscription: Subscription, factory: F, query_source: &str, ) -> Result<()> where Query: ObjectType + Send + Sync + 'static, Mutation: ObjectType + Send + Sync + 'static, Subscription: SubscriptionType + Send + Sync + 'static, V: Visitor<'a> + 'a, F: Fn() -> V, { let schema = Schema::new(query, mutation, subscription); let registry = &schema.0.registry; let doc = parse_query(query_source).expect("Parse error"); let mut ctx = VisitorContext::new( unsafe { ::std::mem::transmute(&schema.0.registry) }, unsafe { ::std::mem::transmute(&doc) }, ); let mut visitor = factory(); visit(&mut visitor, &mut ctx, unsafe { ::std::mem::transmute(&doc) }); if !ctx.errors.is_empty() { return Err(Error::Rule { errors: ctx.errors }); } Ok(()) } pub fn expect_passes_rule_with_schema<'a, Query, Mutation, Subscription, V, F>( query: Query, mutation: Mutation, subscription: Subscription, factory: F, query_source: &str, ) where Query: ObjectType + Send + Sync + 'static, Mutation: ObjectType + Send + Sync + 'static, Subscription: SubscriptionType + Send + Sync + 'static, V: Visitor<'a> + 'a, F: Fn() -> V, { if let Err(err) = validate(query, mutation, subscription, factory, query_source) { if let Error::Rule { errors } = err { for err in errors { if let Some(position) = err.locations.first() { print!("[{}:{}] ", position.line, position.column); } println!("{}", err.message); } } panic!("Expected rule to pass, but errors found"); } } pub fn expect_fails_rule_with_schema<'a, Query, Mutation, Subscription, V, F>( query: Query, mutation: Mutation, subscription: Subscription, factory: F, query_source: &str, ) where Query: ObjectType + Send + Sync + 'static, Mutation: ObjectType + Send + Sync + 'static, Subscription: SubscriptionType + Send + Sync + 'static, V: Visitor<'a> + 'a, F: Fn() -> V, { if let Ok(_) = validate(query, mutation, subscription, factory, query_source) { panic!("Expected rule to fail, but no errors were found"); } }