Skip to main content

minigrep_fsdevon/
lib.rs

1use std::env;
2use std::error::Error;
3use std::fs;
4
5pub struct Config {
6  pub query: String,
7  pub filename: String,
8  pub case_sensitive: bool,
9}
10
11impl Config {
12  pub fn new(mut args: std::env::Args) -> Result<Config, &'static str> {
13    args.next();
14
15    let query = match args.next() {
16      Some(arg) => arg,
17      None => return Err("Didn't get a query string"),
18    };
19
20    let filename = match args.next() {
21      Some(arg) => arg,
22      None => return Err("Didn't get a file name"),
23    };
24
25    let case_sensitive = env::var("CASE_INSENSITIVE").is_err();
26
27    Ok(Config {
28      query,
29      filename,
30      case_sensitive,
31    })
32  }
33}
34
35pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
36  let contents = fs::read_to_string(config.filename)?;
37
38  let results = if config.case_sensitive {
39    search(&config.query, &contents)
40  } else {
41    search_case_insensitive(&config.query, &contents)
42  };
43
44  for line in results {
45    println!("{}", line);
46  }
47  Ok(())
48}
49
50pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
51  contents
52    .lines()
53    .filter(|line| line.contains(query))
54    .collect()
55}
56
57pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
58  let query = query.to_lowercase();
59
60  contents
61    .lines()
62    .filter(|line| line.to_lowercase().contains(&query))
63    .collect()
64}
65
66#[cfg(test)]
67mod tests {
68  use super::*;
69
70  #[test]
71  fn one_result() {
72    let query = "duct";
73    let contents = "\
74Rust:
75safe, fast, productive.
76Pick three.
77Duct tape.";
78
79    assert_eq!(vec!["safe, fast, productive."], search(query, contents));
80  }
81}
82
83#[test]
84fn case_insensitive() {
85  let query = "rUsT";
86  let contents = "\
87Rust:
88safe, fast, productive.
89Pick three.
90Trust me.";
91
92  assert_eq!(
93    vec!["Rust:", "Trust me."],
94    search_case_insensitive(query, contents)
95  );
96}