minigrep_onemelon/
lib.rs

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