Packages

Lib for elixir

Current section

Files

Jump to
gulib lib validations range.ex
Raw

lib/validations/range.ex

defmodule Gulib.Validations.Range do
def validate(value, options \\ []) do
Gulib.Validate.unless_skipping(value, options) do
case bounds(options) do
{nil, nil} -> raise "Missing value validation range(is, min, max or range)"
{same, same} ->
if value == same do
:ok
else
{:fail, :wrong_value_range, Gulib.Translator.dgettext("validate", "must have a value of %{value}", value: same)}
end
{nil, max} ->
if value <= max do
:ok
else
{:fail, :value_too_large, Gulib.Translator.dgettext("validate", "must have a value of no large than %{max}", max: max)}
end
{min, nil} ->
if min <= value do
:ok
else
{:fail, :value_too_small, Gulib.Translator.dgettext("validate", "must have a value of at least %{min}", min: min)}
end
{min, max} ->
if min <= value and value <= max do
:ok
else
{:fail, :wrong_value_range, Gulib.Translator.dgettext("validate", "must have a value between %{min} and %{max}", min: min, max: max)}
end
end
end
end
defp bounds(options) do
is = Keyword.get(options, :is)
min = Keyword.get(options, :min)
max = Keyword.get(options, :max)
range = Keyword.get(options, :in)
cond do
is -> {is, is}
min -> {min, max}
max -> {min, max}
range -> {range.first, range.last}
true -> {nil, nil}
end
end
end