diff --git a/.project b/.project new file mode 100644 index 0000000..197bba1 --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + minigrep + + + + + + + + diff --git a/file_to_match.txt b/file_to_match.txt index 78b11ad..a98d406 100644 --- a/file_to_match.txt +++ b/file_to_match.txt @@ -1,4 +1,4 @@ Jai Sri Ram Jai Hanuman Ram ka Mandir ban raha hai -Hanuman Ram Bhakt hai +Hanuman ram Bhakt hai diff --git a/src/lib.rs b/src/lib.rs index 93c06ec..74ccac9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,25 +8,34 @@ pub struct Configs { } impl Configs { - pub fn new(args: &Vec) -> Result { + pub fn new(args: &mut std::env::Args) -> Result { if args.len() < 3 { return Err("\ minigrep [pattern] [filename] case adding \"case\" is optional to enable case sensitive grep"); } - - let mut is_sensitive = false; - - if let Some(o) = args.get(3) { - if o == "case" { - is_sensitive = true; - } - } - + + args.next(); + + let pattern = match args.next() { + Some(arg) => arg, + None => return Err("Pattern Not got") + }; + + let filename = match args.next() { + Some(arg) => arg, + None => return Err("Filenane Not got") + }; + + let is_case_sensitive = match args.next() { + Some(arg) => arg == "case", + None => false + }; + Ok(Configs { - pattern: args[1].clone(), - filename: args[2].clone(), - is_case_sensitive: is_sensitive, + pattern, + filename, + is_case_sensitive, }) } } @@ -44,27 +53,19 @@ pub fn run(conf: Configs) -> Result<(), Box> { } pub fn search_case_sensitive<'a>(pattern: &str, contents: &'a str) -> Vec<&'a str> { - let mut vec: Vec<&'a str> = vec![]; - - for line in contents.lines() { - if line.contains(pattern) { - vec.push(line); - } - } - - vec + contents.lines() + .filter( + |lin| lin + .contains(&pattern)) + .collect() } pub fn search_case_insensitive<'a>(pattern: &str, contents: &'a str) -> Vec<&'a str> { - let mut vec: Vec<&'a str> = vec![]; - let pattern = pattern.to_lowercase(); - - for line in contents.lines() { - if line.to_lowercase().contains(&pattern) { - vec.push(line); - } - } - vec + contents.lines() + .filter( + |lin| lin.to_lowercase() + .contains(&pattern.to_lowercase())) + .collect() } pub fn print_output(out: Vec<&str>) { diff --git a/src/main.rs b/src/main.rs index ef1fe06..438ac82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,15 +2,15 @@ use std::env; use std::process; fn main() { - let args: Vec = env::args().collect(); + let mut args = env::args(); - let conf = minigrep::Configs::new(&args).unwrap_or_else(|err| { + let conf = minigrep::Configs::new(&mut args).unwrap_or_else(|err| { eprintln!("{}", err); process::exit(1); }); if let Err(e) = minigrep::run(conf) { eprintln!("Error: {}", e); - process::exit(0); + process::exit(1); } }