Add documentation for the union helper macro
This commit is contained in:
parent
8a51c33cb1
commit
f4887badeb
2 changed files with 31 additions and 9 deletions
|
@ -16,20 +16,23 @@ See the documentation for [`graphql_object!`][1] on the general item and type
|
||||||
syntax. `graphql_interface!` requires an additional `instance_resolvers` item,
|
syntax. `graphql_interface!` requires an additional `instance_resolvers` item,
|
||||||
and does _not_ support the `interfaces` item.
|
and does _not_ support the `interfaces` item.
|
||||||
|
|
||||||
`instance_resolvers` is a list/lambda hybrid used to resolve the concrete
|
`instance_resolvers` is a match like structure used to resolve the concrete
|
||||||
instance type of the interface. It starts with a context argument and continues
|
instance type of the interface. It starts with a context argument and continues
|
||||||
with an array of expressions, each resolving into an `Option<T>` of the possible
|
with a number of match arms; on the left side is the indicated type, and on the
|
||||||
instances:
|
right an expression that resolve into `Option<T>` of the type indicated:
|
||||||
|
|
||||||
```rust,ignore
|
```rust,ignore
|
||||||
instance_resolvers: |&context| {
|
instance_resolvers: |&context| {
|
||||||
Human => context.get_human(self.id()), // returns Option<Human>
|
&Human => context.get_human(self.id()), // returns Option<&Human>
|
||||||
Droid => context.get_droid(self.id()), // returns Option<Droid>
|
&Droid => context.get_droid(self.id()), // returns Option<&Droid>
|
||||||
},
|
},
|
||||||
```
|
```
|
||||||
|
|
||||||
Each item in the array will be executed in order when the concrete type is
|
This is used for both the `__typename` field and when resolving a specialized
|
||||||
required.
|
fragment, e.g. `...on Human`. For `__typename`, the resolvers will be executed
|
||||||
|
in order - the first one returning `Some` will be the determined type name. When
|
||||||
|
resolving fragment type conditions, only the corresponding match arm will be
|
||||||
|
executed.
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
|
@ -71,8 +74,8 @@ graphql_interface!(<'a> &'a Character: Database as "Character" |&self| {
|
||||||
field id() -> &str { self.id() }
|
field id() -> &str { self.id() }
|
||||||
|
|
||||||
instance_resolvers: |&context| {
|
instance_resolvers: |&context| {
|
||||||
Human => context.humans.get(self.id()),
|
&Human => context.humans.get(self.id()),
|
||||||
Droid => context.droids.get(self.id()),
|
&Droid => context.droids.get(self.id()),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/**
|
||||||
|
Expose GraphQL unions
|
||||||
|
|
||||||
|
Like interfaces, mapping unions can be tricky in idiomatic Rust. Because of
|
||||||
|
their similarity, the helper macros are similar, too: you provide a set of
|
||||||
|
expressions that resolve the union into the actual concrete type.
|
||||||
|
|
||||||
|
## Syntax
|
||||||
|
|
||||||
|
See the documentation for [`graphql_object!`][1] on the general item and type
|
||||||
|
syntax. `graphql_union!` supports only `description` and `interface_resolvers`
|
||||||
|
items, no fields or interfaces can be declared.
|
||||||
|
|
||||||
|
See the documentation for [`graphql_interface!`][2] on the syntax for interface
|
||||||
|
resolvers.
|
||||||
|
|
||||||
|
[1]: macro.graphql_object!.html
|
||||||
|
[2]: macro.graphql_interface!.html
|
||||||
|
*/
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! graphql_union {
|
macro_rules! graphql_union {
|
||||||
( @as_item, $i:item) => { $i };
|
( @as_item, $i:item) => { $i };
|
||||||
|
|
Loading…
Reference in a new issue