@@ -2,11 +2,11 @@ use crate::otp::otp_element::OTPDatabase;
2
2
use crate :: { clipboard, otp:: otp_element:: OTPElement } ;
3
3
use clap:: Args ;
4
4
use color_eyre:: eyre:: eyre;
5
- use globset:: { Glob , GlobMatcher } ;
5
+ use globset:: { GlobBuilder , GlobMatcher } ;
6
6
7
7
use super :: SubcommandExecutor ;
8
8
9
- #[ derive( Args ) ]
9
+ #[ derive( Args , Default ) ]
10
10
pub struct ExtractArgs {
11
11
/// Code Index
12
12
#[ arg( short, long, required_unless_present_any = [ "issuer" , "label" ] ) ]
@@ -36,14 +36,14 @@ impl TryFrom<ExtractArgs> for ExtractFilterGlob {
36
36
type Error = color_eyre:: eyre:: ErrReport ;
37
37
38
38
fn try_from ( value : ExtractArgs ) -> Result < Self , Self :: Error > {
39
- let issuer_glob = if value. issuer . is_some ( ) {
40
- Some ( Glob :: new ( & value . issuer . unwrap ( ) ) ? . compile_matcher ( ) )
39
+ let issuer_glob = if let Some ( issuer ) = value. issuer {
40
+ Some ( create_matcher ( & issuer) ? )
41
41
} else {
42
42
None
43
43
} ;
44
44
45
- let label_glob = if value. label . is_some ( ) {
46
- Some ( Glob :: new ( & value . label . unwrap ( ) ) ? . compile_matcher ( ) )
45
+ let label_glob = if let Some ( label ) = value. label {
46
+ Some ( create_matcher ( & label) ? )
47
47
} else {
48
48
None
49
49
} ;
@@ -56,6 +56,15 @@ impl TryFrom<ExtractArgs> for ExtractFilterGlob {
56
56
}
57
57
}
58
58
59
+ fn create_matcher (
60
+ glob : & str ,
61
+ ) -> Result < GlobMatcher , <ExtractFilterGlob as TryFrom < ExtractArgs > >:: Error > {
62
+ Ok ( GlobBuilder :: new ( glob)
63
+ . case_insensitive ( true )
64
+ . build ( ) ?
65
+ . compile_matcher ( ) )
66
+ }
67
+
59
68
impl SubcommandExecutor for ExtractArgs {
60
69
fn run_command ( self , otp_database : OTPDatabase ) -> color_eyre:: Result < OTPDatabase > {
61
70
let copy_to_clipboard = self . copy_to_clipboard ;
@@ -104,11 +113,13 @@ fn filter_extract(args: &ExtractFilterGlob, index: usize, candidate: &OTPElement
104
113
105
114
#[ cfg( test) ]
106
115
mod tests {
107
- use globset:: Glob ;
108
116
109
- use crate :: otp:: otp_element:: { OTPDatabase , OTPElementBuilder } ;
117
+ use crate :: {
118
+ arguments:: extract:: ExtractArgs ,
119
+ otp:: otp_element:: { OTPDatabase , OTPElementBuilder } ,
120
+ } ;
110
121
111
- use super :: { find_match, ExtractFilterGlob } ;
122
+ use super :: find_match;
112
123
113
124
#[ test]
114
125
fn test_glob_filtering_good_issuer ( ) {
@@ -132,14 +143,13 @@ mod tests {
132
143
. unwrap ( ) ,
133
144
) ;
134
145
135
- let filter = ExtractFilterGlob {
136
- issuer_glob : Some ( Glob :: new ( "test-iss*" ) . unwrap ( ) . compile_matcher ( ) ) ,
137
- label_glob : None ,
138
- index : None ,
146
+ let filter = ExtractArgs {
147
+ issuer : Some ( "test-iss*" . to_string ( ) ) ,
148
+ ..Default :: default ( )
139
149
} ;
140
150
141
151
// Act
142
- let found_match = find_match ( & otp_database, filter) ;
152
+ let found_match = find_match ( & otp_database, filter. try_into ( ) . unwrap ( ) ) ;
143
153
144
154
// Assert
145
155
assert ! ( found_match. is_some( ) ) ;
@@ -167,14 +177,13 @@ mod tests {
167
177
. unwrap ( ) ,
168
178
) ;
169
179
170
- let filter = ExtractFilterGlob {
171
- issuer_glob : None ,
172
- label_glob : Some ( Glob :: new ( "test-la*" ) . unwrap ( ) . compile_matcher ( ) ) ,
173
- index : None ,
180
+ let filter = ExtractArgs {
181
+ label : Some ( "test-la*" . to_string ( ) ) ,
182
+ ..Default :: default ( )
174
183
} ;
175
184
176
185
// Act
177
- let found_match = find_match ( & otp_database, filter) ;
186
+ let found_match = find_match ( & otp_database, filter. try_into ( ) . unwrap ( ) ) ;
178
187
179
188
// Assert
180
189
assert ! ( found_match. is_some( ) ) ;
@@ -202,14 +211,13 @@ mod tests {
202
211
. unwrap ( ) ,
203
212
) ;
204
213
205
- let filter = ExtractFilterGlob {
206
- issuer_glob : None ,
207
- label_glob : Some ( Glob :: new ( "test-lala*" ) . unwrap ( ) . compile_matcher ( ) ) ,
208
- index : None ,
214
+ let filter = ExtractArgs {
215
+ label : Some ( "test-lala*" . to_string ( ) ) ,
216
+ ..Default :: default ( )
209
217
} ;
210
218
211
219
// Act
212
- let found_match = find_match ( & otp_database, filter) ;
220
+ let found_match = find_match ( & otp_database, filter. try_into ( ) . unwrap ( ) ) ;
213
221
214
222
// Assert
215
223
assert ! ( found_match. is_none( ) ) ;
@@ -237,14 +245,14 @@ mod tests {
237
245
. unwrap ( ) ,
238
246
) ;
239
247
240
- let filter = ExtractFilterGlob {
241
- issuer_glob : Some ( Glob :: new ( "test*" ) . unwrap ( ) . compile_matcher ( ) ) ,
242
- label_glob : Some ( Glob :: new ( "test-la*" ) . unwrap ( ) . compile_matcher ( ) ) ,
243
- index : None ,
248
+ let filter = ExtractArgs {
249
+ issuer : Some ( "test*" . to_string ( ) ) ,
250
+ label : Some ( "test-la*" . to_string ( ) ) ,
251
+ .. Default :: default ( )
244
252
} ;
245
253
246
254
// Act
247
- let found_match = find_match ( & otp_database, filter) ;
255
+ let found_match = find_match ( & otp_database, filter. try_into ( ) . unwrap ( ) ) ;
248
256
249
257
// Assert
250
258
assert ! ( found_match. is_some( ) ) ;
@@ -272,16 +280,50 @@ mod tests {
272
280
. unwrap ( ) ,
273
281
) ;
274
282
275
- let filter = ExtractFilterGlob {
276
- issuer_glob : Some ( Glob :: new ( "test-no*" ) . unwrap ( ) . compile_matcher ( ) ) ,
277
- label_glob : Some ( Glob :: new ( "test-la*" ) . unwrap ( ) . compile_matcher ( ) ) ,
278
- index : None ,
283
+ let filter = ExtractArgs {
284
+ issuer : Some ( "test-no*" . to_string ( ) ) ,
285
+ label : Some ( "test-la*" . to_string ( ) ) ,
286
+ .. Default :: default ( )
279
287
} ;
280
288
281
289
// Act
282
- let found_match = find_match ( & otp_database, filter) ;
290
+ let found_match = find_match ( & otp_database, filter. try_into ( ) . unwrap ( ) ) ;
283
291
284
292
// Assert
285
293
assert ! ( found_match. is_none( ) ) ;
286
294
}
295
+
296
+ #[ test]
297
+ fn test_glob_filtering_case_insensitive ( ) {
298
+ // Arrange
299
+ let mut otp_database = OTPDatabase :: default ( ) ;
300
+ otp_database. add_element (
301
+ OTPElementBuilder :: default ( )
302
+ . issuer ( "test-issuer" )
303
+ . label ( "test-label" )
304
+ . secret ( "AA" )
305
+ . build ( )
306
+ . unwrap ( ) ,
307
+ ) ;
308
+
309
+ otp_database. add_element (
310
+ OTPElementBuilder :: default ( )
311
+ . issuer ( "test-issuer2" )
312
+ . label ( "test-label2" )
313
+ . secret ( "AA" )
314
+ . build ( )
315
+ . unwrap ( ) ,
316
+ ) ;
317
+
318
+ let filter = ExtractArgs {
319
+ issuer : Some ( "TeSt-iSS*" . to_string ( ) ) ,
320
+ ..Default :: default ( )
321
+ } ;
322
+
323
+ // Act
324
+ let found_match = find_match ( & otp_database, filter. try_into ( ) . unwrap ( ) ) ;
325
+
326
+ // Assert
327
+ assert ! ( found_match. is_some( ) ) ;
328
+ }
287
329
}
0 commit comments