1
- use std:: env;
2
- use std:: fmt:: Result ;
1
+ use std:: error:: Error ;
3
2
use std:: fs;
4
3
5
- pub fn run ( config : ( ) ) -> Result {
4
+ pub fn run ( config : Config ) -> Result < ( ) , Box < dyn Error > > {
6
5
let contents = fs:: read_to_string ( config. filename ) ?;
7
6
8
- let results = if config. case_sensitive {
9
- search ( & config. query , & contents)
10
- } else {
11
- search_case_insensitive ( & config. query , & contents)
12
- } ;
13
-
14
- for line in results {
15
- println ! ( "{}" , line)
7
+ for line in search ( & config. query , & contents) {
8
+ println ! ( "{}" , line) ;
16
9
}
17
10
18
11
Ok ( ( ) )
@@ -21,20 +14,17 @@ pub fn run(config: ()) -> Result {
21
14
pub struct Config {
22
15
pub query : String ,
23
16
pub filename : String ,
24
- pub case_sensitive : bool ,
25
17
}
26
18
27
19
impl Config {
28
- pub fn new ( args : & [ String ] ) -> Result {
20
+ pub fn new ( args : & [ String ] ) -> Result < Config , & str > {
29
21
if args. len ( ) < 3 {
30
- return Err ( core :: fmt :: Error :: msg ( "Not enough arguments" ) ) ;
22
+ return Err ( "Not enough arguments" ) ;
31
23
}
32
- let query: String = args[ 1 ] . clone ( ) ;
33
- let filename: String = args[ 2 ] . clone ( ) ;
34
-
35
- let case_sensitive = env:: var ( "CASE_INSENSITIVE" ) . is_err ( ) ;
24
+ let query = args[ 1 ] . clone ( ) ;
25
+ let filename = args[ 2 ] . clone ( ) ;
36
26
37
- Ok ( ( ) )
27
+ Ok ( Config { query , filename } )
38
28
}
39
29
}
40
30
@@ -50,47 +40,18 @@ pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
50
40
results
51
41
}
52
42
53
- pub fn search_case_insensitive < ' a > ( query : & str , contents : & ' a str ) -> Vec < & ' a str > {
54
- let query = query. to_lowercase ( ) ;
55
- let mut results = Vec :: new ( ) ;
56
-
57
- for line in contents. lines ( ) {
58
- if line. to_lowercase ( ) . contains ( & query) {
59
- results. push ( line) ;
60
- }
61
- }
62
-
63
- results
64
- }
65
-
66
43
#[ cfg( test) ]
67
44
mod tests {
68
- use super :: * ;
45
+ use super :: search ;
69
46
70
47
#[ test]
71
- fn case_sensitive ( ) {
48
+ fn one_result ( ) {
72
49
let query = "duct" ;
73
50
let contents = "\
74
51
Rust:
75
52
safe, fast, productive.
76
- Pick three.
77
- Duct tape." ;
53
+ Pick three." ;
78
54
79
55
assert_eq ! ( vec![ "safe, fast, productive." ] , search( query, contents) ) ;
80
56
}
81
-
82
- #[ test]
83
- fn case_insensitive ( ) {
84
- let query = "rUsT" ;
85
- let contents = "\
86
- Rust:
87
- safe, fast, productive.
88
- Pick three.
89
- Trust me." ;
90
-
91
- assert_eq ! (
92
- vec![ "Rust:" , "Trust me." ] ,
93
- search_case_insensitive( query, contents)
94
- )
95
- }
96
57
}
0 commit comments