Current section

Files

Jump to
cqrs_tools lib cqrs absinthe enum.ex
Raw

lib/cqrs/absinthe/enum.ex

if Code.ensure_loaded?(Absinthe) do
defmodule Cqrs.Absinthe.Enum do
@moduledoc false
alias Cqrs.Absinthe.InvalidEnumError
def create_enum(enum_name, source_module, field_name) do
values =
case find_enum_values(source_module, field_name) do
[] ->
raise InvalidEnumError, module: source_module, field: field_name
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 find_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
end