1use std::error::Error;
2use std::fs;
3
4pub fn run(config:Config) ->Result<(),Box<dyn Error>>{
5 let contents = fs::read_to_string(config.filename)?;
6 for line in search(&config.query, &contents){
7 println!("results :{}",line)
8 }
9 Ok(())
10}
11
12pub struct Config{
13 pub query:String,
14 pub filename:String,
15}
16
17impl Config {
18 pub fn new(args:&[String]) ->Result<Config,&'static str> {
19 if args.len() <3 {
20 return Err("not enough argments")
21 }
22 let query = args[1].clone();
23 let filename = args[2].clone();
24 Ok(Config { query, filename})
25 }
26}
27
28pub fn search<'a>(query: &str,contents:&'a str) -> Vec<&'a str>{
29
30 let mut results = Vec::new();
31
32 for line in contents.lines(){
33 if line.contains(query){
34 results.push(line);
35 }
36 }
37 results
38}
39
40#[cfg(test)]
41mod tests{
42 use super::*;
43
44 #[test]
45 fn one_result(){
46 let query = "safe,fast,ppp";
47 let contents = "\
48Rust
49safe,fast,ppp
50fasdfd";
51 assert_eq!(vec!["safe,fast,ppp"],
52 search(query,contents))
53 }
54}