Skip to content


Folders and files

Last commit message
Last commit date

Latest commit



32 Commits

Repository files navigation


Built with Crystal Build status API Docs Releases Awesome Patrons count Gitter chat

A validations module for Crystal.


Thanks to all my patrons, I can continue working on beautiful Open Source Software! 🙏

Lauri Jutila, Alexander Maslov, Dainel Vera, Anton Yordanov

You can become a patron too in exchange of prioritized support and other perks

Become Patron


Add this to your application's shard.yml:

    github: vladfaust/
    version: ~> 0.2.0

This shard follows Semantic Versioning 2.0.0, so see releases and change the version accordingly.


This shards allows validation composition (i.e. inclusion of modules with custom validations and rules).

require "validations"

module CustomValidations
  include Validations

  rule :email do |attr, value, rule|
    invalidate(attr, "must be an email") unless /@/.match(value)

struct User
  include Validations
  include CustomValidations

  property name : String
  property email : String
  @age : UInt8?
  @nilable : String?

  def initialize(@name, @email, @age : UInt8? = nil, @nilable : String? = nil)

  validate name, size: (1..16), presence: true
  validate email, size: (6..64), email: true
  validate @age, gte: 18

  # Will not be run if `@nilable.nil?`
  validate @nilable, size: (5..10)

  # Custom validations are allowed
  def validate
    invalidate("name", "must not be equal to Vadim") if name == "Vadim"

user ="Vadim", "e-mail", 17)
user.valid? # false
pp user.invalid_attributes
# {
#   "name" => ["must have size in (1..16)", "must not be equal to Vadim"],
#   "email" => ["must have size in (6..64)", "must be an email"],
#   "@age" => ["must be greater than or equal to 18"]
# }

List of currently implemented rules

  • is: Object - check if attribute == object
  • presence: Bool - check unless attribute.nil?
  • gte: Comparable - check if attribute >= comparable
  • lte: Comparable - check if attribute <= comparable
  • gt: Comparable - check if attribute > comparable
  • lt: Comparable - check if attribute < comparable
  • in: Enumerable - check if enumerable.includes?(attribute)
  • size: Enumerable - check if enumerable.includes?(attribute.size)
  • size: Int - check if attribute.size == int
  • regex: Regex - check if regex.match(attribute)

Rules which need to be explicitly required

Some rules are not required with require "validations", you have to require them explicitly.

  • require "validations/rules/scheme" (related to URI scheme)
    • scheme: String - check if attribute.scheme == string
    • scheme: Enumerable - check if enumerable.includes?(attribute.scheme)


  1. Fork it (
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request