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}