1use regex::Regex;
2
3pub fn search<'a>(query: &str, contents: &'a str, number: bool, invert_match: bool, _case: bool) -> Vec<String> {
17 let mut re = Regex::new(query).unwrap();
18 if _case {
19 re = Regex::new(&format!("(?i){}", regex::escape(query))).unwrap();
20 }
21 let mut results = Vec::new();
22
23 for (i, line) in contents.lines().enumerate() {
24 if re.is_match(line) != invert_match {
25 if number {
26 results.push(format!("{}: {}", i + 1, line));
27 } else {
28 results.push(line.to_string());
29 }
30 }
31 }
32
33 results
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 #[test]
41 fn case_sensitive() {
42 let query = "Duct";
43 let contents = "\
44Rust:
45safe, fast, productive.
46Pick three.
47Duct tape.";
48
49 assert_eq!(vec!["Duct tape."],search(query, contents, false, false, false));
50 }
51
52 #[test]
53 fn case_insensitive() {
54 let query = "rUsT";
55 let contents = "\
56Rust:
57safe, fast, productive.
58Pick three.
59Trust me.";
60
61 assert_eq!(
62 vec!["Rust:", "Trust me."],
63 search(query, contents, false, false, true)
64 );
65 }
66}