dong1e_grep/
lib.rs

1use std::fs;
2use std::env;
3use std::error::Error;
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(args: &[String]) -> Result<Config, &'static str>{
13        let query = args[1].clone();
14        let filename = args[2].clone();
15        let case_sensitive = env::var("CASE_INSENSITIVE").is_err();
16        Ok(Config{query, filename, case_sensitive})
17    }
18}
19
20//case not insensitive
21pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
22    let query = query.to_lowercase();
23    let mut results = Vec::new();
24
25    for line in contents.lines() {
26        if line.to_lowercase().contains(&query) {
27            results.push(line);
28        }
29    }
30    results
31}
32
33//case insensitive
34pub fn search<'a>(query: &str, content: &'a str) -> Vec<&'a str>{
35    let mut results = Vec::new();
36
37    for line in content.lines(){
38        if line.contains(query) {
39            results.push(line);
40        }
41    }
42    results
43}
44
45
46pub fn run(config:Config) ->Result<(), Box<dyn Error>>{
47    let content = fs::read_to_string(config.filename)?;
48
49    let results = if config.case_sensitive{
50        search(&config.query, &content)
51    }else{
52        search_case_insensitive(&config.query, &content)
53    };
54    
55    for line in results{
56        println!("{}", line);
57    }
58    Ok(())
59}