1use super::Rule;
2
3#[cfg(doc)]
4use super::{All, Opt};
5
6pub struct And<T, U>(pub T, pub U);
25
26impl<T, U, F> Rule<F> for And<T, U>
27where
28 T: Rule<F>,
29 U: Rule<F>,
30{
31 fn check(&self, value: &F) -> Result<(), String> {
32 self.0.check(value)?;
33 self.1.check(value)
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use crate::prelude::*;
40 use claim::assert_ok;
41
42 const RULE: Opt<And<MaxLength, RegEx>> = Opt(And(MaxLength(20), RegEx(r"^\S+@\S+\.\S+")));
43
44 #[test]
45 fn and_ok() {
46 assert_ok!(RULE.check(&Some("example@example.fr")));
47 }
48
49 #[test]
50 fn and_0_err() {
51 let val = Some("too.long.example@too.long.example.fr");
52
53 let res_error_message = RULE.check(&val).expect_err("Should be an Err");
54
55 assert_eq!(res_error_message, "Value is too long")
56 }
57
58 #[test]
59 fn and_1_err() {
60 let val = Some("example.example.fr");
61
62 let res_error_message = RULE.check(&val).expect_err("Should be an Err");
63
64 assert_eq!(res_error_message, "The regex does not match")
65 }
66
67 #[test]
68 fn and_0_1_err() {
69 let val = Some("too.long.example.too.long.example.fr");
70
71 let res_error_message = RULE.check(&val).expect_err("Should be an Err");
72
73 assert_eq!(res_error_message, "Value is too long")
74 }
75}