Packages
absinthe
1.1.7
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
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.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
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.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Current section
Files
Jump to
Current section
Files
lib/absinthe/type/enum.ex
defmodule Absinthe.Type.Enum do
@moduledoc """
Used to define an enum type, a special scalar that can only have a defined set
of values.
See the `t` type below for details and examples.
## Examples
Given a type defined as the following (see `Absinthe.Schema.Notation`):
```
@desc "The selected color channel"
enum :color_channel do
value :red, as: :r, description: "Color Red"
value :green, as: :g, description: "Color Green"
value :blue, as: :b, description: "Color Blue"
value :alpha, as: :a, deprecate: "We no longer support opacity settings", description: "Alpha Channel"
end
```
The "ColorChannel" type (referred inside Absinthe as `:color_channel`) is an
Enum type, with values with names "red", "green", "blue", and "alpha" that map
to internal, raw values `:r`, `:g`, `:b`, and `:a`. The alpha color channel
is deprecated, just as fields and arguments can be.
You can omit the raw `value` if you'd like it to be the same as the
identifier. For instance, in this example the `value` is automatically set to
`:red`:
```
enum :color_channel do
description "The selected color channel"
value :red, description: "Color Red"
value :green, description: "Color Green"
value :blue, description: "Color Blue"
value :alpha, deprecate: "We no longer support opacity settings", description: "Alpha Channel"
end
```
If you really want to use a shorthand, skipping support for descriptions,
custom raw values, and deprecation, you can just provide a list of atoms:
```
enum :color_channel, values: [:red, :green, :blue, :alpha]
```
Keep in mind that writing a terse definition that skips descriptions and
deprecations today may hamper tooling that relies on introspection tomorrow.
"""
use Absinthe.Introspection.Kind
alias Absinthe.Type
@typedoc """
A defined enum type.
Should be defined using `Absinthe.Schema.Notation.enum/2`.
* `:name` - The name of the enum type. Should be a TitleCased `binary`. Set automatically.
* `:description` - A nice description for introspection.
* `:values` - The enum values, usually provided using the `Absinthe.Schema.Notation.values/1` or `Absinthe.Schema.Notation.value/1` macro.
The `:__reference__` key is for internal use.
"""
@type t :: %{name: binary, description: binary, values: %{binary => Type.Enum.Value.t}, __reference__: Type.Reference.t}
defstruct name: nil, description: nil, values: %{}, values_by_internal_value: %{}, values_by_name: %{}, __reference__: nil
def build(%{attrs: attrs}) do
raw_values = attrs[:values] || []
values = Type.Enum.Value.build(raw_values)
internal_values = Type.Enum.Value.build(raw_values, :value)
values_by_name = Type.Enum.Value.build(raw_values, :name)
quote do
%unquote(__MODULE__){
unquote_splicing(attrs),
values: unquote(values),
values_by_internal_value: unquote(internal_values),
values_by_name: unquote(values_by_name),
}
end
end
# Get the internal representation of an enum value
@doc false
@spec parse(t, any) :: any
def parse(enum, external_value) do
Map.fetch(enum.values_by_name, external_value)
end
# Get the external representation of an enum value
@doc false
@spec serialize!(t, any) :: binary
def serialize!(enum, internal_value) do
Map.fetch!(enum.values_by_internal_value, internal_value).name
end
end