Current section
Files
Jump to
Current section
Files
lib/blunt/absinthe/enum.ex
defmodule Blunt.Absinthe.Enum do
@moduledoc false
alias Blunt.Absinthe.Error
def generate_type(enum_name, {enum_source_module, field_name}) do
values =
case enum_values(enum_source_module, field_name) do
[] ->
raise Error, message: "#{inspect(enum_source_module)}.#{field_name} is not a valid enum type"
values ->
Enum.map(values, fn enum_value -> quote do: value(unquote(enum_value)) end)
end
quote do
enum unquote(enum_name) do
(unquote_splicing(values))
end
end
end
defp enum_values(module, field_name) do
case module.__schema__(:type, field_name) do
{:parameterized, Ecto.Enum, opts} -> read_enum_values(opts)
{:array, {:parameterized, Ecto.Enum, opts}} -> read_enum_values(opts)
_ -> []
end
end
defp read_enum_values(opts) do
from_mappings =
opts
|> Map.get(:mappings, [])
|> Keyword.keys()
from_values = Map.get(opts, :values, [])
from_mappings ++ from_values
end
end