Derive Macro async_graphql::Union

source ·
#[derive(Union)]
{
    // Attributes available to this derive:
    #[graphql]
}
Expand description

Define a GraphQL union

See also the Book.

§Macro attributes

AttributedescriptionTypeOptional
nameObject namestringY
name_typeIf true, the object name will be specified from async_graphql::TypeName traitboolY
visibleIf false, it will not be displayed in introspection. See also the Book.boolY
visibleCall the specified function. If the return value is false, it will not be displayed in introspection.stringY
inaccessibleIndicate that an union is not accessible from a supergraph when using Apollo FederationboolY
tagArbitrary string metadata that will be propagated to the supergraph when using Apollo Federation. This attribute is repeatablestringY

§Item attributes

AttributedescriptionTypeOptional
flattenSimilar to serde (flatten)booleanY

§Define a union

Define TypeA, TypeB, … as MyUnion

use async_graphql::*;

#[derive(SimpleObject)]
struct TypeA {
    value_a: i32,
}

#[derive(SimpleObject)]
struct TypeB {
    value_b: i32
}

#[derive(Union)]
enum MyUnion {
    TypeA(TypeA),
    TypeB(TypeB),
}

struct Query;

#[Object]
impl Query {
    async fn all_data(&self) -> Vec<MyUnion> {
        vec![TypeA { value_a: 10 }.into(), TypeB { value_b: 20 }.into()]
    }
}

let schema = Schema::build(Query, EmptyMutation, EmptySubscription).data("hello".to_string()).finish();
let res = schema.execute(r#"
{
    allData {
        ... on TypeA {
            valueA
        }
        ... on TypeB {
            valueB
        }
    }
}"#).await.into_result().unwrap().data;
assert_eq!(res, value!({
    "allData": [
        { "valueA": 10 },
        { "valueB": 20 },
    ]
}));