Packages
ash_graphql
1.7.13
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.0
1.5.1
1.5.0
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.5
1.0.0-rc.4
retired
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.9
0.26.8
0.26.7
0.26.6
0.26.5
0.26.4
0.26.3
0.26.2
0.26.0
0.25.13
0.25.12
0.25.10
0.25.9
0.25.8
0.25.7
0.25.6
0.25.5
0.25.4
0.25.3
0.25.2
0.25.1
0.25.0
0.24.1
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.13
0.22.12
0.22.11
0.22.10
0.22.9
0.22.8
0.22.7
0.22.6
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
retired
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0-rc.3
0.20.0-rc.2
0.20.0-rc.1
0.20.0-rc.0
0.19.0
0.18.0-rc0
0.17.5
0.17.5-rc0
0.17.4
0.17.2
0.17.1
0.17.0
0.16.28
0.16.27
0.16.26
0.16.25
0.16.24
0.16.23
0.16.22
0.16.21
0.16.20
0.16.18-rc5
0.16.18-rc4
0.16.18-rc3
0.16.18-rc2
0.16.18-rc1
0.16.18-rc0
0.16.17
0.16.16
0.16.15
0.16.14
0.16.13
0.16.12
0.16.11
0.16.10
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.1
0.14.0
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.1
0.12.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.3
0.1.2
The extension for building GraphQL APIs with Ash
Current section
Files
Jump to
Current section
Files
lib/type.ex
defmodule AshGraphql.Type do
@moduledoc """
Callbacks used to enrich types with GraphQL-specific metadata.
"""
defmacro __using__(_) do
quote do
@behaviour AshGraphql.Type
end
end
@doc """
Sets the name of the graphql type for a given Ash type. For example: `:weekday`.
This will do different things depending on the type you're adding it to.
## Regular Types
This expresses that you will define a custom type for representing this in your graphql
## NewTypes
If it is a subtype of a union, or map/keyword with `fields` the type will be *created* with that name.
So you can use this to decide what it will be named. Otherwise, it behaves as stated above for
regular types.
"""
@callback graphql_type(Ash.Type.constraints()) :: atom
@doc """
Sets the name of the graphql input type for a given Ash type. For example: `:weekday`.
This will do different things depending on the type you're adding it to.
## Regular Types
This expresses that you will define a custom type for representing this input in your graphql
## NewTypes
If it is a subtype of a union, or map/keyword with `fields` the type will be *created* with that name.
So you can use this to decide what it will be named. Otherwise, it behaves as stated above for
regular types.
"""
@callback graphql_input_type(Ash.Type.constraints()) :: atom
@doc """
Used for `Ash.Type.Enum` to rename individual values. For example:
```elixir
defmodule MyEnum do
use Ash.Type.Enum, values: [:foo, :bar, :baz]
def graphql_rename_value(:baz), do: :buz
def graphql_rename_value(other), do: other
end
```
"""
@callback graphql_rename_value(Ash.Type.constraints()) :: String.t() | atom
@doc """
Used for map/embedded types embedded in unions, to avoid nesting them in a key by their name.
See [the unions guide](/documentation/topics/use-unions-with-graphql.md) for more.
"""
@callback graphql_unnested_unions(Ash.Type.constraints()) :: [atom()]
@doc """
Used for maps/enums/unions that *would* define a type automatically, to disable them.
"""
@callback graphql_define_type?(Ash.Type.constraints()) :: false
@doc """
Used for `Ash.Type.Enum` to provide a description for individual values. For example:
```elixir
defmodule MyEnum do
use Ash.Type.Enum, values: [:foo, :bar, :baz]
def graphql_describe_enum_value(:baz), do: "A baz"
def graphql_describe_enum_value(_), do: nil
end
```
"""
@callback graphql_describe_enum_value(atom) :: String.t() | nil
@doc """
Used to add a custom description to GraphQL generated types (for maps, enums and unions that auto-derive).
```elixir
defmodule MyMap do
use Ash.Type.NewType, ...
def graphql_description(_constraints), do: "My special map"
end
```
"""
@callback graphql_description(atom) :: String.t() | nil
@doc false
def description(type, constraints) do
if function_exported?(type, :graphql_description, 1) do
type.graphql_description(constraints)
else
nil
end
end
@doc false
def type({:array, type}, constraints) do
type(type, constraints)
end
def type(type, constraints) do
if function_exported?(type, :graphql_type, 1) do
type.graphql_type(constraints)
else
nil
end
end
@doc false
def input_type({:array, type}, constraints) do
input_type(type, constraints)
end
def input_type(type, constraints) do
if function_exported?(type, :graphql_input_type, 1) do
type.graphql_input_type(constraints)
else
nil
end
end
@optional_callbacks graphql_type: 1,
graphql_input_type: 1,
graphql_rename_value: 1,
graphql_description: 1,
graphql_unnested_unions: 1,
graphql_describe_enum_value: 1,
graphql_define_type?: 1
end