Request.Validator.Rules (RequestValidator v1.0.2)

Copy Markdown View Source

Summary

Types

result()

@type result() :: :ok | {:error, String.t()}

rule()

@type rule() ::
  validator() | %{:validator => validator(), optional(:implicit?) => boolean()}

validator()

@type validator() :: (... -> result())

Functions

active_url()

@spec active_url() :: rule()

Examples

iex> import Request.Validator.Rules, only: [active_url: 0]
iex> fun = active_url()
iex> fun.("url", "https://google.com")
:ok
iex> fun.("url", "invalid_url")
{:error, "The url field must be a valid URL."}
iex> fun.("url", "https://dummy.test")
{:error, "The url field must be a valid URL."}

allowed(options)

@spec allowed([term()] | term()) :: rule()

Examples

iex> import Request.Validator.Rules, only: [allowed: 1]
iex> fun = allowed(["male", "female"])
iex> fun.("gender", "male")
:ok
iex> fun.("gender", "female")
:ok
iex> fun.("gender", "child")
{:error, "The selected gender is invalid."}
iex> fun.("gender", "goat")
{:error, "The selected gender is invalid."}
iex> allowed("track").("sport", "track")
:ok

alpha()

@spec alpha() :: rule()

Examples

iex> import Request.Validator.Rules, only: [alpha: 0]
iex> fun = alpha()
iex> fun.("uid", "abcde")
:ok
iex> fun.("uid", 1)
{:error, "The uid field must only contain letters."}
iex> fun.("uid", nil)
{:error, "The uid field must only contain letters."}
iex> fun.("uid", %{})
{:error, "The uid field must only contain letters."}
iex> fun.("uid", [])
{:error, "The uid field must only contain letters."}

alpha_dash()

@spec alpha_dash() :: rule()

Examples

iex> import Request.Validator.Rules, only: [alpha_dash: 0]
iex> fun = alpha_dash()
iex> fun.("username", "abcde2")
:ok
iex> fun.("username", "ab_d-2")
:ok
iex> fun.("username", 1)
{:error, "The username field must only contain letters, numbers, dashes, and underscores."}
iex> fun.("username", nil)
{:error, "The username field must only contain letters, numbers, dashes, and underscores."}
iex> fun.("username", %{})
{:error, "The username field must only contain letters, numbers, dashes, and underscores."}
iex> fun.("username", [])
{:error, "The username field must only contain letters, numbers, dashes, and underscores."}

alpha_num()

@spec alpha_num() :: rule()

Examples

iex> import Request.Validator.Rules, only: [alpha_num: 0]
iex> fun = alpha_num()
iex> fun.("ref", "1ab2de3")
:ok
iex> fun.("ref", 1)
{:error, "The ref field must only contain letters and numbers."}
iex> fun.("ref", "abc_de2")
{:error, "The ref field must only contain letters and numbers."}
iex> fun.("ref", nil)
{:error, "The ref field must only contain letters and numbers."}
iex> fun.("ref", %{})
{:error, "The ref field must only contain letters and numbers."}
iex> fun.("ref", [])
{:error, "The ref field must only contain letters and numbers."}

boolean()

@spec boolean() :: rule()

Examples

iex> import Request.Validator.Rules, only: [boolean: 0]
iex> fun = boolean()
iex> fun.("notify_me", true)
:ok
iex> fun.("notify_me", 2)
{:error, "The notify_me field must be true or false."}

confirmed(confirmation \\ nil)

@spec confirmed(nil | String.t()) :: rule()

Examples

iex> alias Request.Validator.Fields
iex> import Request.Validator.Rules, only: [confirmed: 0, confirmed: 1]
iex> fields = Fields.new(%{
...>   "password" => 12345678,
...>   "password_confirmation" => 12345678,
...>   "list" => [%{"a" => 1, "a_confirmation" => 1}]
...> })
iex> fun = confirmed()
iex> fun.("password", 12345678, fields)
:ok
iex> fun.("list.0.a", 1, fields)
:ok
iex> fun.("password", "yikes!", fields)
{:error, "The password field confirmation does not match."}
iex> fun.("list.0.a", 10, fields)
{:error, "The list.0.a field confirmation does not match."}

decimal(min \\ nil)

@spec decimal(nil | pos_integer()) :: rule()

Examples

iex> import Request.Validator.Rules, only: [decimal: 0, decimal: 1, decimal: 2]
iex> fun = decimal()
iex> fun.("amount", 2.0)
:ok
iex> fun.("amount", Decimal.new("9.999"))
:ok
iex> fun.("amount", 1)
:ok
iex> fun.("amount", "abcde2")
{:error, "The amount field must be a decimal."}
iex> fun.("amount", nil)
{:error, "The amount field must be a decimal."}
iex> fun.("amount", %{})
{:error, "The amount field must be a decimal."}
iex> fun.("amount", [])
{:error, "The amount field must be a decimal."}
iex> fun = decimal(2)
iex> fun.("amount", 1.36)
:ok
iex> fun.("amount", 1.366484)
{:error, "The amount field must have 2 decimal places."}
iex> fun = decimal(2, 5)
iex> fun.("amount", 1.36)
:ok
iex> fun.("amount", 1.366484)
{:error, "The amount field must have between 2 and 5 decimal places."}

decimal(min, max)

@spec decimal(nil | pos_integer(), nil | pos_integer()) :: rule()

email(validations \\ [])

@spec email([:format | :mx | String.t()] | String.t()) :: rule()

Examples

iex> import Request.Validator.Rules, only: [email: 0, email: 1]
iex> fun = email()
iex> fun.("email", "test@gmail.com")
:ok
iex> fun = email([:format])
iex> fun.("email", "a@b.com")
:ok
iex> fun = email(["mx"])
iex> fun.("email", "a@b.com")
{:error, "The email field must be a valid email address."}
iex> fun.("email", 2.0)
{:error, "The email field must be a valid email address."}
iex> fun.("email", nil)
{:error, "The email field must be a valid email address."}
iex> fun.("email", %{})
{:error, "The email field must be a valid email address."}
iex> fun.("email", [])
{:error, "The email field must be a valid email address."}

gettext(msgid, opts)

(macro)

gt(bound)

@spec gt(String.t() | number()) :: rule()

Examples

iex> alias Request.Validator.Fields
iex> import Request.Validator.Rules, only: [gt: 1]
iex> fields = Fields.new(%{
...>   "age" => 30,
...>   "items" => [0, 1],
...>   "passphrase" => "tango"
...> })
iex> fun = gt("age")
iex> fun.("mother_age", 25, fields)
{:error, "The mother_age field must be greater than 30."}
iex> fun.("mother_age", 45, fields)
:ok
iex> fun = gt(30)
iex> fun.("mother_age", 20, fields)
{:error, "The mother_age field must be greater than 30."}
iex> fun.("mother_age", "20", fields)
{:error, "The mother_age field must be greater than 30 characters."}
iex> fun.("mother_age", 50, fields)
:ok
iex> fun = gt("passphrase")
iex> fun.("passphrase_hash", "milk", fields)
{:error, "The passphrase_hash field must be greater than 5 characters."}
iex> fun.("passphrase_hash", "aHsychxUY", fields)
:ok
iex> fun = gt("items")
iex> fun.("sub_items", [2, 3, 4], fields)
:ok
iex> fun.("sub_items", [1], fields)
{:error, "The sub_items field must have more than 2 items."}
iex> fun.("sub_items", "milk", fields)
{:error, "The sub_items field must be greater than 2 characters."}

gte(bound)

@spec gte(String.t() | number()) :: rule()

Examples

iex> alias Request.Validator.Fields
iex> import Request.Validator.Rules, only: [gte: 1]
iex> fields = Fields.new(%{
...>   "age" => 30,
...>   "items" => [0, 1],
...>   "passphrase" => "tango"
...> })
iex> fun = gte("age")
iex> fun.("mother_age", 25, fields)
{:error, "The mother_age field must be greater than or equal to 30."}
iex> fun.("mother_age", 45, fields)
:ok
iex> fun = gte(30)
iex> fun.("mother_age", 20, fields)
{:error, "The mother_age field must be greater than or equal to 30."}
iex> fun.("mother_age", "20", fields)
{:error, "The mother_age field must be greater than or equal to 30 characters."}
iex> fun.("mother_age", 50, fields)
:ok
iex> fun = gte("passphrase")
iex> fun.("passphrase_hash", "milk", fields)
{:error, "The passphrase_hash field must be greater than or equal to 5 characters."}
iex> fun.("passphrase_hash", "aHsychxUY", fields)
:ok
iex> fun = gte("items")
iex> fun.("sub_items", [2, 3], fields)
:ok
iex> fun.("sub_items", [1], fields)
{:error, "The sub_items field must have 2 items or more."}
iex> fun.("sub_items", "milk", fields)
{:error, "The sub_items field must be greater than or equal to 2 characters."}

integer()

@spec integer() :: rule()

Examples

iex> import Request.Validator.Rules, only: [integer: 0]
iex> fun = integer()
iex> fun.("age", 1)
:ok
iex> fun.("age", 2.0)
{:error, "The age field must be an integer."}
iex> fun.("age", "abcde2")
{:error, "The age field must be an integer."}
iex> fun.("age", nil)
{:error, "The age field must be an integer."}
iex> fun.("age", %{})
{:error, "The age field must be an integer."}
iex> fun.("age", [])
{:error, "The age field must be an integer."}

list()

@spec list() :: rule()

Examples

iex> import Request.Validator.Rules, only: [list: 0]
iex> fun = list()
iex> fun.("emails", 4)
{:error, "The emails field must be a list."}
iex> fun.("emails", ["a@b.com"])
:ok

lt(bound)

@spec lt(String.t() | number()) :: rule()

Examples

iex> alias Request.Validator.Fields
iex> import Request.Validator.Rules, only: [lt: 1]
iex> fields = Fields.new(%{
...>   "mother_age" => 30,
...>   "items" => [0, 1],
...>   "essay" => "lorem ipsum"
...> })
iex> fun = lt("mother_age")
iex> fun.("child_age", 30, fields)
{:error, "The child_age field must be less than 30."}
iex> fun.("child_age", 18, fields)
:ok
iex> fun = lt(30)
iex> fun.("child_age", 50, fields)
{:error, "The child_age field must be less than 30."}
iex> fun.("child_age", "20", fields)
{:error, "The child_age field must be less than 30 characters."}
iex> fun.("child_age", 20, fields)
:ok
iex> fun = lt("essay")
iex> fun.("comment", "lorem ipsum dolor sit amet", fields)
{:error, "The comment field must be less than 11 characters."}
iex> fun.("comment", "lorem", fields)
:ok
iex> fun = lt("items")
iex> fun.("sub_items", [], fields)
:ok
iex> fun.("sub_items", [2, 3, 4], fields)
{:error, "The sub_items field must have less than 2 items."}
iex> fun.("sub_items", "milk", fields)
{:error, "The sub_items field must be less than 2 characters."}

lte(bound)

@spec lte(String.t() | number()) :: rule()

Examples

iex> alias Request.Validator.Fields
iex> import Request.Validator.Rules, only: [lte: 1]
iex> fields = Fields.new(%{
...>   "mother_age" => 30,
...>   "items" => [0, 1],
...>   "essay" => "lorem ipsum"
...> })
iex> fun = lte("mother_age")
iex> fun.("child_age", 31, fields)
{:error, "The child_age field must be less than or equal to 30."}
iex> fun.("child_age", 18, fields)
:ok
iex> fun = lte(30)
iex> fun.("child_age", 50, fields)
{:error, "The child_age field must be less than or equal to 30."}
iex> fun.("child_age", "20", fields)
{:error, "The child_age field must be less than or equal to 30 characters."}
iex> fun.("child_age", 20, fields)
:ok
iex> fun = lte("essay")
iex> fun.("comment", "lorem ipsum dolor sit amet", fields)
{:error, "The comment field must be less than or equal to 11 characters."}
iex> fun.("comment", "lorem", fields)
:ok
iex> fun = lte("items")
iex> fun.("sub_items", [6, 7], fields)
:ok
iex> fun.("sub_items", [2, 3, 4], fields)
{:error, "The sub_items field must not have more than 2 items."}
iex> fun.("sub_items", "milk", fields)
{:error, "The sub_items field must be less than or equal to 2 characters."}

map(keys \\ [])

@spec map([String.t()]) :: rule()

Examples

iex> import Request.Validator.Rules, only: [map: 0, map: 1]
iex> fun = map()
iex> metadata = %{"a" => "b", "c" => "d"}
iex> fun.("metadata", 4)
{:error, "The metadata field must be a map."}
iex> fun.("metadata", metadata)
:ok
iex> fun = map(["a", "c"])
iex> fun.("metadata", metadata)
:ok
iex> fun.("metadata", Map.put(metadata, "e", "f"))
{:error, "The metadata field must be a map."}

max(bound)

@spec max(number()) :: rule()

Examples

iex> import Request.Validator.Rules, only: [max: 1]
iex> fun = max(30)
iex> fun.("age", 20)
:ok
iex> fun.("age", 30)
:ok
iex> fun.("age", 40)
{:error, "The age field must not be greater than 30."}
iex> fun = max(6)
iex> fun.("otp", "1611675")
{:error, "The otp field must not be greater than 6 characters."}
iex> fun.("otp", "955764")
:ok
iex> fun = max(2)
iex> fun.("tags", [1, 2, 3])
{:error, "The tags field must not be greater than 2 items."}
iex> fun.("tags", [1, 3])
:ok

min(bound)

@spec min(number()) :: rule()

Examples

iex> import Request.Validator.Rules, only: [min: 1]
iex> fun = min(30)
iex> fun.("age", 40)
:ok
iex> fun.("age", 10)
{:error, "The age field must be at least 30."}
iex> fun = min(6)
iex> fun.("password", "pass")
{:error, "The password field must be at least 6 characters."}
iex> fun.("password", "password")
:ok
iex> fun = min(1)
iex> fun.("tags", [])
{:error, "The tags field must be at least 1 items."}
iex> fun.("tags", [1, 3])
:ok

numeric()

@spec numeric() :: rule()

Examples

iex> import Request.Validator.Rules, only: [numeric: 0]
iex> fun = numeric()
iex> fun.("width", 2.0)
:ok
iex> fun.("width", 1)
:ok
iex> fun.("width", "abcde2")
{:error, "The width field must be a number."}
iex> fun.("width", nil)
{:error, "The width field must be a number."}
iex> fun.("width", %{})
{:error, "The width field must be a number."}
iex> fun.("width", [])
{:error, "The width field must be a number."}

required()

@spec required() :: rule()

Examples

iex> import Request.Validator.Rules, only: [required: 0]
iex> %{validator: fun} = required()
iex> fun.("name", "")
{:error, "The name field is required."}
iex> fun.("gender", nil)
{:error, "The gender field is required."}
iex> fun.("coordinates", [])
{:error, "The coordinates field is required."}
iex> fun.("metadata", %{})
{:error, "The metadata field is required."}
iex> fun.("message", "hello world")
:ok
iex> fun.("products", [1, 2])
:ok
iex> fun.("metadata", %{"hello" => "world"})
:ok

required_if(condition)

@spec required_if((... -> boolean()) | boolean() | [term()]) :: rule()

Examples

iex> alias Request.Validator.Fields
iex> import Request.Validator.Rules, only: [required_if: 1]
iex> fields = Fields.new(%{})
iex> %{validator: fun} = required_if(true)
iex> fun.("description", "", fields)
{:error, "The description field is required."}
iex> fun.("age", nil, fields)
{:error, "The age field is required."}
iex> %{validator: fun} = required_if(fn -> false end)
iex> fun.("key", "", fields)
:ok
iex> fun.("state", nil, fields)
:ok
iex> %{validator: fun} = required_if(["passenger", "kid"])
iex> data = Fields.new(%{"passenger" => "kid"})
iex> fun.("parent", nil, data)
{:error, "The parent field is required when passenger is kid."}

required_if(other, value, op)

@spec required_if(term(), term(), (term(), term() -> boolean())) :: term()

size(bound)

@spec size(non_neg_integer()) :: rule()

Examples

iex> import Request.Validator.Rules, only: [size: 1]
iex> fun = size(5)
iex> fun.("age", 10)
{:error, "The age field must be 5."}
iex> fun.("age", 5)
:ok
iex> fun.("username", "chic")
{:error, "The username field must be 5 characters."}
iex> fun.("username", "chick")
:ok
iex> fun.("tags", ["chic"])
{:error, "The tags field must contain 5 items."}
iex> fun.("tags", Enum.to_list(1..5))
:ok

string()

@spec string() :: rule()

Examples

iex> import Request.Validator.Rules, only: [string: 0]
iex> fun = string()
iex> fun.("content", "")
:ok
iex> fun.("content", 1)
{:error, "The content field must be a string."}
iex> fun.("content", nil)
{:error, "The content field must be a string."}
iex> fun.("content", %{})
{:error, "The content field must be a string."}
iex> fun.("content", [])
{:error, "The content field must be a string."}

url()

@spec url() :: rule()

Examples

iex> import Request.Validator.Rules, only: [url: 0]
iex> fun = url()
iex> fun.("url", "https://google.com")
:ok
iex> fun.("url", "invalid_url")
{:error, "The url field must be a valid URL."}