module Validator
Overview
∠(・.-)―〉 →◎ validator is a Crystal data validation module.
Very simple and efficient, all validations return true or false.
Also validator/check (not exposed by default) provides error message handling intended for the end user.
There are 2 main ways to use validator:
- As a simple validator to check rules (eg: email, url, min, max, presence, in, ...) which return a boolean.
 - As a more advanced validation system which will check a series of rules and returns all validation errors encountered with custom or standard messages.
 
By default the validator module expose only Validator and Valid (alias) in the scope:
require "validator"
Valid.email? "[email protected]"                        # => true
Valid.url? "https://github.com/Nicolab/crystal-validator" # => true
Valid.my_validator? "value to validate", "hello", 42      # => true
An (optional) expressive validation flavor, is available as an alternative.  
Not exposed by default, it must be imported:
require "validator/is"
is :email?, "[email protected]"                        # => true
is :url?, "https://github.com/Nicolab/crystal-validator" # => true
is :my_validator?, "value to validate", "hello", 42      # => true
# raises an error if the email is not valid
is! :email?, "contact@@example..org" # => Validator::Error
is is a macro, no overhead during the runtime 🚀
By the nature of the macros, you can't pass the validator name dynamically
with a variable like that is(validator_name, "my value to validate", arg).
But of course you can pass arguments with variables is(:validator_name?, arg1, arg2).
Check
Make a series of checks, with a customized error message for each case.
require "validator/check"
check = Check.new
check("email", "The email is required.", is :absence?, "email", user)
Custom validator
Just add your own method to register a custom validator or to overload an existing validator.
module Validator
  # My custom validator
  def self.my_validator?(value, arg : String, another_arg : Int32) : Bool
    # write here the logic of your validator...
    return true
  end
end
# Call it
puts Valid.my_validator?("value to validate", "hello", 42) # => true
# or with the `is` flavor
puts is :my_validator?, "value to validate", "hello", 42 # => true
Check is a simple and lightweight wrapper, let your imagination run wild to add your logic around it.
Using the custom validator with the validation rules:
require "validator/check"
class Article
  # Mixin
  Check.checkable
  property title : String
  property content : String
  Check.rules(
    content: {
      # Now the custom validator is available
      check: {
        my_validator: {"My validator error message"},
        between:      {"The article content must be between 10 and 20 000 characters", 10, 20_000},
        # ...
      },
    },
  )
end
# Triggered with all data
v, article = Article.check(input_data)
# Triggered with one value
v, content = Article.check_content(input_data["content"]?)
  Defined in:
lib/validator/src/validator.crlib/validator/src/validators/alpha_num.cr
lib/validator/src/validators/case_sensitive.cr
lib/validator/src/validators/comparisons.cr
lib/validator/src/validators/format.cr
lib/validator/src/validators/geo.cr
lib/validator/src/validators/presence.cr
lib/validator/src/validators/uri.cr
dynfork.cr
Class Method Summary
- 
        .color_code?(value : String) : Bool
        
          
Custom validator to validate the color code string.
 - 
        .password?(value : String) : Bool
        
          
Custom validator to validate the password string.
 - 
        .phone_number?(value : String) : Bool
        
          
Custom validator to validate the phone number string.
 
Class Method Detail
Custom validator to validate the color code string.
NOTE Examples: #fff | #f2f2f2 | #f2f2f200 | rgb(255,0,24) | rgba(255,0,24,0.5) | rgba(#fff,0.5) | hsl(120,100%,50%) | hsla(170,23%,25%,0.2) | 0x00ffff
Custom validator to validate the phone number string.