Packages

A comprehensive library for working with both static and dynamic enum structures in Elixir.

Current section

Files

Jump to
enumex lib enumex static components index.ex
Raw

lib/enumex/static/components/index.ex

defmodule Enumex.Static.Components.Index do
@moduledoc """
A component that provides functions for working with enum indexes.
## Example
defmodule MyApp.Enums do
use Enumex.Static, components: [Enumex.Static.Components.Index]
# enum definitions go here
end
"""
use Enumex.Component
alias Enumex.Value
@doc """
Gets an enum id or enum value by index or returns the default.
## Example
iex> MyApp.Enums.elem(:my_enum, 1, :id, :fallback_id)
:first
iex> MyApp.Enums.elem(:my_enum, 100, :id, :fallback_id)
:fallback_id
iex> fallback_value = Enumex.Value.new(MyApp.Enums, :my_enum, :fallback_id, 1000)
iex> MyApp.Enums.elem(:my_enum, 1, fallback_value)
Enumex.Value.new(MyApp.Enums, :my_enum, :first, 1)
iex> MyApp.Enums.elem(:my_enum, 1, :value, fallback_value)
Enumex.Value.new(MyApp.Enums, :my_enum, :first, 1)
iex> MyApp.Enums.elem(:my_enum, 100, fallback_value)
fallback_value
iex> MyApp.Enums.elem(:my_enum, 100, :value, fallback_value)
fallback_value
"""
@callback at(Value.enum_name(), Value.index(), type :: :id, default :: Value.id()) :: Value.id()
@callback at(Value.enum_name(), Value.index(), type :: :value, default :: Value.id()) :: Value.t()
@doc """
Gets an enum index by enum id or value or returns the default.
## Example
iex> MyApp.Enums.find_index(:my_enum, :first)
1
iex> MyApp.Enums.find_index(:my_enum, :first, 100)
1
iex> MyApp.Enums.find_index(:my_enum, :non_existing)
nil
iex> MyApp.Enums.find_index(:my_enum, :non_existing, 100)
100
iex> first = Enumex.Value.new(MyApp.Enums, :my_enum, :first, 1)
iex> non_existing = Enumex.Value.new(MyApp.Enums, :my_enum, :non_existing, 100)
iex> MyApp.Enums.find_index(:my_enum, first)
1
iex> MyApp.Enums.find_index(:my_enum, first, 100)
1
iex> MyApp.Enums.find_index(:my_enum, non_existing)
nil
iex> MyApp.Enums.find_index(:my_enum, non_existing, 100)
100
"""
@callback find_index(
Value.enum_name(),
id_or_value :: Value.id() | Value.t(),
default :: Value.index()
) :: Value.index()
comp %{component: component, values: enum_values} do
@behaviour component
alias Enumex.Generator.Static.Components.Index
{ats_clauses, indexes_clauses} = Index.collect_clauses(enum_values)
@impl component
def at(enum_name, index, type \\ :value, default \\ nil) do
case {enum_name, index, type} do
unquote(ats_clauses)
end
end
@impl component
def find_index(enum_name, data, default \\ nil) do
case {enum_name, data} do
unquote(indexes_clauses)
end
end
end
end