Skip to content

Commit c1964f3

Browse files
committed
add even odd
1 parent de09718 commit c1964f3

File tree

5 files changed

+98
-0
lines changed

5 files changed

+98
-0
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ edition = "2021"
1212
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1313

1414
[dependencies]
15+
paste = "1.0.14"
1516
regex = "1.10.3"
1617
serde = { version = "1.0.197", features = ["derive"] }
1718

src/rule.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
pub mod composer;
22
mod empty;
33
mod non_empty;
4+
mod number;
45
mod string;
56

67
use crate::result::Error;
78
pub use empty::*;
89
pub use non_empty::*;
10+
pub use number::*;
911
pub use string::*;
1012

1113
/// This is a `trait` that specifies the conditions a type `T` should satisfy

src/rule/number.rs

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
mod even;
2+
mod odd;
3+
4+
pub use even::*;
5+
pub use odd::*;

src/rule/number/even.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
macro_rules! even_rule {
2+
($t: ty) => {
3+
paste::item! {
4+
pub type [<Even $t:upper>] = $crate::Refined<[<EvenRule $t:upper>]>;
5+
pub struct [<EvenRule $t:upper>];
6+
7+
impl $crate::rule::Rule for [<EvenRule $t:upper>] {
8+
type Item = $t;
9+
10+
fn validate(target: Self::Item) -> Result<Self::Item, $crate::result::Error<Self::Item>> {
11+
if target % 2 == 0 {
12+
Ok(target)
13+
} else {
14+
Err($crate::result::Error::new(format!("{} is not even number", target), target))
15+
}
16+
}
17+
}
18+
}
19+
};
20+
($t: ty, $($ts: ty),+) => {
21+
even_rule! {$t}
22+
even_rule! {$($ts), +}
23+
};
24+
}
25+
26+
even_rule!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
27+
28+
#[cfg(test)]
29+
mod test {
30+
use crate::rule::EvenU8;
31+
32+
#[test]
33+
fn test_even_u8_ok() {
34+
let n = 8;
35+
let even_result = EvenU8::new(n);
36+
assert!(even_result.is_ok())
37+
}
38+
39+
#[test]
40+
fn test_even_u8_err() {
41+
let n = 7;
42+
let even_result = EvenU8::new(n);
43+
assert!(even_result.is_err())
44+
}
45+
}

src/rule/number/odd.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
macro_rules! odd_rule {
2+
($t: ty) => {
3+
paste::item! {
4+
pub type [<Odd $t:upper>] = $crate::Refined<[<OddRule $t:upper>]>;
5+
pub struct [<OddRule $t:upper>];
6+
7+
impl $crate::rule::Rule for [<OddRule $t:upper>] {
8+
type Item = $t;
9+
10+
fn validate(target: Self::Item) -> Result<Self::Item, $crate::result::Error<Self::Item>> {
11+
if target % 2 == 1 {
12+
Ok(target)
13+
} else {
14+
Err($crate::result::Error::new(format!("{} is not odd number", target), target))
15+
}
16+
}
17+
}
18+
}
19+
};
20+
($t: ty, $($ts: ty),+) => {
21+
odd_rule! {$t}
22+
odd_rule! {$($ts), +}
23+
};
24+
}
25+
26+
odd_rule!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
27+
28+
#[cfg(test)]
29+
mod test {
30+
use crate::rule::OddU8;
31+
32+
#[test]
33+
fn test_odd_u8_ok() {
34+
let n = 7;
35+
let even_result = OddU8::new(n);
36+
assert!(even_result.is_ok())
37+
}
38+
39+
#[test]
40+
fn test_odd_u8_err() {
41+
let n = 8;
42+
let even_result = OddU8::new(n);
43+
assert!(even_result.is_err())
44+
}
45+
}

0 commit comments

Comments
 (0)