Skip to main content

grrs3/
lib.rs

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