Compile time dispatch for patterns.
Similar to Elixirs Protocol
but uses pattern matching on the value.
If available in Hex, the package can be installed
by adding dispatchex
to your list of dependencies in mix.exs
:
def project do
[
# ...
compilers: Mix.compilers() ++ [:dispatch]
]
def deps do
[
# ...
{:dispatchex, "~> 0.1.0"}
]
end
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/dispatchex.
To add support for live reload compilation add to reloadable_compilers
in config/dev.exs
.
config :phxapp_web, PhxApp.Endpoint,
reloadable_compilers: [:gettext, :phoenix, :elixir, :dispatch],
defmodule Castable do
use DispatchEx, :protocol
@callback cast(term()) :: {:ok, term()} | {:error, atom()}
# Add optional fallback clause,
def cast(_), do: {:error, :fallback}
end
defmodule WrappedNumber do
use DispatchEx, for: Castable
def cast(%{"type" => "number", "value" => v}), do: {:ok, {:integer, v}}
end
defmodule WrappedString do
use DispatchEx, for: Castable
def cast(%{"type" => "string", "value" => v}), do: {:ok, {:string, v}}
end
{:ok, {:string, "abc"}} = Castable.cast(%{"type" => "string", "value" => "abc"})
{:ok, {:integer, 123}} = Castable.cast(%{"type" => "number", "value" => 123})
{:error, :fallback} = Castable.cast(%{})