Skip to content

Commit 75ba143

Browse files
committed
implement equal
1 parent 9190c4f commit 75ba143

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

src/rule/length.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub use length_definition::*;
22

3+
mod equal;
34
mod length_definition;
45
mod less;

src/rule/length/equal.rs

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#[macro_export]
2+
macro_rules! length_equal_rule {
3+
($length:literal) => {
4+
paste::item! {
5+
#[allow(dead_code)]
6+
pub type [<LengthEqual $length>]<ITEM> = $crate::Refined<[<LengthEqualRule $length>]<ITEM>>;
7+
8+
#[allow(dead_code)]
9+
pub struct [<LengthEqualRule $length>]<ITEM> {
10+
_phantom: ::std::marker::PhantomData<ITEM>,
11+
}
12+
13+
impl<ITEM> $crate::rule::Rule for [<LengthEqualRule $length>]<ITEM> where ITEM: $crate::rule::LengthDefinition {
14+
type Item = ITEM;
15+
fn validate(target: &Self::Item) -> Result<(), $crate::result::Error> {
16+
if target.length() == $length {
17+
Ok(())
18+
} else {
19+
Err(Error::new(format!("target length is not equal to {}", $length)))
20+
}
21+
}
22+
}
23+
}
24+
};
25+
($length:literal, $($lengths:literal),+) => {
26+
length_equal_rule!($length);
27+
length_equal_rule!($($lengths),+);
28+
};
29+
}
30+
31+
#[cfg(test)]
32+
mod tests {
33+
use crate::result::Error;
34+
35+
length_equal_rule!(5, 10);
36+
37+
#[test]
38+
fn test_length_equal_5() -> Result<(), Error> {
39+
let target = "12345";
40+
let refined = LengthEqual5::new(target)?;
41+
assert_eq!(refined.into_value(), "12345");
42+
Ok(())
43+
}
44+
45+
#[test]
46+
fn test_length_equal_5_fail() {
47+
let target = "1234";
48+
let refined = LengthEqual5::new(target);
49+
assert!(refined.is_err());
50+
}
51+
52+
#[test]
53+
fn test_length_equal_10() -> Result<(), Error> {
54+
let target = "1234567890";
55+
let refined = LengthEqual10::new(target)?;
56+
assert_eq!(refined.into_value(), "1234567890");
57+
Ok(())
58+
}
59+
60+
#[test]
61+
fn test_length_equal_10_fail() {
62+
let target = "123456789";
63+
let refined = LengthEqual10::new(target);
64+
assert!(refined.is_err());
65+
}
66+
}

0 commit comments

Comments
 (0)