absinthe v1.1.5 Absinthe.Schema.Notation

This module contains macros used to build GraphQL types.

See Absinthe.Schema for a rough overview of schema building from scratch.

Summary

Macros

Add an argument

Mark a field as deprecated

Defines a description

Defines an enum type

Defines an enum type

Defines a GraphQL field

Defines a GraphQL field

Defines a GraphQL field

Import types from another module

Calculate the instruction for a directive

Declare an implemented interface for an object

Define an interface type

Declare implemented interfaces for an object

Marks a type reference as a list of the given type

Marks a type reference as non null

Declare a directive as operating an a AST node type

Defines a parse function for a scalar type

Defines a resolve function for a field

Define a type resolver for a union or interface

Defines a scalar type

Define a scalar type

Defines a serialization function for a scalar type

Defines the types possible under a union type

Defines a value possible under an enum type

Functions

record_object!(env, identifier, attrs, block)
recordable!(env, usage, kw_rules, opts \\ [])

Macros

arg(identifier, attrs)

Add an argument.

See arg/3

arg(identifier, type, attrs)

Add an argument.

Placement

Allowed under: directive field

Examples

field do
  arg :size, :integer
  arg :name, :string, description: "The desired name"
end
deprecate(msg)

Mark a field as deprecated

In most cases you can simply pass the deprecate: “message” attribute. However when using the block form of a field it can be nice to also use this macro.

Placement

Allowed under: field

Examples

field :foo, :string do
  deprecate "Foo will no longer be supported"
end

This is how to deprecate other things

field :foo, :string do
  arg :bar, :integer, deprecate: "This isn't supported either"
end

enum :colors do
  value :red
  value :blue, deprecate: "This isn't supported"
end
description(text)

Defines a description

This macro adds a description to any other macro which takes a block.

Note that you can also specify a description by using @desc above any item that can take a description attribute.

Placement

Allowed under any block. Not allowed to be top level

directive(identifier, attrs \\ [], list)

Defines a directive

Placement

Top level in module.

Examples

directive :mydirective do

  arg :if, non_null(:boolean), description: "Skipped when true."

  on Language.FragmentSpread
  on Language.Field
  on Language.InlineFragment

  instruction fn
    %{if: true} ->
      :skip
    _ ->
      :include
  end

end
enum(identifier, attrs)

Defines an enum type

See enum/3

enum(identifier, attrs, list)

Defines an enum type

Placement

Top level in module.

Examples

Handling RED, GREEN, BLUE values from the query document:

enum :color do
  value :red
  value :green
  value :blue
end

A given query document might look like:

{
  foo(color: RED)
}

Internally you would get an argument in elixir that looks like:

%{color: :red}

If your return value is an enum, it will get serialized out as:

{"color": "RED"}

You can provide custom value mappings. Here we use r, g, b values:

enum :color do
  value :red, as: "r"
  value :green, as: "g"
  value :blue, as: "b"
end
field(identifier, attrs)

Defines a GraphQL field

See field/4

field(identifier, attrs, attrs)

Defines a GraphQL field

See field/4

field(identifier, type, attrs, list)

Defines a GraphQL field.

Placement

Allowed under: input_object interface object

query, mutation, and subscription are all objects under the covers, and thus you’ll find field definitions under those as well.

Examples

field :id, :id
field :age, :integer, description: "How old the item is"
field :name, :string do
  description "The name of the item"
end
field :location, type: :location
import_types(type_module_ast)

Import types from another module

Very frequently your schema module will simply have the query and mutation blocks, and you’ll want to break out your other types into other modules. This macro imports those types for use the current module

Placement

Top level in module.

Examples

import_types MyApp.Schema.Types
input_object(identifier, attrs \\ [], list)

Defines an input object

See Absinthe.Type.InputObject

Placement

Top level in module.

Examples

input_object :contact_input do
  field :email, non_null(:string)
end
instruction(func_ast)

Calculate the instruction for a directive

Placement

Allowed under: directive

interface(identifier)

Declare an implemented interface for an object.

Adds an Absinthe.Type.Interface to your schema.

See also interfaces/1, which can be used for multiple interfaces, and interface/3, used to define interfaces themselves.

Examples

object :car do
  interface :vehicle
  # ...
end
interface(identifier, attrs \\ [], list)

Define an interface type.

Adds an Absinthe.Type.Interface to your schema.

Also see interface/1 and interfaces/1, which declare that an object implements one or more interfaces.

Placement

Top level in module.

Examples

interface :vehicle do
  field :wheel_count, :integer
end

object :rally_car do
  field :wheel_count, :integer
  interface :vehicle
end
interfaces(ifaces)

Declare implemented interfaces for an object.

See also interface/1, which can be used for one interface, and interface/3, used to define interfaces themselves.

Placement

Allowed under: object

Examples

object :car do
  interfaces [:vehicle, :branded]
  # ...
end
is_type_of(func_ast)

Placement

Allowed under: object

list_of(type)

Marks a type reference as a list of the given type

See field/3 for examples

non_null(type)

Marks a type reference as non null

See field/3 for examples

object(identifier, attrs \\ [], list)

Define an object type.

Adds an Absinthe.Type.Object to your schema.

Placement

Top level in module.

Examples

Basic definition:

object :car do
  # ...
end

Providing a custom name:

object :car, name: "CarType" do
  # ...
end
on(ast_node)

Declare a directive as operating an a AST node type

See directive/2

Placement

Allowed under: directive

parse(func_ast)

Defines a parse function for a scalar type

The specified parse function is used on incoming data to transform it into an elixir datastructure.

It should return {:ok, value} or {:error, reason}

Placement

Allowed under: scalar

resolve(func_ast)

Defines a resolve function for a field

Specify a 2 arity function to call when resolving a field. Resolve functions must return either {:ok, term} or {:error, binary | [binary, ...]}.

You can either hard code a particular anonymous function, or have a function call that returns a 2 arity anonymous function. See examples for more information.

The first argument to the function are the GraphQL arguments, and the latter is an Absinthe.Execution.Field struct. It is where you can access the GraphQL context and other execution data.

Note that when using a hard coded anonymous function, the function will not capture local variables.

Placement

Allowed under: field

Examples

query do
  field :person, :person do
    resolve &Person.resolve/2
  end
end
query do
  field :person, :person do
    resolve fn %{id: id}, _ ->
      Person.find(id)
    end
  end
end
query do
  field :person, :person do
    resolve lookup(:person)
  end
end

def lookup(:person) do
  fn %{id: id}, _ ->
    Person.find(id)
  end
end
resolve_type(func_ast)

Define a type resolver for a union or interface.

See also:

Placement

Allowed under: interface union

Examples

interface :entity do
  # ...
  resolve_type fn
    %{employee_count: _},  _ ->
      :business
    %{age: _}, _ ->
      :person
  end
end
scalar(identifier, attrs)

Defines a scalar type

See scalar/3

scalar(identifier, attrs, list)

Define a scalar type

A scalar type requires parse/1 and serialize/1 functions.

Placement

Top level in module.

Examples

scalar :time do
  description "ISOz time"
  parse &Timex.DateFormat.parse(&1, "{ISOz}")
  serialize &Timex.DateFormat.format!(&1, "{ISOz}")
end
serialize(func_ast)

Defines a serialization function for a scalar type

The specified serialize function is used on outgoing data. It should simply return the desired external representation.

Placement

Allowed under: scalar

types(types)

Defines the types possible under a union type

See union/3

Placement

Allowed under: union

union(identifier, attrs \\ [], list)

Defines a union type

See Absinthe.Type.Union

Placement

Top level in module.

Examples

union :search_result do
  description "A search result"

  types [:person, :business]
  resolve_type fn
    %Person{}, _ -> :person
    %Business{}, _ -> :business
  end
end
value(identifier, raw_attrs \\ [])

Defines a value possible under an enum type

See enum/3

Placement

Allowed under: enum