validations
Validations
A validations module for Crystal.
Installation
Add this to your application's shard.yml
:
dependencies:
validations:
github: vladfaust/validations.cr
version: ~> 0.1.5
This shard follows Semantic Versioning 2.0.0, so see releases and change the version
accordingly.
Usage
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)
end
end
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)
end
validate name, size: (1..16)
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
previous_def
invalidate("name", "must not be equal to Vadim") if name == "Vadim"
end
end
user = User.new("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 ifattribute == object
gte: Comparable
- check ifattribute >= comparable
lte: Comparable
- check ifattribute <= comparable
gt: Comparable
- check ifattribute > comparable
lt: Comparable
- check ifattribute < comparable
in: Enumerable
- check ifenumerable.includes?(attribute)
size: Enumerable
- check ifenumerable.includes?(attribute.size)
size: Int
- check ifattribute.size == int
regex: Regex
- check ifregex.match(attribute)
Contributing
- Fork it (https://github.com/vladfaust/validations.cr/fork)
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
Contributors
- @vladfaust Vlad Faust - creator, maintainer