Skip to content

Commit 9477067

Browse files
committed
update README
1 parent 0db400f commit 9477067

File tree

1 file changed

+32
-112
lines changed

1 file changed

+32
-112
lines changed

README.md

Lines changed: 32 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -103,52 +103,22 @@ Since their target type is String, combining them is possible.
103103
I have prepared something called Rule Composer (`And`, `Or`, `Not`).
104104
By using Rule Composer, composite rules can be easily created.
105105

106-
### Original Rules
107-
108-
```rust
109-
struct ContainsHelloRule;
110-
111-
struct ContainsWorldRule;
112-
113-
impl Rule for ContainsHelloRule {
114-
type Item = String;
115-
116-
fn validate(target: &Self::Item) -> Result<(), Error> {
117-
if target.contains("Hello") {
118-
Ok(())
119-
} else {
120-
Err(Error::new(format!("{} does not contain `Hello`", target)))
121-
}
122-
}
123-
}
124-
125-
impl Rule for ContainsWorldRule {
126-
type Item = String;
127-
128-
fn validate(target: &Self::Item) -> Result<(), Error> {
129-
if target.contains("World") {
130-
Ok(())
131-
} else {
132-
Err(Error::new(format!("{} does not contain `World`", target)))
133-
}
134-
}
135-
}
136-
```
137-
138106
### 1: `And` Rule Composer
139107

140108
`And` Rule Composer is a rule that satisfies both of the two rules.
141109
It is generally effective when you want to narrow down the condition range.
142-
143110
```rust
144-
fn example_5() {
145-
type HelloAndWorldRule = And![ContainsHelloRule, ContainsWorldRule];
111+
type Target = Refined<And![EvenRuleU8, MinMaxRuleU8<0, 100>]>;
112+
```
113+
```rust
114+
fn and_example() -> Result<(), Error<u8>> {
115+
let target = Target::new(50)?;
116+
assert_eq!(target.into_value(), 50);
146117

147-
let rule_ok = Refined::<HelloAndWorldRule>::new("Hello! World!".to_string());
148-
assert!(rule_ok.is_ok());
118+
let target = Target::new(51);
119+
assert!(target.is_err());
149120

150-
let rule_err = Refined::<HelloAndWorldRule>::new("Hello, world!".to_string());
151-
assert!(rule_err.is_err());
121+
Ok(())
152122
}
153123
```
154124

@@ -158,17 +128,23 @@ fn example_5() {
158128
It is generally effective when you want to expand the condition range.
159129

160130
```rust
161-
fn example_6() {
162-
type HelloOrWorldRule = Or![ContainsHelloRule, ContainsWorldRule];
131+
type Target = Refined<Or![LessRuleU8<10>, GreaterRuleU8<50>]>;
132+
```
133+
```rust
134+
fn or_example() -> Result<(), Error<u8>> {
135+
let target = Target::new(5)?;
136+
assert_eq!(target.into_value(), 5);
163137

164-
let rule_ok_1 = Refined::<HelloOrWorldRule>::new("Hello! World!".to_string());
165-
assert!(rule_ok_1.is_ok());
138+
let target = Target::new(10);
139+
assert!(target.is_err());
166140

167-
let rule_ok_2 = Refined::<HelloOrWorldRule>::new("hello World!".to_string());
168-
assert!(rule_ok_2.is_ok());
141+
let target = Target::new(50);
142+
assert!(target.is_err());
169143

170-
let rule_err = Refined::<HelloOrWorldRule>::new("hello, world!".to_string());
171-
assert!(rule_err.is_err());
144+
let target = Target::new(51)?;
145+
assert_eq!(target.into_value(), 51);
146+
147+
Ok(())
172148
}
173149
```
174150

@@ -178,76 +154,20 @@ fn example_6() {
178154
It is generally effective when you want to discard only certain situations.
179155

180156
```rust
181-
fn example_7() {
182-
type NotHelloRule = Not<ContainsHelloRule>;
183-
184-
let rule_ok = Refined::<NotHelloRule>::new("hello! World!".to_string());
185-
assert!(rule_ok.is_ok());
186-
187-
let rule_err = Refined::<NotHelloRule>::new("Hello, World!".to_string());
188-
assert!(rule_err.is_err());
189-
}
157+
type Target = Refined<Not<EqualRuleU8<50>>>;
190158
```
191-
192-
### 4: Compose Rule Composer
193-
194-
Rule Composer is also a rule.
195-
Therefore, it can be treated much like a composite function
196-
197159
```rust
198-
struct StartsWithHelloRule;
160+
fn not_example() -> Result<(), Error<u8>> {
161+
let target = Target::new(49)?;
162+
assert_eq!(target.into_value(), 49);
199163

200-
struct StartsWithByeRule;
201-
202-
struct EndsWithJohnRule;
203-
204-
impl Rule for StartsWithHelloRule {
205-
type Item = String;
206-
207-
fn validate(target: &Self::Item) -> Result<(), Error> {
208-
if target.starts_with("Hello") {
209-
Ok(())
210-
} else {
211-
Err(Error::new(format!("{} does not start with `Hello`", target)))
212-
}
213-
}
214-
}
164+
let target = Target::new(50);
165+
assert!(target.is_err());
215166

216-
impl Rule for StartsWithByeRule {
217-
type Item = String;
167+
let target = Target::new(51)?;
168+
assert_eq!(target.into_value(), 51);
218169

219-
fn validate(target: &Self::Item) -> Result<(), Error> {
220-
if target.starts_with("Bye") {
221-
Ok(())
222-
} else {
223-
Err(Error::new(format!("{} does not start with `Bye`", target)))
224-
}
225-
}
226-
}
227-
228-
impl Rule for EndsWithJohnRule {
229-
type Item = String;
230-
231-
fn validate(target: &Self::Item) -> Result<(), Error> {
232-
if target.ends_with("John") {
233-
Ok(())
234-
} else {
235-
Err(Error::new(format!("{} does not end with `John`", target)))
236-
}
237-
}
238-
}
239-
240-
#[test]
241-
fn example_8() {
242-
type GreetingRule = And![
243-
Or![StartsWithHelloRule, StartsWithByeRule],
244-
EndsWithJohnRule
245-
];
246-
247-
assert!(GreetingRule::validate(&"Hello! Nice to meet you John".to_string()).is_ok());
248-
assert!(GreetingRule::validate(&"Bye! Have a good day John".to_string()).is_ok());
249-
assert!(GreetingRule::validate(&"How are you? Have a good day John".to_string()).is_err());
250-
assert!(GreetingRule::validate(&"Bye! Have a good day Tom".to_string()).is_err());
170+
Ok(())
251171
}
252172
```
253173

0 commit comments

Comments
 (0)