Current section

Files

Jump to
formex lib validator simple.ex
Raw

lib/validator/simple.ex

defmodule Formex.Validator.Simple do
@behaviour Formex.Validator
alias Formex.Form
@moduledoc """
Very simple validator.
# Usage:
There is only one option you can use: `:required`.
```
def build_form(form) do
form
|> add(:name, :text_input, validation: [:required])
|> add(:content, :textarea, validation: [:required])
# ...
end
```
"""
@spec validate(Form.t()) :: Form.t()
def validate(form) do
errors =
form
|> Form.get_fields_validatable()
|> Enum.map(fn item ->
if item.validation do
errors =
form.new_struct
|> Map.from_struct()
|> Map.get(item.name)
|> do_validation(item.validation)
{item.name, errors}
else
{item.name, []}
end
end)
form
|> Map.put(:errors, errors)
end
@spec do_validation(value :: any, rules :: List.t()) :: List.t()
defp do_validation(value, rules) do
rules
|> Enum.map(fn rule ->
case rule do
:required ->
if (is_binary(value) && value == "") || !value do
"This field is required"
end
end
end)
|> Enum.filter(& &1)
|> Enum.map(fn message ->
{message, []}
end)
end
end