Current section

Files

Jump to
elx_validation lib factory bind_rules.ex
Raw

lib/factory/bind_rules.ex

defmodule ElxValidation.BindRules do
alias ElxValidation.{Accepted, Alpha, Boolean, Field, In, Internet, Max, Min, Nullable, Numbers}
alias ElxValidation.{Confirmation, DateTime, Different, Required, Storage, Uuid}
@moduledoc """
Build rules by rule name
- not use inside validator
- called automatically by validator
"""
def build(validate, value, rule_field, all_data) do
rule = String.split(validate, ":")
action = Enum.at(rule, 0)
cond do
# Rules
action == "required" -> Required.is_require?(value)
action == "required_if" -> Required.required_if(Enum.at(rule, 1), all_data, value)
action == "required_unless" -> Required.required_unless(Enum.at(rule, 1), all_data, value)
action == "required_with" -> Required.required_with(Enum.at(rule, 1), all_data, value)
action == "required_without" -> Required.required_without(Enum.at(rule, 1), all_data, value)
action == "nullable" -> Nullable.is_null?(value)
action == "string" -> Alpha.is_string(value)
action == "alpha" -> Alpha.is_alpha(value)
action == "accepted" -> Accepted.is_accepted(value)
action == "boolean" -> Boolean.validate_boolean(value)
action == "numeric" -> Numbers.validation_numeric(value)
action == "email" -> Internet.email(value)
action == "url" -> Internet.url(value)
action == "ip" -> Internet.ip(value)
action == "ipv4" -> Internet.ipv4(value)
action == "ipv6" -> Internet.ipv6(value)
action == "uuid" -> Uuid.is_uuid(value)
action == "date" -> DateTime.is_date(value)
action == "time" -> DateTime.is_time(value)
action == "datetime" -> DateTime.is_date_time(value)
action == "timezone" -> DateTime.is_timezone(value)
# Validates
action == "start_with" -> Alpha.start_with(value, Enum.at(rule, 1))
action == "end_with" -> Alpha.end_with(value, Enum.at(rule, 1))
action == "digits" -> Numbers.digits(value, Enum.at(rule, 1))
action == "max" -> Max.is_maximum(value, Enum.at(rule, 1))
action == "min" -> Min.is_minimum(value, Enum.at(rule, 1))
action == "in" -> In.is_in(value, Enum.at(rule, 1))
action == "not_in" -> In.is_not_in(value, Enum.at(rule, 1))
action == "date_equals" -> DateTime.date_equals(value, Enum.at(rule, 1))
action == "after" -> DateTime.is_after(value, Enum.at(rule, 1))
action == "after_or_equal" -> DateTime.is_after_or_equal(value, Enum.at(rule, 1))
action == "before" -> DateTime.is_before(value, Enum.at(rule, 1))
action == "before_or_equal" -> DateTime.is_before_or_equal(value, Enum.at(rule, 1))
action == "different" -> Different.is_different(value, Enum.at(rule, 1))
action == "equal" -> Different.equal(value, Enum.at(rule, 1))
action == "gt" -> Different.gt(value, Enum.at(rule, 1))
action == "gte" -> Different.gte(value, Enum.at(rule, 1))
action == "lt" -> Different.lt(value, Enum.at(rule, 1))
action == "lte" -> Different.lte(value, Enum.at(rule, 1))
# Fields
action == "confirmed" ->
confirmed_name = "#{rule_field}_confirmation"
if Field.field_exist?(confirmed_name, all_data) do
check_point = Map.fetch!(all_data, String.to_atom(confirmed_name))
Confirmation.is_confirmed(value, check_point)
else
false
end
action == "nullable" -> Nullable.is_null?(value)
# File
action == "file" -> Storage.is_file(value)
action == "mimes" -> Storage.mimes(value, Enum.at(rule, 1))
action == "mime_types" -> Storage.mime_types(value, Enum.at(rule, 1))
action == "max_size" -> Storage.max_size(value, Enum.at(rule, 1))
action == "min_size" -> Storage.min_size(value, Enum.at(rule, 1))
true -> false
end
end
end