diff --git a/ch12/minigrep/src/lib.rs b/ch12/minigrep/src/lib.rs index f1d25b6..e948e62 100644 --- a/ch12/minigrep/src/lib.rs +++ b/ch12/minigrep/src/lib.rs @@ -34,15 +34,37 @@ impl Config { } } - pub fn build(args: &[String]) -> Result<Config, &'static str> { - if args.len() < 3 { - return Err("not enough arguments"); - } + // pub fn build(args: &[String]) -> Result<Config, &'static str> { + // if args.len() < 3 { + // return Err("not enough arguments"); + // } + + // Ok(Config { + // query: args[1].clone(), + // file_path: args[2].clone(), + // ignore_case: env::var("IGNORE_CASE").is_ok(), + // }) + // } + + pub fn build(mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> { + args.next(); + + let query = match args.next() { + Some(arg) => arg, + None => return Err("Didn't get a query string"), + }; + + let file_path = match args.next() { + Some(arg) => arg, + None => return Err("Didn't get a file path"), + }; + + let ignore_case = env::var("IGNORE_CASE").is_ok(); Ok(Config { - query: args[1].clone(), - file_path: args[2].clone(), - ignore_case: env::var("IGNORE_CASE").is_ok(), + query, + file_path, + ignore_case, }) } } @@ -68,15 +90,19 @@ pub fn run(config: Config) -> Result<(), Box<dyn Error>> { } pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { - let mut results = Vec::new(); + contents + .lines() + .filter(|line| line.contains(query)) + .collect() + // let mut results = Vec::new(); - for line in contents.lines() { - if line.contains(query) { - results.push(line); - } - } + // for line in contents.lines() { + // if line.contains(query) { + // results.push(line); + // } + // } - results + // results } pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { diff --git a/ch12/minigrep/src/main.rs b/ch12/minigrep/src/main.rs index 7d4a8c4..9c4b60d 100644 --- a/ch12/minigrep/src/main.rs +++ b/ch12/minigrep/src/main.rs @@ -20,8 +20,9 @@ use std::process; use minigrep::Config; +// The modifications for ch13 are added in this version fn main() { - let args: Vec<String> = env::args().collect(); + // let args: Vec<String> = env::args().collect(); // dbg!(args); // let config = Config::new(&args); @@ -29,7 +30,8 @@ fn main() { // unwrap_or_else passes an argument to a closure which is an // anonymous function // eprintln!() for output to stdout - let config = Config::build(&args).unwrap_or_else(|err| { + // let config = Config::build(&args).unwrap_or_else(|err| { + let config = Config::build(env::args()).unwrap_or_else(|err| { eprintln!("Problem parsing arguments: {err}"); process::exit(1); });