Optimised args with iterator and search functions with iterator

This commit is contained in:
Piyush मिश्रः 2020-05-06 19:42:27 +05:30
parent ffac6a0f03
commit 0055b3553d
4 changed files with 47 additions and 35 deletions

11
.project Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>minigrep</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
</natures>
</projectDescription>

View File

@ -1,4 +1,4 @@
Jai Sri Ram Jai Sri Ram
Jai Hanuman Jai Hanuman
Ram ka Mandir ban raha hai Ram ka Mandir ban raha hai
Hanuman Ram Bhakt hai Hanuman ram Bhakt hai

View File

@ -8,25 +8,34 @@ pub struct Configs {
} }
impl Configs { impl Configs {
pub fn new(args: &Vec<String>) -> Result<Configs, &'static str> { pub fn new(args: &mut std::env::Args) -> Result<Configs, &'static str> {
if args.len() < 3 { if args.len() < 3 {
return Err("\ return Err("\
minigrep [pattern] [filename] case minigrep [pattern] [filename] case
adding \"case\" is optional to enable case sensitive grep"); adding \"case\" is optional to enable case sensitive grep");
} }
let mut is_sensitive = false; args.next();
if let Some(o) = args.get(3) { let pattern = match args.next() {
if o == "case" { Some(arg) => arg,
is_sensitive = true; 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 { Ok(Configs {
pattern: args[1].clone(), pattern,
filename: args[2].clone(), filename,
is_case_sensitive: is_sensitive, is_case_sensitive,
}) })
} }
} }
@ -44,27 +53,19 @@ pub fn run(conf: Configs) -> Result<(), Box<dyn Error>> {
} }
pub fn search_case_sensitive<'a>(pattern: &str, contents: &'a str) -> Vec<&'a str> { pub fn search_case_sensitive<'a>(pattern: &str, contents: &'a str) -> Vec<&'a str> {
let mut vec: Vec<&'a str> = vec![]; contents.lines()
.filter(
for line in contents.lines() { |lin| lin
if line.contains(pattern) { .contains(&pattern))
vec.push(line); .collect()
}
}
vec
} }
pub fn search_case_insensitive<'a>(pattern: &str, contents: &'a str) -> Vec<&'a str> { pub fn search_case_insensitive<'a>(pattern: &str, contents: &'a str) -> Vec<&'a str> {
let mut vec: Vec<&'a str> = vec![]; contents.lines()
let pattern = pattern.to_lowercase(); .filter(
|lin| lin.to_lowercase()
for line in contents.lines() { .contains(&pattern.to_lowercase()))
if line.to_lowercase().contains(&pattern) { .collect()
vec.push(line);
}
}
vec
} }
pub fn print_output(out: Vec<&str>) { pub fn print_output(out: Vec<&str>) {

View File

@ -2,15 +2,15 @@ use std::env;
use std::process; use std::process;
fn main() { fn main() {
let args: Vec<String> = 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); eprintln!("{}", err);
process::exit(1); process::exit(1);
}); });
if let Err(e) = minigrep::run(conf) { if let Err(e) = minigrep::run(conf) {
eprintln!("Error: {}", e); eprintln!("Error: {}", e);
process::exit(0); process::exit(1);
} }
} }