minigrep_cli_tool/
lib.rs

1pub fn search<'a>(query: &str, contents: &'a str) -> impl Iterator<Item = &'a str> {
2    contents
3        .lines()
4        .filter(move |line| line.contains(query))
5}
6
7pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> impl Iterator<Item = &'a str> {
8    contents
9        .lines()
10        .filter(|line| line.to_lowercase().contains(&query.to_lowercase()))
11}
12
13#[cfg(test)]
14mod tests {
15    use std::vec;
16
17    use super::*;
18
19    #[test]
20    fn one_result() {
21        let query = "duct";
22        let contents = "\
23Rust:
24safe, fast, productive.
25Pick three.";
26
27        let result: Vec<&str> = search(query, contents).collect();
28        assert_eq!(result, vec!["safe, fast, productive."]);
29    }
30
31    #[test]
32    fn multiple_result() {
33        let query = "ive";
34        let contents = "\
35Rust:
36really productive.
37also passive.
38probably problamatic.
39but simply lovely.
40Come dive into the world of rust.";
41
42        let result: Vec<&str> = search(query, contents).collect();
43        assert_eq!(
44            result,
45            vec![
46                "really productive.",
47                "also passive.",
48                "Come dive into the world of rust."
49            ]
50        )
51    }
52
53    #[test]
54    fn empty_content() {
55        let query = "hi";
56        let contents = "";
57
58        let result: Vec<&str> = search(query, contents).collect();
59        let expected: Vec<&str> = Vec::new();
60        assert_eq!(result, expected)
61    }
62
63    #[test]
64    fn empty_query() {
65        let query = "";
66        let contents = "\
67Rust:
68really productive.
69also passive.
70probably problamatic.
71but simply lovely.
72Come dive into the world of rust.";
73
74        let result: Vec<&str> = search(query, contents).collect();
75        let expected: Vec<&str> = contents.lines().collect();
76        assert_eq!(result, expected)
77    }
78
79    #[test]
80    fn empty_content_and_query() {
81        let query = "";
82        let contents = "";
83
84        let result: Vec<&str> = search(query, contents).collect();
85        let expected: Vec<&str> = Vec::new();
86        assert_eq!(result, expected)
87    }
88
89    #[test]
90    fn case_insensitive() {
91        let query = "rUsT";
92        let contents = "\
93Rust:
94really productive.
95also passive.
96probably problamatic.
97but simply lovely.
98Come dive into the world of rust.";
99
100        let result: Vec<&str> = search_case_insensitive(query, contents).collect();
101        assert_eq!(result, vec!["Rust:", "Come dive into the world of rust."]);
102    }
103
104    #[test]
105    fn case_sensitive() {
106        let query = "rUsT";
107        let contents = "\
108Rust:
109really productive.
110also passive.
111probably problamatic.
112but simply lovely.
113Come dive into the world of rust.";
114
115        let result: Vec<&str> = search(query, contents).collect();
116        let expected: Vec<&str> = Vec::new();
117        assert_eq!(result, expected);
118    }
119}