Skip to content

Commit 0048bc8

Browse files
committed
Merge branch 'master' of github.com-functora:functora/functora.github.io
2 parents 393264a + 8aa02c2 commit 0048bc8

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed

rust/minigrep/src/lib.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
1-
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
2-
let mut results = Vec::new();
3-
for line in contents.lines() {
4-
if line.contains(query) {
5-
results.push(line);
6-
}
7-
}
8-
results
1+
pub fn search<'a>(query: &str, contents: &'a str) -> impl Iterator<Item = &'a str> {
2+
contents.lines().filter(move |line| line.contains(query))
93
}
104

11-
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
5+
pub fn search_case_insensitive<'a>(
6+
query: &str,
7+
contents: &'a str,
8+
) -> impl Iterator<Item = &'a str> {
129
let query = query.to_lowercase();
13-
let mut results = Vec::new();
14-
for line in contents.lines() {
15-
if line.to_lowercase().contains(&query) {
16-
results.push(line);
17-
}
18-
}
19-
results
10+
contents
11+
.lines()
12+
.filter(move |line| line.to_lowercase().contains(&query))
2013
}
14+
2115
#[cfg(test)]
2216
mod tests {
2317
use super::*;
@@ -30,7 +24,10 @@ Rust:
3024
safe, fast, productive.
3125
Pick three.
3226
Duct tape.";
33-
assert_eq!(vec!["safe, fast, productive."], search(query, contents))
27+
assert_eq!(
28+
vec!["safe, fast, productive."],
29+
search(query, contents).collect::<Vec<&str>>()
30+
)
3431
}
3532

3633
#[test]
@@ -43,7 +40,7 @@ Pick three.
4340
Trust me.";
4441
assert_eq!(
4542
vec!["Rust:", "Trust me."],
46-
search_case_insensitive(query, contents)
43+
search_case_insensitive(query, contents).collect::<Vec<&str>>()
4744
)
4845
}
4946
}

rust/minigrep/src/main.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ use std::fs;
55
use std::process;
66

77
fn main() {
8-
let args: Vec<String> = env::args().collect();
9-
let config = Config::build(&args).unwrap_or_else(|e| {
8+
let config = Config::build(env::args()).unwrap_or_else(|e| {
109
eprintln!("Problem parsing args: {e}");
1110
process::exit(1);
1211
});
@@ -18,14 +17,12 @@ fn main() {
1817

1918
fn run(config: Config) -> Result<(), Box<dyn Error>> {
2019
let contents = fs::read_to_string(config.file_path)?;
21-
let results = if config.ignore_case {
22-
search_case_insensitive(&config.query, &contents)
20+
let print = |line| println!("{line}");
21+
if config.ignore_case {
22+
search_case_insensitive(&config.query, &contents).for_each(print);
2323
} else {
24-
search(&config.query, &contents)
24+
search(&config.query, &contents).for_each(print);
2525
};
26-
for line in results {
27-
println!("{line}")
28-
}
2926
Ok(())
3027
}
3128

@@ -36,12 +33,16 @@ struct Config {
3633
}
3734

3835
impl Config {
39-
fn build(args: &[String]) -> Result<Config, &'static str> {
40-
if args.len() < 3 {
41-
return Err("not enough args!");
42-
}
43-
let query = args[1].clone();
44-
let file_path = args[2].clone();
36+
fn build(mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> {
37+
args.next();
38+
let query = match args.next() {
39+
Some(arg) => arg,
40+
None => return Err("Didn't get a query string"),
41+
};
42+
let file_path = match args.next() {
43+
Some(arg) => arg,
44+
None => return Err("Didn't get a file path"),
45+
};
4546
let ignore_case = env::var("IGNORE_CASE").is_ok();
4647
Ok(Config {
4748
query,

0 commit comments

Comments
 (0)