GreenFairy.Enum (GreenFairy v0.3.0)

View Source

Defines a GraphQL enum type with a clean DSL and Ecto enum mapping support.

Basic Usage

defmodule MyApp.GraphQL.Enums.UserStatus do
  use GreenFairy.Enum

  enum "UserStatus" do
    value :active
    value :inactive
    value :pending, as: "PENDING_APPROVAL"
  end
end

Ecto Enum Mapping

Map GraphQL enum values to Ecto enum values automatically:

defmodule MyApp.GraphQL.Enums.PostVisibility do
  use GreenFairy.Enum

  enum "PostVisibility" do
    # GraphQL: PUBLIC, Ecto: :public
    value :public
    # GraphQL: FRIENDS_ONLY, Ecto: :friends
    value :friends_only, ecto: :friends
    # GraphQL: PRIVATE, Ecto: :private
    value :private
  end
end

Custom Transformations

Provide custom serialize/parse functions for complex mappings:

defmodule MyApp.GraphQL.Enums.Priority do
  use GreenFairy.Enum

  enum "Priority" do
    value :low
    value :medium
    value :high
  end

  # Transform GraphQL value to database value
  def serialize(:low), do: 1
  def serialize(:medium), do: 5
  def serialize(:high), do: 10

  # Transform database value to GraphQL value
  def parse(1), do: :low
  def parse(5), do: :medium
  def parse(10), do: :high
  def parse(_), do: nil
end

Options

  • :description - Description of the enum type (can also use @desc)
  • :ecto (on value) - Map this value to a different Ecto enum value

Summary

Functions

Defines a GraphQL enum type.

Defines the mapping between GraphQL enum values and Ecto/database values.

Controls whether this enum type appears in introspection results. See GreenFairy.Type.visible/1 for details.

Functions

enum(name, opts \\ [], list)

(macro)

Defines a GraphQL enum type.

Examples

enum "UserStatus" do
  value :active
  value :inactive
  value :pending, as: "PENDING_APPROVAL"
end

enum_mapping(mapping)

(macro)

Defines the mapping between GraphQL enum values and Ecto/database values.

Examples

enum "PostVisibility" do
  value :public
  value :friends_only
  value :private
end

# Map GraphQL values to Ecto enum values
enum_mapping %{
  public: :public,           # Same value
  friends_only: :friends,    # Different value
  private: :private          # Same value
}

When using this, serialize/1 and parse/1 functions are automatically generated.

visible(func)

(macro)

Controls whether this enum type appears in introspection results. See GreenFairy.Type.visible/1 for details.