@@ -11,8 +11,8 @@ impl FileFilter {
11
11
/// command-line arguments.
12
12
pub fn deduce ( matches : & MatchedFlags ) -> Result < FileFilter , Misfire > {
13
13
Ok ( FileFilter {
14
- list_dirs_first : matches. has ( & flags:: DIRS_FIRST ) ,
15
- reverse : matches. has ( & flags:: REVERSE ) ,
14
+ list_dirs_first : matches. has ( & flags:: DIRS_FIRST ) ? ,
15
+ reverse : matches. has ( & flags:: REVERSE ) ? ,
16
16
sort_field : SortField :: deduce ( matches) ?,
17
17
dot_filter : DotFilter :: deduce ( matches) ?,
18
18
ignore_patterns : IgnorePatterns :: deduce ( matches) ?,
@@ -38,7 +38,7 @@ impl SortField {
38
38
/// argument. This will return `Err` if the option is there, but does not
39
39
/// correspond to a valid field.
40
40
fn deduce ( matches : & MatchedFlags ) -> Result < SortField , Misfire > {
41
- let word = match matches. get ( & flags:: SORT ) {
41
+ let word = match matches. get ( & flags:: SORT ) ? {
42
42
Some ( w) => w,
43
43
None => return Ok ( SortField :: default ( ) ) ,
44
44
} ;
@@ -85,11 +85,22 @@ impl SortField {
85
85
86
86
impl DotFilter {
87
87
pub fn deduce ( matches : & MatchedFlags ) -> Result < DotFilter , Misfire > {
88
- match matches. count ( & flags:: ALL ) {
89
- 0 => Ok ( DotFilter :: JustFiles ) ,
90
- 1 => Ok ( DotFilter :: Dotfiles ) ,
91
- _ => if matches. has ( & flags:: TREE ) { Err ( Misfire :: TreeAllAll ) }
92
- else { Ok ( DotFilter :: DotfilesAndDots ) }
88
+ let count = matches. count ( & flags:: ALL ) ;
89
+
90
+ if count == 0 {
91
+ Ok ( DotFilter :: JustFiles )
92
+ }
93
+ else if count == 1 {
94
+ Ok ( DotFilter :: Dotfiles )
95
+ }
96
+ else if matches. count ( & flags:: TREE ) > 0 {
97
+ Err ( Misfire :: TreeAllAll )
98
+ }
99
+ else if count >= 3 && matches. is_strict ( ) {
100
+ Err ( Misfire :: Conflict ( & flags:: ALL , & flags:: ALL ) )
101
+ }
102
+ else {
103
+ Ok ( DotFilter :: DotfilesAndDots )
93
104
}
94
105
}
95
106
}
@@ -101,7 +112,7 @@ impl IgnorePatterns {
101
112
/// command-line arguments.
102
113
pub fn deduce ( matches : & MatchedFlags ) -> Result < IgnorePatterns , Misfire > {
103
114
104
- let inputs = match matches. get ( & flags:: IGNORE_GLOB ) {
115
+ let inputs = match matches. get ( & flags:: IGNORE_GLOB ) ? {
105
116
None => return Ok ( IgnorePatterns :: empty ( ) ) ,
106
117
Some ( is) => is,
107
118
} ;
@@ -126,6 +137,7 @@ mod test {
126
137
use super :: * ;
127
138
use std:: ffi:: OsString ;
128
139
use options:: flags;
140
+ use options:: parser:: Flag ;
129
141
130
142
pub fn os ( input : & ' static str ) -> OsString {
131
143
let mut os = OsString :: new ( ) ;
@@ -134,17 +146,17 @@ mod test {
134
146
}
135
147
136
148
macro_rules! test {
137
- ( $name: ident: $type: ident <- $inputs: expr => $result: expr) => {
149
+ ( $name: ident: $type: ident <- $inputs: expr; $stricts : expr => $result: expr) => {
138
150
#[ test]
139
151
fn $name( ) {
140
- use options:: parser:: { Args , Arg } ;
141
- use std:: ffi:: OsString ;
152
+ use options:: parser:: Arg ;
153
+ use options:: test:: parse_for_test;
154
+ use options:: test:: Strictnesses :: * ;
142
155
143
156
static TEST_ARGS : & [ & Arg ] = & [ & flags:: SORT , & flags:: ALL , & flags:: TREE , & flags:: IGNORE_GLOB ] ;
144
-
145
- let bits = $inputs. as_ref( ) . into_iter( ) . map( |& o| os( o) ) . collect:: <Vec <OsString >>( ) ;
146
- let results = Args ( TEST_ARGS ) . parse( bits. iter( ) ) ;
147
- assert_eq!( $type:: deduce( & results. unwrap( ) . flags) , $result) ;
157
+ for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| $type:: deduce( mf) ) {
158
+ assert_eq!( result, $result) ;
159
+ }
148
160
}
149
161
} ;
150
162
}
@@ -153,38 +165,44 @@ mod test {
153
165
use super :: * ;
154
166
155
167
// Default behaviour
156
- test ! ( empty: SortField <- [ ] => Ok ( SortField :: default ( ) ) ) ;
168
+ test ! ( empty: SortField <- [ ] ; Both => Ok ( SortField :: default ( ) ) ) ;
157
169
158
170
// Sort field arguments
159
- test ! ( one_arg: SortField <- [ "--sort=cr" ] => Ok ( SortField :: CreatedDate ) ) ;
160
- test ! ( one_long: SortField <- [ "--sort=size" ] => Ok ( SortField :: Size ) ) ;
161
- test ! ( one_short: SortField <- [ "-saccessed" ] => Ok ( SortField :: AccessedDate ) ) ;
162
- test ! ( lowercase: SortField <- [ "--sort" , "name" ] => Ok ( SortField :: Name ( SortCase :: Sensitive ) ) ) ;
163
- test ! ( uppercase: SortField <- [ "--sort" , "Name" ] => Ok ( SortField :: Name ( SortCase :: Insensitive ) ) ) ;
171
+ test ! ( one_arg: SortField <- [ "--sort=cr" ] ; Both => Ok ( SortField :: CreatedDate ) ) ;
172
+ test ! ( one_long: SortField <- [ "--sort=size" ] ; Both => Ok ( SortField :: Size ) ) ;
173
+ test ! ( one_short: SortField <- [ "-saccessed" ] ; Both => Ok ( SortField :: AccessedDate ) ) ;
174
+ test ! ( lowercase: SortField <- [ "--sort" , "name" ] ; Both => Ok ( SortField :: Name ( SortCase :: Sensitive ) ) ) ;
175
+ test ! ( uppercase: SortField <- [ "--sort" , "Name" ] ; Both => Ok ( SortField :: Name ( SortCase :: Insensitive ) ) ) ;
164
176
165
177
// Errors
166
- test ! ( error: SortField <- [ "--sort=colour" ] => Err ( Misfire :: bad_argument( & flags:: SORT , & os( "colour" ) , super :: SORTS ) ) ) ;
178
+ test ! ( error: SortField <- [ "--sort=colour" ] ; Both => Err ( Misfire :: bad_argument( & flags:: SORT , & os( "colour" ) , super :: SORTS ) ) ) ;
167
179
168
180
// Overriding
169
- test ! ( overridden: SortField <- [ "--sort=cr" , "--sort" , "mod" ] => Ok ( SortField :: ModifiedDate ) ) ;
170
- test ! ( overridden_2: SortField <- [ "--sort" , "none" , "--sort=Extension" ] => Ok ( SortField :: Extension ( SortCase :: Insensitive ) ) ) ;
181
+ test ! ( overridden: SortField <- [ "--sort=cr" , "--sort" , "mod" ] ; Last => Ok ( SortField :: ModifiedDate ) ) ;
182
+ test ! ( overridden_2: SortField <- [ "--sort" , "none" , "--sort=Extension" ] ; Last => Ok ( SortField :: Extension ( SortCase :: Insensitive ) ) ) ;
183
+ test ! ( overridden_3: SortField <- [ "--sort=cr" , "--sort" , "mod" ] ; Complain => Err ( Misfire :: Duplicate ( Flag :: Long ( "sort" ) , Flag :: Long ( "sort" ) ) ) ) ;
184
+ test ! ( overridden_4: SortField <- [ "--sort" , "none" , "--sort=Extension" ] ; Complain => Err ( Misfire :: Duplicate ( Flag :: Long ( "sort" ) , Flag :: Long ( "sort" ) ) ) ) ;
171
185
}
172
186
173
187
174
188
mod dot_filters {
175
189
use super :: * ;
176
190
177
191
// Default behaviour
178
- test ! ( empty: DotFilter <- [ ] => Ok ( DotFilter :: JustFiles ) ) ;
192
+ test ! ( empty: DotFilter <- [ ] ; Both => Ok ( DotFilter :: JustFiles ) ) ;
179
193
180
194
// --all
181
- test ! ( all: DotFilter <- [ "--all" ] => Ok ( DotFilter :: Dotfiles ) ) ;
182
- test ! ( all_all: DotFilter <- [ "--all" , "-a" ] => Ok ( DotFilter :: DotfilesAndDots ) ) ;
183
- test ! ( all_all_2: DotFilter <- [ "-aa" ] => Ok ( DotFilter :: DotfilesAndDots ) ) ;
195
+ test ! ( all: DotFilter <- [ "--all" ] ; Both => Ok ( DotFilter :: Dotfiles ) ) ;
196
+ test ! ( all_all: DotFilter <- [ "--all" , "-a" ] ; Both => Ok ( DotFilter :: DotfilesAndDots ) ) ;
197
+ test ! ( all_all_2: DotFilter <- [ "-aa" ] ; Both => Ok ( DotFilter :: DotfilesAndDots ) ) ;
198
+
199
+ test ! ( all_all_3: DotFilter <- [ "-aaa" ] ; Last => Ok ( DotFilter :: DotfilesAndDots ) ) ;
200
+ test ! ( all_all_4: DotFilter <- [ "-aaa" ] ; Complain => Err ( Misfire :: Conflict ( & flags:: ALL , & flags:: ALL ) ) ) ;
184
201
185
202
// --all and --tree
186
- test ! ( tree_a: DotFilter <- [ "-Ta" ] => Ok ( DotFilter :: Dotfiles ) ) ;
187
- test ! ( tree_aa: DotFilter <- [ "-Taa" ] => Err ( Misfire :: TreeAllAll ) ) ;
203
+ test ! ( tree_a: DotFilter <- [ "-Ta" ] ; Both => Ok ( DotFilter :: Dotfiles ) ) ;
204
+ test ! ( tree_aa: DotFilter <- [ "-Taa" ] ; Both => Err ( Misfire :: TreeAllAll ) ) ;
205
+ test ! ( tree_aaa: DotFilter <- [ "-Taaa" ] ; Both => Err ( Misfire :: TreeAllAll ) ) ;
188
206
}
189
207
190
208
@@ -198,9 +216,15 @@ mod test {
198
216
}
199
217
200
218
// Various numbers of globs
201
- test ! ( none: IgnorePatterns <- [ ] => Ok ( IgnorePatterns :: empty( ) ) ) ;
202
- test ! ( one: IgnorePatterns <- [ "--ignore-glob" , "*.ogg" ] => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*.ogg" ) ] ) ) ) ;
203
- test ! ( two: IgnorePatterns <- [ "--ignore-glob=*.ogg|*.MP3" ] => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*.ogg" ) , pat( "*.MP3" ) ] ) ) ) ;
204
- test ! ( loads: IgnorePatterns <- [ "-I*|?|.|*" ] => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*" ) , pat( "?" ) , pat( "." ) , pat( "*" ) ] ) ) ) ;
219
+ test ! ( none: IgnorePatterns <- [ ] ; Both => Ok ( IgnorePatterns :: empty( ) ) ) ;
220
+ test ! ( one: IgnorePatterns <- [ "--ignore-glob" , "*.ogg" ] ; Both => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*.ogg" ) ] ) ) ) ;
221
+ test ! ( two: IgnorePatterns <- [ "--ignore-glob=*.ogg|*.MP3" ] ; Both => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*.ogg" ) , pat( "*.MP3" ) ] ) ) ) ;
222
+ test ! ( loads: IgnorePatterns <- [ "-I*|?|.|*" ] ; Both => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*" ) , pat( "?" ) , pat( "." ) , pat( "*" ) ] ) ) ) ;
223
+
224
+ // Overriding
225
+ test ! ( overridden: IgnorePatterns <- [ "-I=*.ogg" , "-I" , "*.mp3" ] ; Last => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*.mp3" ) ] ) ) ) ;
226
+ test ! ( overridden_2: IgnorePatterns <- [ "-I" , "*.OGG" , "-I*.MP3" ] ; Last => Ok ( IgnorePatterns :: from_iter( vec![ pat( "*.MP3" ) ] ) ) ) ;
227
+ test ! ( overridden_3: IgnorePatterns <- [ "-I=*.ogg" , "-I" , "*.mp3" ] ; Complain => Err ( Misfire :: Duplicate ( Flag :: Short ( b'I' ) , Flag :: Short ( b'I' ) ) ) ) ;
228
+ test ! ( overridden_4: IgnorePatterns <- [ "-I" , "*.OGG" , "-I*.MP3" ] ; Complain => Err ( Misfire :: Duplicate ( Flag :: Short ( b'I' ) , Flag :: Short ( b'I' ) ) ) ) ;
205
229
}
206
230
}
0 commit comments