Estructura.Nested.Type.Enum (estructura v1.9.0)
View SourceEstructura
type scaffold for creating enumerated types with a limited set of valid values.
This module provides a way to create custom types that can only contain predetermined values, similar to enums in other languages.
Usage
There are two ways to use this type scaffold:
1. Using the module directly
iex> require Estructura.Nested.Type.Enum
...> Estructura.Nested.Type.Enum.type_module_ast(Status, [:pending, :active, :completed])
...> apply(Status, :validate, [:pending])
{:ok, :pending}
iex> apply(Status, :validate, [:invalid])
{:error, "Expected :invalid to be one of: [:pending, :active, :completed]"}
2. Using the use
macro
iex> defmodule Role do
...> use Estructura.Nested.Type.Enum, elements: [:admin, :user, :guest]
...> end
...> Role.validate(:admin)
{:ok, :admin}
Configuration Options
The scaffold accepts the following options:
:elements
- (required) List of valid values for the enum:coercer
- (optional) Function to coerce input values:encoder
- (optional) Function to encode values for JSON
Example with Custom Coercion
defmodule Status do
use Estructura.Nested.Type.Enum,
elements: [:pending, :active, :completed],
coercer: fn
str when is_binary(str) -> {:ok, String.to_existing_atom(str)}
atom when is_atom(atom) -> {:ok, atom}
other -> {:error, "Cannot coerce #{inspect(other)} to status"}
end
end
Example with Custom JSON Encoding
defmodule Role do
use Estructura.Nested.Type.Enum,
elements: [:admin, :user, :guest],
encoder: fn role, opts -> Jason.Encode.string(Atom.to_string(role), opts) end
end
Generated Functions
The scaffold implements the Estructura.Nested.Type
behaviour and provides:
generate/1
- Generates random values from the enum for testingcoerce/1
- Attempts to convert input into a valid enum valuevalidate/1
- Ensures a value is part of the enum
Generation Options
The generate/1
function accepts:
:only
- List of elements to generate from (default: all elements):except
- List of elements to exclude from generation
Role.generate(only: [:admin, :user]) |> Enum.take(1) |> List.first()
#⇒ :admin # or :user
Role.generate(except: [:guest]) |> Enum.take(1) |> List.first()
#⇒ :admin # or :user
Summary
Functions
Implements the enum type directly in the current module.
Creates a new enum type module with the given name and options.
Functions
Implements the enum type directly in the current module.
Options
See the module documentation for available options.
Examples
defmodule Role do
use Estructura.Nested.Type.Enum, elements: [:admin, :user, :guest]
end
Creates a new enum type module with the given name and options.
Options
See the module documentation for available options.
Examples
Estructura.Nested.Type.Enum.type_module_ast(__MODULE__, elements: [:pending, :active])