Skip to content

Commit 4b3ce06

Browse files
committed
feat: be able to use an Exception (optional)
1 parent 2228d77 commit 4b3ce06

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

spec/check/check_validation_spec.cr

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,39 @@ describe "Check" do
1212
Check::Errors.new.is_a?(Hash).should be_true
1313
end
1414

15+
describe "ValidationError" do
16+
it "should create Exception taking Errors container" do
17+
v = Check.new_validation
18+
v.add_error "my_field", "Oops"
19+
20+
ex = Check::ValidationError.new v.errors
21+
ex.should be_a Check::ValidationError
22+
ex.should be_a Exception
23+
ex.errors.should be_a Check::Errors
24+
ex.errors.size.should eq 1
25+
ex.errors["my_field"].should eq ["Oops"]
26+
ex.message.should eq "Validation error"
27+
end
28+
29+
it "should support custom message, pluralize it if ends with error" do
30+
v = Check.new_validation
31+
v.add_error "my_field", "Oops"
32+
33+
ex = Check::ValidationError.new v.errors
34+
ex.errors.size.should eq 1
35+
ex.message.should eq "Validation error"
36+
37+
v.add_error "my_field2", "Oops"
38+
ex = Check::ValidationError.new v.errors
39+
ex.errors.size.should eq 2
40+
ex.message.should eq "Validation errors"
41+
42+
ex = Check::ValidationError.new v.errors, "Bad validation"
43+
ex.errors.size.should eq 2
44+
ex.message.should eq "Bad validation"
45+
end
46+
end
47+
1548
it "#new_validation" do
1649
v = Check.new_validation
1750
v.class.should eq Check::Validation
@@ -99,6 +132,18 @@ describe "Check" do
99132
v.valid?.should be_false
100133
end
101134

135+
it "#to_exception" do
136+
v = Check.new_validation
137+
v.add_error "my_field", "Oops"
138+
139+
ex = v.to_exception
140+
ex.should be_a Check::ValidationError
141+
ex.should be_a Exception
142+
ex.errors.should be_a Check::Errors
143+
ex.errors.size.should eq 1
144+
ex.errors["my_field"].should eq ["Oops"]
145+
end
146+
102147
it "#check with string and symbol keys" do
103148
v = Check.new_validation
104149

src/check.cr

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@ module Check
1818
# ```
1919
alias Errors = Hash(Symbol | String, Array(String))
2020

21+
# Validation error.
22+
# To carry `Errors` into an `Exception`.
23+
class ValidationError < Exception
24+
def initialize(@errors : Errors, @message = "Validation error")
25+
@message = "#{@message}s" if @errors.size > 1 && @message.as(String).ends_with?("error")
26+
end
27+
28+
# Returns `Errors` container (`Hash`).
29+
def errors : Errors
30+
@errors
31+
end
32+
end
33+
2134
# Combines a series of checks into one validation instance,
2235
# with a customized error message for each case.
2336
#
@@ -318,6 +331,11 @@ module Check
318331
add_error(key, "") unless valid
319332
self
320333
end
334+
335+
# Creates a new instance of `ValidationError` (`Exception`).
336+
def to_exception
337+
ValidationError.new @errors
338+
end
321339
end
322340

323341
# Initializes a new `Validation` instance to combine

0 commit comments

Comments
 (0)