From 1bc7e4df5ca90557d5f82dfb4825d76469ca8482 Mon Sep 17 00:00:00 2001 From: dhanushrajgp Date: Sat, 6 Jul 2024 14:21:45 +0530 Subject: [PATCH] added searching case insensitive using IGNORE_CASE cmd line argumentand outputting successful fetch to output.txt --- output.txt | Bin 0 -> 102 bytes src/lib.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++----- src/main.rs | 5 ++--- 3 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 output.txt diff --git a/output.txt b/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..ecd27c079f92680218996863bf20572c392de527 GIT binary patch literal 102 zcmezW&yk^sA(cUap^_n=p%h5x0qGq!KX Xl~5H5Ks_K+ih(L}fh?E_ieP;JGi(y8 literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index d922360..994b8cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,23 @@ -use std::{error::Error, fs}; +use std::{env, error::Error, fs}; pub fn run(config: Config) -> Result<(), Box> { - let _content = fs::read_to_string(config.file_path)?; + let content = fs::read_to_string(config.file_path)?; + + let results = if config.ignore_case { + search_case_insensitive(&config.query, &content) + } else { + search(&config.query, &content) + }; + for line in results { + println!("{line}"); + } Ok(()) } pub struct Config { pub query: String, pub file_path: String, + pub ignore_case: bool, } impl Config { @@ -15,9 +25,15 @@ impl Config { if args.len() < 3 { return Err("not enough arguments"); } + + let ignore_case = env::var("IGNORE_CASE").is_ok(); let query = args[1].clone(); let file_path = args[2].clone(); - Ok(Config { query, file_path }) + Ok(Config { + query, + file_path, + ignore_case, + }) } } @@ -32,18 +48,45 @@ pub fn search<'a>(query: &str, content: &'a str) -> Vec<&'a str> { results } +pub fn search_case_insensitive<'a>(query: &str, content: &'a str) -> Vec<&'a str> { + let query = query.to_lowercase(); + let mut results = Vec::new(); + + for line in content.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 content = "\ Rust: safe,fast,productive. -pick three."; +pick three +Duct Tape."; assert_eq!(vec!["safe,fast,productive."], search(query, content)) } + + #[test] + fn case_insensitive() { + let query = "rUst"; + let content = "\ +Rust: +safe, fast, productive. +Pick three. +Trust me."; + assert_eq!( + vec!["Rust:", "Trust me."], + search_case_insensitive(query, content) + ); + } } diff --git a/src/main.rs b/src/main.rs index 6c6b24c..4308c78 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,16 +3,15 @@ use std::env; use std::process; fn main() { - println!("Hello, world!"); let args: Vec = env::args().collect(); let config = Config::build(&args).unwrap_or_else(|err| { - println!("Problem parsing arguments: {err}"); + eprintln!("Problem parsing arguments: {err}"); process::exit(1); }); if let Err(e) = minigrep::run(config) { - println!("Application error: {e}"); + eprintln!("Application error: {e}"); process::exit(1) } }