From e078e19ae5e1224c4fdbed5af922ef32ed890c2d Mon Sep 17 00:00:00 2001 From: laurens Date: Sun, 27 Sep 2020 17:46:44 +0200 Subject: [PATCH] minigrep: use iterators --- minigrep/src/lib.rs | 41 ++++++++++++++++++----------------------- minigrep/src/main.rs | 3 +-- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/minigrep/src/lib.rs b/minigrep/src/lib.rs index 2b3da39..cfc6089 100644 --- a/minigrep/src/lib.rs +++ b/minigrep/src/lib.rs @@ -9,13 +9,17 @@ pub struct Config { } impl Config { - pub fn new(args: &[String]) -> Result { - if args.len() < 3 { - return Err("Not enough arguments"); - } + pub fn new(mut args: env::Args) -> Result { + args.next(); - let query = args[1].clone(); - let filename = args[2].clone(); + let query = match args.next() { + Some(arg) => arg, + None => return Err("Didnt get a query string"), + }; + let filename = match args.next() { + Some(arg) => arg, + None => return Err("Didnt get a query string"), + }; let case_sensitive = env::var("CASE_INSENSITIVE").is_err(); @@ -44,28 +48,19 @@ pub fn run(config: Config) -> Result<(), Box> { } pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { - let mut results = Vec::new(); - - for line in contents.lines() { - if line.contains(query) { - results.push(line); - } - } - - results + contents + .lines() + .filter(|line| line.contains(query)) + .collect() } pub 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 + contents + .lines() + .filter(|line| line.to_lowercase().contains(&query)) + .collect() } #[cfg(test)] diff --git a/minigrep/src/main.rs b/minigrep/src/main.rs index dc18ddf..0e1a120 100644 --- a/minigrep/src/main.rs +++ b/minigrep/src/main.rs @@ -4,8 +4,7 @@ use std::process; use minigrep::Config; fn main() { - let args: Vec = env::args().collect(); - let config = Config::new(&args).unwrap_or_else(|err| { + let config = Config::new(env::args()).unwrap_or_else(|err| { eprintln!("Problem parsing arguments: {}", err); process::exit(1); });