minigrepbk 0.1.0

A collection of utilities to make performing searching text in a certain document
Documentation
//! # minigrep
//!
//! `minigrep` is a collection of utilities to make performing searching
//! text in a certain document.

/// Searches for a query string in the given contents (case-sensitive).
///
/// Returns an iterator over all lines in `contents` that contain the `query` string.
///
/// # Arguments
///
/// * `query` - The string to search for
/// * `contents` - The text to search within
///
/// # Examples
///
/// ```
/// use minigrep::search;
///
/// let query = "duct";
/// let contents = "Rust:\nsafe, fast, productive.";
/// let results: Vec<&str> = search(query, contents).collect();
/// assert_eq!(vec!["safe, fast, productive."], results);
/// ```
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> {
  let query = query.to_lowercase();

  contents
  .lines()
  .filter(move |line| {
    let line = line.to_lowercase();
    line.contains(&query)
  })
}

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn test_case_sensitive() {
    let query = "duct";
    let contents = "\
Rust:
safe, fast, productive.
Pick three.
Duct tape.";
    assert_eq!(vec!["safe, fast, productive."], search(query, contents).collect::<Vec<_>>())
  }

  #[test]
  fn test_case_insensitive() {
    let query = "duct";
    let contents = "\
Rust:
safe, fast, productive.
Pick three.
Duct tape.";
    assert_eq!(vec!["safe, fast, productive.", "Duct tape."], search_case_insensitive(query, contents).collect::<Vec<_>>())
  }
}