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
20pub 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
33pub 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}