@@ -103,52 +103,22 @@ Since their target type is String, combining them is possible.
103103I have prepared something called Rule Composer (` And ` , ` Or ` , ` Not ` ).
104104By 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.
141109It 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() {
158128It 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() {
178154It 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