Current section
Files
Jump to
Current section
Files
lib/rules/default.ex
defmodule Request.Validator.DefaultRules do
@moduledoc false
defmacro __using__(_) do
quote do
@doc """
## Examples
iex> Request.Validator.Rules.is_email("test@mail.com")
true
iex> Request.Validator.Rules.is_email("invalid@mail")
false
"""
@spec is_email(any()) :: boolean()
def is_email(value), do: EmailChecker.valid?(value || "")
@doc """
## Examples
iex> Request.Validator.Rules.is_gt(12, 10)
true
iex> Request.Validator.Rules.is_gt(10, 20)
false
"""
@spec is_gt(any(), integer()) :: boolean()
def is_gt(value, num), do: value > num
@doc """
## Examples
iex> Request.Validator.Rules.is_lt(12, 20)
true
iex> Request.Validator.Rules.is_lt(30, 20)
false
"""
@spec is_lt(any(), integer()) :: boolean()
def is_lt(value, num), do: value < num
@doc """
## Examples
iex> Request.Validator.Rules.is_max(12, 20)
true
iex> Request.Validator.Rules.is_max(30, 20)
false
iex> Request.Validator.Rules.is_max("short", 6)
true
iex> Request.Validator.Rules.is_max("longer string", 6)
false
iex> Request.Validator.Rules.is_max(["short list"], 2)
true
iex> Request.Validator.Rules.is_max(["longer", "list", "example"], 2)
false
"""
@spec is_max(any(), integer()) :: boolean()
def is_max(value, max) when is_number(value), do: value <= max
def is_max(value, max) when is_binary(value), do: String.length(value) <= max
def is_max(value, max) when is_list(value), do: Enum.count(value) <= max
@doc """
## Examples
iex> Request.Validator.Rules.is_min(12, 10)
true
iex> Request.Validator.Rules.is_min(30, 40)
false
iex> Request.Validator.Rules.is_min("longer", 6)
true
iex> Request.Validator.Rules.is_min("short", 6)
false
iex> Request.Validator.Rules.is_min(["longer", "list", "example"], 2)
true
iex> Request.Validator.Rules.is_min(["short list"], 2)
false
"""
@spec is_min(any(), integer()) :: boolean()
def is_min(value, min) when is_number(value), do: value >= min
def is_min(value, min) when is_binary(value), do: String.length(value) >= min
def is_min(value, min) when is_list(value), do: Enum.count(value) >= min
@doc """
## Examples
iex> Request.Validator.Rules.lt(nil, :field, %{field: 10})
true
iex> Request.Validator.Rules.lt(12, :field, %{field: 20})
true
iex> Request.Validator.Rules.lt(30, :field, %{field: 20})
false
"""
@spec lt(any(), binary(), map()) :: boolean()
def lt(nil, _, _), do: true
def lt(value, field, fields), do: is_lt(value, Map.get(fields, field))
@doc """
## Examples
iex> Request.Validator.Rules.gt(nil, :field, %{field: 10})
true
iex> Request.Validator.Rules.gt(120, :field, %{field: 20})
true
iex> Request.Validator.Rules.gt(10, :field, %{field: 20})
false
"""
@spec gt(any(), binary(), map()) :: boolean()
def gt(nil, _, _), do: true
def gt(value, field, fields), do: is_gt(value, Map.get(fields, field))
@doc """
See `is_email/2`.
"""
@spec email(any(), any()) :: boolean()
def email(nil, _), do: true
def email(value, _), do: is_email(value)
@doc """
## Examples
iex> Request.Validator.Rules.string("test@mail.com")
true
iex> Request.Validator.Rules.string(90)
false
iex> Request.Validator.Rules.string([])
false
"""
@spec string(any(), any()) :: boolean()
def string(nil, _), do: true
def string(val), do: string(val, nil)
def string(value, _), do: is_binary(value)
@doc """
See `is_max/2`.
"""
@spec max(any(), integer()) :: boolean()
def max(nil, _), do: true
def max(value, max), do: is_max(value, max)
@doc """
See `is_min/2`.
"""
@spec min(any(), integer()) :: boolean()
def min(nil, _), do: true
def min(value, min), do: is_min(value, min)
@doc """
## Examples
iex> Request.Validator.Rules.numeric(90)
true
iex> Request.Validator.Rules.numeric("")
false
"""
@spec numeric(any(), any()) :: boolean()
def numeric(nil, _), do: true
def numeric(value), do: numeric(value, nil)
def numeric(value, _), do: is_number(value)
@doc """
## Examples
iex> Request.Validator.Rules.required("test@mail.com")
true
iex> Request.Validator.Rules.required("")
false
"""
@spec required(any(), any()) :: boolean()
def required(nil, _), do: false
def required(value), do: required(value, nil)
def required(value, _), do: is_list(value) || is_number(value) || !is_nil(value) && String.length(value) > 0
@doc """
## Examples
iex> Request.Validator.Rules.same(120, :field, %{field: 120})
true
iex> Request.Validator.Rules.same(10, :field, %{field: 20})
false
"""
def same(value, opts, fields) when not is_list(opts),
do: same(value, [opts], fields)
def same(value, opts, fields) do
Enum.all?(opts, fn opt ->
opt_value = Map.get(fields, to_string(opt), Map.get(fields, opt))
value == opt_value
end)
end
end
end
end