Define a new GraphQL object type.
Resolved objects fields should be used with #[derive(ResolvedObject)] derive macro.
| Attribute | Description | Type | 
rename_fields | Rename all the fields according to the given case convention. The possible values are lowercase, UPPERCASE, PascalCase, camelCase, snake_case, and SCREAMING_SNAKE_CASE. | String | 
rename_args | Rename all the arguments according to the given case convention. The possible values are lowercase, UPPERCASE, PascalCase, camelCase, snake_case, and SCREAMING_SNAKE_CASE. | String | 
| Attribute | Description | Type | 
name | The name of the field | String | 
skip | Skip this field | bool | 
deprecation | Mark this field as a deprecated | bool | 
deprecation | Mark this field as deprecated with the reason | String | 
rename_args | Rename all the arguments according to the given case convention. The possible values are lowercase, UPPERCASE, PascalCase, camelCase, snake_case, and SCREAMING_SNAKE_CASE. | String | 
| Attribute | Description | Type | 
name | The name of the argument | String | 
ctx | Mark this argument as a context | bool | 
 
String, &str, ID 
bool 
i8, i16, i32, i64, i128, isize 
u8, u16, u32, u64, u128, usize 
f32, f64 
Option<T> where T is one of the valid output types 
Vec<T>, &[T] where T is one of the valid output types 
Result<T, E> where T is one of the valid output types 
Instance<dyn Trait> where Trait is marked by #[Interface] 
- types defined by 
#[derive(SimpleObject)] 
- types defined by 
#[derive(ResolvedObject)] 
- types defined by 
#[derive(Enum)] 
- types defined by 
#[derive(Scalar)] 
- types defined by 
#[derive(Union)] 
- any type implements 
OutputTypeName and ResolveRef traits if a reference is returned 
- any type implements 
OutputTypeName and ResolveOwned traits if an owned value is returned 
String, &str, ID 
bool 
i8, i16, i32, i64, i128, isize 
u8, u16, u32, u64, u128, usize 
f32, f64 
Option<T> where T is one of the valid argument types 
MaybeUndefined<T> where T is one of the valid argument types 
Vec<T> where T is one of the valid argument types 
Upload type 
Result<T> where T is one of the valid argument types (except Option<T> and MaybeUndefined<T>, use Option<Result<T>> or MaybeUndefined<Result<T>> instead) 
- types defined by 
#[derive(InputObject)] 
- types defined by 
#[derive(Enum)] 
- types defined by 
#[derive(Scalar)] 
- any type implements 
InputTypeName and FromValue traits 
use dynamic_graphql::{ResolvedObject, ResolvedObjectFields, App};
#[derive(ResolvedObject)]
struct Foo {
    value: i32,
}
#[ResolvedObjectFields]
impl Foo {
    fn bar(&self) -> i32 {
        self.value
    }
}
#[derive(ResolvedObject)]
#[graphql(root)]
struct Query;
#[ResolvedObjectFields]
impl Query {
    async fn foo() -> Foo {
        Foo { value: 1 }
    }
}
#[derive(App)]
struct App(Query);
let schema = App::create_schema().finish().unwrap();
assert_eq!(
    normalize_schema(&schema.sdl()),
    r#"
type Foo {
  bar: Int!
}
type Query {
  foo: Foo!
}
schema {
  query: Query
}
"#
);
 
use dynamic_graphql::{ResolvedObject, ResolvedObjectFields, App};
#[derive(ResolvedObject)]
#[graphql(root)]
#[graphql(name = "RootQuery")]
struct Query;
#[ResolvedObjectFields]
#[graphql(rename_fields = "snake_case")]
#[graphql(rename_args = "PascalCase")]
impl Query {
    fn first_field(&self) -> i32 {
        1
    }
    
    #[graphql(name = "THE_SECOND")]
    fn second_field(&self) -> i32 {
        2
    }
    
    fn third_field(&self, #[graphql(name = "theArg")] arg: i32, _other_arg: i32) -> i32 {
        arg
    }
    
    #[graphql(rename_args = "snake_case")]
    fn fourth_field(&self, #[graphql(name = "theArg")] arg: i32, _other_arg: i32) -> i32 {
        arg
    }
}
#[derive(App)]
struct App(Query);
let schema = App::create_schema().finish().unwrap();
assert_eq!(
    normalize_schema(&schema.sdl()),
    r#"
type RootQuery {
  first_field: Int!
  THE_SECOND: Int!
  third_field(theArg: Int!, OtherArg: Int!): Int!
  fourth_field(theArg: Int!, other_arg: Int!): Int!
}
schema {
  query: RootQuery
}
"#
);
 
use dynamic_graphql::{ResolvedObject, ResolvedObjectFields, App};
#[derive(ResolvedObject)]
#[graphql(root)]
struct Query;
#[ResolvedObjectFields]
impl Query {
    #[graphql(skip)]
    fn first_field(&self) -> i32 {
        1
    }
    
    #[graphql(deprecation)]
    fn second_field(&self) -> i32 {
        2
    }
    #[graphql(deprecation = "the old one")]
    fn third_field(&self) -> i32 {
        3
    }
    
    fn fourth_field(&self) -> i32 {
        4
    }
}
#[derive(App)]
struct App(Query);
let schema = App::create_schema().finish().unwrap();
assert_eq!(
    normalize_schema(&schema.sdl()),
    r#"
"""
  the query
"""
type Query {
  secondField: Int! @deprecated
  thirdField: Int! @deprecated(reason: "the old one")
  """
    the fourth field
  """
  fourthField: Int!
}
schema {
  query: Query
}
"#
);
 
use dynamic_graphql::ResolvedObjectFields;
use dynamic_graphql::ResolvedObject;
use dynamic_graphql::App;
use dynamic_graphql::Context;
use dynamic_graphql::dynamic;
use dynamic_graphql::FieldValue;
use dynamic_graphql::value;
use dynamic_graphql::dynamic::DynamicRequestExt;
#[derive(ResolvedObject)]
#[graphql(root)]
struct Query {
    value: i32,
}
#[ResolvedObjectFields]
impl Query {
    fn simple_arg(arg: i32) -> i32 {
        arg
    }
    fn with_context(
        _ctx: &Context,
        #[graphql(ctx)] _context: &Context,
        #[graphql(name = "ctx")] ctx_arg: i32,
    ) -> i32 {
        ctx_arg
    }
    fn with_self(&self, arg: i32) -> i32 {
        self.value + arg
    }
}
#[derive(App)]
struct App(Query);
let schema = App::create_schema().finish().unwrap();
assert_eq!(
    normalize_schema(&schema.sdl()),
    r#"
type Query {
  simpleArg(arg: Int!): Int!
  withContext(ctx: Int!): Int!
  withSelf(arg: Int!): Int!
}
schema {
  query: Query
}
"#
);
let query = r#"
query {
    withSelf(arg: 1)
}
"#;
let root = Query {
    value: 1,
};
let req = dynamic_graphql::Request::new(query).root_value(FieldValue::owned_any(root));
let res = schema.execute(req).await;
let data = res.data;
assert_eq!(
    data,
    value!({ "withSelf": 2 }),
);