Skip to content

Commit 1a47643

Browse files
committed
implement the minigrep project with basic features
1 parent 961a0b5 commit 1a47643

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

projects/minigrep/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "minigrep"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

projects/minigrep/src/lib.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
use std::{ error::Error, fs, vec };
2+
3+
pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
4+
let contents = fs::read_to_string(&config.filepath)?;
5+
6+
search(&config.query, &contents)
7+
.iter()
8+
.for_each(|line| { println!("{line}") });
9+
10+
Ok(())
11+
}
12+
13+
#[derive(Debug)]
14+
pub struct Config {
15+
query: String,
16+
filepath: String,
17+
}
18+
19+
impl Config {
20+
pub fn build(mut args: Vec<String>) -> Result<Config, &'static str> {
21+
if args.len() < 3 {
22+
return Err("Not Enough Arguments");
23+
}
24+
let query = args.remove(1);
25+
let filepath = args.remove(1);
26+
27+
Ok(Config {
28+
query,
29+
filepath,
30+
})
31+
}
32+
}
33+
34+
fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
35+
let mut results = vec![];
36+
37+
contents.lines().for_each(|line| {
38+
if line.contains(query) {
39+
results.push(line);
40+
}
41+
});
42+
43+
results
44+
}
45+
46+
#[cfg(test)]
47+
mod tests {
48+
use super::*;
49+
50+
#[test]
51+
fn none_result() {
52+
let query = "threee";
53+
let contents = "\
54+
Rust:
55+
safe, fast, productive.
56+
Pick three.";
57+
58+
assert_eq!(vec![] as Vec<&str>, search(query, contents))
59+
}
60+
61+
#[test]
62+
fn one_result() {
63+
let query = "duct";
64+
let contents = "\
65+
Rust:
66+
safe, fast, productive.
67+
Pick three.";
68+
69+
assert_eq!(vec!["safe, fast, productive."], search(query, contents))
70+
}
71+
72+
#[test]
73+
fn two_result() {
74+
let query = "i";
75+
let contents = "\
76+
Rust:
77+
safe, fast, productive.
78+
Pick three.";
79+
80+
assert_eq!(vec!["safe, fast, productive.", "Pick three."], search(query, contents))
81+
}
82+
}

projects/minigrep/src/main.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use std::{ env, process };
2+
3+
use minigrep::Config;
4+
5+
fn main() {
6+
let args: Vec<String> = env::args().collect();
7+
8+
let config: Config = Config::build(args).unwrap_or_else(|err| {
9+
println!("Problem parsing arguments: {err}");
10+
process::exit(1);
11+
});
12+
13+
if let Err(e) = minigrep::run(config) {
14+
println!("Application error: {e}");
15+
process::exit(1);
16+
}
17+
}

0 commit comments

Comments
 (0)