search/
lib.rs

1use regex::Regex;
2
3///#### Example to using this fn
4/**```rust
5 * use search::search;
6 *
7 * fn main() {
8 *     let query = "Rust";
9 *     let contents = "Rust is good language";
10 *     let results = search(query, contents, false, false, false);
11 *     assert_eq!(results, vec!["Rust is good language"]) // -> True
12 * }
13 * ```
14*/
15
16pub 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}