[][src]Attribute Macro async_graphql::Object

#[Object]

Define a GraphQL object

Macro parameters

AttributedescriptionTypeOptional
nameObject namestringY
descObject descriptionstringY
cache_controlObject cache controlCacheControlY
extendsAdd fields to an entity that's defined in another serviceboolY

Field parameters

AttributedescriptionTypeOptional
nameField namestringY
descField descriptionstringY
deprecationField deprecation reasonstringY
cache_controlField cache controlCacheControlY
externalMark a field as owned by another service. This allows service A to use fields from service B while also knowing at runtime the types of that field.boolY
providesAnnotate the expected returned fieldset from a field on a base type that is guaranteed to be selectable by the gateway.stringY
requiresAnnotate the required input fieldset from a base type for a resolver. It is used to develop a query plan where the required fields may not be needed by the client, but the service may need additional information from other services.stringY
guardField of guardGuardY
featureIt's like a #[cfg(feature = "foo")] attribute but instead of not compiling this field it will just return a proper FieldError to tell you this feature is not enabledstring ("feature1,feature2")Y

Field argument parameters

AttributedescriptionTypeOptional
nameArgument namestringY
descArgument descriptionstringY
defaultArgument default valuestringY
validatorInput value validatorInputValueValidatorY

The field returns the value type

  • A scalar value, such as i32, bool
  • Borrowing of scalar values, such as &i32, &bool
  • Vec, such as Vec<i32>
  • Slice, such as &[i32]
  • Option, such as Option<i32>
  • Object and &Object
  • Enum
  • FieldResult<T, E>, such as FieldResult<i32, E>

Context

You can define a context as an argument to a method, and the context should be the first argument to the method.

This example is not tested
#[Object]
impl QueryRoot {
    async fn value(&self, ctx: &Context<'_>) -> { ... }
}

Examples

use async_graphql::*;

struct QueryRoot {
    value: i32,
}

#[Object]
impl QueryRoot {
    #[field(desc = "value")]
    async fn value(&self) -> i32 {
        self.value
    }

    #[field(desc = "reference value")]
    async fn value_ref(&self) -> &i32 {
        &self.value
    }

    #[field(desc = "value with error")]
    async fn value_with_error(&self) -> FieldResult<i32> {
        Ok(self.value)
    }

    async fn value_with_arg(&self, #[arg(default = 1)] a: i32) -> i32 {
        a
    }
}

#[async_std::main]
async fn main() {
    let schema = Schema::new(QueryRoot{ value: 10 }, EmptyMutation, EmptySubscription);
    let res = schema.execute(r#"{
        value
        valueRef
        valueWithError
        valueWithArg1: valueWithArg
        valueWithArg2: valueWithArg(a: 99)
    }"#).await.unwrap().data;
    assert_eq!(res, serde_json::json!({
        "value": 10,
        "valueRef": 10,
        "valueWithError": 10,
        "valueWithArg1": 1,
        "valueWithArg2": 99
    }));
}