minigrep-cli-tool 0.1.0

A simple cli tool to search upon a text file for lines containing specified string
Documentation
pub fn search<'a>(query: &str, contents: &'a str) -> impl Iterator<Item = &'a str> {
    contents
        .lines()
        .filter(move |line| line.contains(query))
}

pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> impl Iterator<Item = &'a str> {
    contents
        .lines()
        .filter(|line| line.to_lowercase().contains(&query.to_lowercase()))
}

#[cfg(test)]
mod tests {
    use std::vec;

    use super::*;

    #[test]
    fn one_result() {
        let query = "duct";
        let contents = "\
Rust:
safe, fast, productive.
Pick three.";

        let result: Vec<&str> = search(query, contents).collect();
        assert_eq!(result, vec!["safe, fast, productive."]);
    }

    #[test]
    fn multiple_result() {
        let query = "ive";
        let contents = "\
Rust:
really productive.
also passive.
probably problamatic.
but simply lovely.
Come dive into the world of rust.";

        let result: Vec<&str> = search(query, contents).collect();
        assert_eq!(
            result,
            vec![
                "really productive.",
                "also passive.",
                "Come dive into the world of rust."
            ]
        )
    }

    #[test]
    fn empty_content() {
        let query = "hi";
        let contents = "";

        let result: Vec<&str> = search(query, contents).collect();
        let expected: Vec<&str> = Vec::new();
        assert_eq!(result, expected)
    }

    #[test]
    fn empty_query() {
        let query = "";
        let contents = "\
Rust:
really productive.
also passive.
probably problamatic.
but simply lovely.
Come dive into the world of rust.";

        let result: Vec<&str> = search(query, contents).collect();
        let expected: Vec<&str> = contents.lines().collect();
        assert_eq!(result, expected)
    }

    #[test]
    fn empty_content_and_query() {
        let query = "";
        let contents = "";

        let result: Vec<&str> = search(query, contents).collect();
        let expected: Vec<&str> = Vec::new();
        assert_eq!(result, expected)
    }

    #[test]
    fn case_insensitive() {
        let query = "rUsT";
        let contents = "\
Rust:
really productive.
also passive.
probably problamatic.
but simply lovely.
Come dive into the world of rust.";

        let result: Vec<&str> = search_case_insensitive(query, contents).collect();
        assert_eq!(result, vec!["Rust:", "Come dive into the world of rust."]);
    }

    #[test]
    fn case_sensitive() {
        let query = "rUsT";
        let contents = "\
Rust:
really productive.
also passive.
probably problamatic.
but simply lovely.
Come dive into the world of rust.";

        let result: Vec<&str> = search(query, contents).collect();
        let expected: Vec<&str> = Vec::new();
        assert_eq!(result, expected);
    }
}