minigrep: use iterators

This commit is contained in:
laurens 2020-09-27 17:46:44 +02:00
parent 21f39f9899
commit e078e19ae5
2 changed files with 19 additions and 25 deletions

View file

@ -9,13 +9,17 @@ pub struct Config {
} }
impl Config { impl Config {
pub fn new(args: &[String]) -> Result<Config, &'static str> { pub fn new(mut args: env::Args) -> Result<Config, &'static str> {
if args.len() < 3 { args.next();
return Err("Not enough arguments");
}
let query = args[1].clone(); let query = match args.next() {
let filename = args[2].clone(); 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(); let case_sensitive = env::var("CASE_INSENSITIVE").is_err();
@ -44,28 +48,19 @@ pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
} }
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
let mut results = Vec::new(); contents
.lines()
for line in contents.lines() { .filter(|line| line.contains(query))
if line.contains(query) { .collect()
results.push(line);
}
}
results
} }
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
let query = query.to_lowercase(); let query = query.to_lowercase();
let mut results = Vec::new();
for line in contents.lines() { contents
if line.to_lowercase().contains(&query) { .lines()
results.push(line); .filter(|line| line.to_lowercase().contains(&query))
} .collect()
}
results
} }
#[cfg(test)] #[cfg(test)]

View file

@ -4,8 +4,7 @@ use std::process;
use minigrep::Config; use minigrep::Config;
fn main() { fn main() {
let args: Vec<String> = env::args().collect(); let config = Config::new(env::args()).unwrap_or_else(|err| {
let config = Config::new(&args).unwrap_or_else(|err| {
eprintln!("Problem parsing arguments: {}", err); eprintln!("Problem parsing arguments: {}", err);
process::exit(1); process::exit(1);
}); });