From b43fca42427dbd276ca2dd1d712611b6dea4338c Mon Sep 17 00:00:00 2001
From: Adam Carpenter <53hornet@gmail.com>
Date: Wed, 27 Feb 2019 19:23:56 -0500
Subject: Added environment variable support for case sensitivity.

---
 minigrep/src/lib.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 3 deletions(-)

diff --git a/minigrep/src/lib.rs b/minigrep/src/lib.rs
index b55e924..9f0adbd 100644
--- a/minigrep/src/lib.rs
+++ b/minigrep/src/lib.rs
@@ -1,9 +1,11 @@
+use std::env;
 use std::error::Error;
 use std::fs;
 
 pub struct Config {
     pub query: String,
     pub filename: String,
+    pub case_sensitive: bool,
 }
 
 impl Config {
@@ -16,13 +18,34 @@ impl Config {
 
         let query = args[1].clone();
         let filename = args[2].clone();
-        Ok(Config { query, filename })
+        let mut case_sensitive = env::var("CASE_INSENSITIVE").is_err();
+
+        if args.nth(3) == "-i" {
+            case_sensitive = false;
+        }
+        else if args[3] == "-s" {
+            case_sensitive = true;
+        }
+
+        Ok(Config { query, filename, case_sensitive })
     }
 
 }
 
 pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
     let contents = fs::read_to_string(config.filename)?;
+
+    let results = if config.case_sensitive {
+        search(&config.query, &contents)
+    }
+    else {
+        search_case_insensitive(&config.query, &contents)
+    };
+
+    for line in results {
+        println!("{}", line);
+    }
+
     Ok(())
 }
 
@@ -38,21 +61,50 @@ fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
     results
 }
 
+fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
+    let query = query.to_lowercase();
+    let mut results = Vec::new();
+
+    for line in contents.lines() {
+        if line.to_lowercase().contains(&query) {
+            results.push(line);
+        }
+    }
+
+    results
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;
 
     #[test]
-    fn one_result() {
+    fn case_sensitive() {
         let query = "duct";
         let contents = "\
 Rust:
 safe, fast, productive.
-Pick three.";
+Pick three.
+Duct tape.";
 
         assert_eq!(
             vec!["safe, fast, productive."],
             search(query, contents)
         );
     }
+
+    #[test]
+    fn case_insensitive() {
+        let query = "rUsT";
+        let contents = "\
+Rust:
+safe, fast, productive.
+Pick three.
+Trust me.";
+
+        assert_eq!(
+            vec!["Rust:", "Trust me."],
+            search_case_insensitive(query, contents)
+        );
+    }
 }
-- 
cgit v1.2.3