Packages

Norm is a system for specifying the structure of data. It can be used for validation and for generation of data. Norm does not provide any set of predicates and instead allows you to re-use any of your existing validations.

Current section

Files

Jump to
norm lib norm spec alt.ex
Raw

lib/norm/spec/alt.ex

defmodule Norm.Spec.Alt do
@moduledoc false
defstruct specs: []
defimpl Norm.Conformer.Conformable do
alias Norm.Conformer
alias Norm.Conformer.Conformable
def conform(%{specs: specs}, input, path) do
result =
specs
|> Enum.map(fn {name, spec} ->
case Conformable.conform(spec, input, path ++ [name]) do
{:ok, i} ->
{:ok, {name, i}}
{:error, errors} ->
{:error, errors}
end
end)
|> Conformer.group_results()
if Enum.any?(result.ok) do
{:ok, Enum.at(result.ok, 0)}
else
{:error, List.flatten(result.error)}
end
end
end
if Code.ensure_loaded?(StreamData) do
defimpl Norm.Generatable do
def gen(%{specs: specs}) do
case Enum.reduce(specs, [], &to_gen/2) do
{:error, error} ->
{:error, error}
generators ->
{:ok, StreamData.one_of(generators)}
end
end
def to_gen(_, {:error, error}), do: {:error, error}
def to_gen({_key, spec}, generators) do
case Norm.Generatable.gen(spec) do
{:ok, g} ->
[g | generators]
{:error, error} ->
{:error, error}
end
end
end
end
end