Skip to content

Commit b364f14

Browse files
committed
fix not error message
1 parent 16979d0 commit b364f14

File tree

8 files changed

+50
-17
lines changed

8 files changed

+50
-17
lines changed

src/rule/composer/and.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use std::marker::PhantomData;
2-
1+
use crate::result::Error;
32
use crate::rule::Rule;
3+
use std::marker::PhantomData;
44

55
/// A macro to generate a `Rule` that combines multiple rules
66
/// # Example
@@ -67,15 +67,33 @@ where
6767
type Item = T;
6868

6969
fn validate(target: Self::Item) -> crate::Result<T> {
70-
let bounded_rule = |t: T| RULE1::validate(t).and_then(RULE2::validate);
71-
bounded_rule(target)
70+
match RULE1::validate(target) {
71+
Ok(value) => RULE2::validate(value),
72+
Err(err) => {
73+
let rule1_error_message = err.to_string();
74+
let rule1_type_name = std::any::type_name::<RULE1>();
75+
match RULE2::validate(err.into_value()) {
76+
Ok(value) => {
77+
let message = format!("{rule1_error_message} ({rule1_type_name})");
78+
Err(Error::new(value, message))
79+
}
80+
Err(err) => {
81+
let rule2_type_name = std::any::type_name::<RULE2>();
82+
let message = format!(
83+
"{rule1_error_message} ({rule1_type_name}) & {err} ({rule2_type_name})",
84+
);
85+
Err(Error::new(err.into_value(), message))
86+
}
87+
}
88+
}
89+
}
7290
}
7391
}
7492

7593
#[cfg(test)]
7694
mod test {
7795
use crate::rule::composer::And;
78-
use crate::rule::{AlphabetRule, EmailRule, NonEmptyStringRule, Rule};
96+
use crate::rule::{AlphabetRule, EmailRule, EvenRuleU8, LessRuleU8, NonEmptyStringRule, Rule};
7997

8098
type NonEmptyAlphabetString = And<NonEmptyStringRule, AlphabetRule<String>>;
8199

@@ -86,7 +104,8 @@ mod test {
86104

87105
#[test]
88106
fn test_rule_binder_err() {
89-
assert!(NonEmptyAlphabetString::validate("Hello1".to_string()).is_err());
107+
type Target = And![EvenRuleU8, LessRuleU8<10>];
108+
assert_eq!(Target::validate(11).unwrap_err().to_string(), "the value must be even, but received 11 (refined_type::rule::number::even::EvenRuleU8) & the value must be less than 10, but received 11 (refined_type::rule::number::less::LessRuleU8<10>)");
90109
}
91110

92111
#[test]

src/rule/composer/or.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use std::marker::PhantomData;
2-
1+
use crate::result::Error;
32
use crate::rule::Rule;
3+
use std::marker::PhantomData;
44

55
/// A macro to generate a `Rule` that combines multiple rules
66
/// # Example
@@ -50,7 +50,21 @@ where
5050
fn validate(target: Self::Item) -> crate::Result<T> {
5151
let bounded_rule = |t: T| match RULE1::validate(t) {
5252
Ok(value) => Ok(value),
53-
Err(err) => RULE2::validate(err.into_value()),
53+
Err(err) => {
54+
let rule1_error_message = err.to_string();
55+
match RULE2::validate(err.into_value()) {
56+
Ok(value) => Ok(value),
57+
Err(err) => {
58+
let rule1_type_name = std::any::type_name::<RULE1>();
59+
let rule2_type_name = std::any::type_name::<RULE2>();
60+
let rule2_error_message = err.to_string();
61+
Err(Error::new(
62+
err.into_value(),
63+
format!("{rule1_error_message} ({rule1_type_name}) | {rule2_error_message} ({rule2_type_name})"),
64+
))
65+
}
66+
}
67+
}
5468
};
5569
bounded_rule(target)
5670
}

src/rule/number/equal.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ macro_rules! define_equal_rule {
1313
if target == EQUAL {
1414
Ok(target)
1515
} else {
16-
Err($crate::result::Error::new(target, format!("{} does not equal {}", target, EQUAL)))
16+
Err($crate::result::Error::new(target, format!("the value must be equal to {EQUAL}, but received {target}")))
1717
}
1818
}
1919
}

src/rule/number/even.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ macro_rules! even_rule {
1717
if target % 2 == 0 {
1818
Ok(target)
1919
} else {
20-
Err($crate::result::Error::new(target, format!("{} is not even number", target)))
20+
Err($crate::result::Error::new(target, format!("the value must be even, but received {target}")))
2121
}
2222
}
2323
}

src/rule/number/greater.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ macro_rules! define_greater_rule {
1515
if target > THAN {
1616
Ok(target)
1717
} else {
18-
Err($crate::result::Error::new(target, format!("{} is not greater than {}", target, THAN)))
18+
Err($crate::result::Error::new(target, format!("the value must be greater than {THAN}, but received {target}")))
1919
}
2020
}
2121
}

src/rule/number/less.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ macro_rules! define_less_rule {
1515
if target < THAN {
1616
Ok(target)
1717
} else {
18-
Err($crate::result::Error::new(target, format!("{} is not less than {}", target, THAN)))
18+
Err($crate::result::Error::new(target, format!("the value must be less than {THAN}, but received {target}")))
1919
}
2020
}
2121
}

src/rule/number/min_max.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ macro_rules! define_min_max_rule {
55
pub type [<MinMax $t:camel>]<const MIN: $t, const MAX: $t> = $crate::Refined<[<MinMaxRule $t:camel>]<MIN, MAX>>;
66

77
/// Rule where the target value must be greater than or equal to `MIN` and less than or equal to `MAX`
8-
pub type [<MinMaxRule $t:camel>]<const MIN: $t, const MAX: $t> = $crate::Or![
9-
$crate::rule::[<RangeRule $t:camel>]<MIN, MAX>,
10-
$crate::rule::[<EqualRule $t:camel>]<MAX>
8+
pub type [<MinMaxRule $t:camel>]<const MIN: $t, const MAX: $t> = $crate::And![
9+
$crate::rule::[<GreaterEqualRule $t:camel>]<MIN>,
10+
$crate::rule::[<LessEqualRule $t:camel>]<MAX>
1111
];
1212
}
1313
};

src/rule/number/odd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ macro_rules! odd_rule {
1515
if target % 2 == 1 {
1616
Ok(target)
1717
} else {
18-
Err($crate::result::Error::new(target, format!("{} is not odd number", target)))
18+
Err($crate::result::Error::new(target, format!("the value must be odd, but received {target}")))
1919
}
2020
}
2121
}

0 commit comments

Comments
 (0)