minigrep_crate_publish_test/
lib.rs

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