Documentation
use std::{ fs};

pub fn run(config: Config)->Result<(),Box<dyn std::error::Error>>{
    let content= fs::read_to_string(config.filename)?;
     let qc=   if config.case_sensitive{
      search(&config.query, &content) 
    }else{
      search_ignior(&config.query, &content)
    };
    
    qc.iter().for_each(|line|println!("{}",&line));

    Ok(())
}
pub struct Config{
  pub  query: String,
  pub  filename: String,
  pub  case_sensitive: bool
}
impl Config{
  pub fn new(args: &[String])->Result<Config,&'static str>{
        if args.len()!=3{
            return Err("not enough arguments");
        }
        let query=args[1].clone();
        let filename=args[2].clone();
        let case_sensitive= std::env::var("CASE_INSENSITIVE").is_err();
        Ok(Config{query,filename,case_sensitive})
    }
    
}
pub fn search<'a>(query:&str,content:&'a str)->Vec<&'a str>{
    content.lines().filter(|line|line.contains(query)).collect()
}
pub fn search_ignior<'a>(query:&str,content:&'a str)->Vec<&'a str>{

    content.lines().filter(|line|line.to_uppercase().contains(&query.to_uppercase())).collect()
}
#[cfg(test)]
mod tests{
    use super::*;
    #[test]
    fn test_new(){
        let query="fast";
        let conetent="\
Rust:
safe,fast,productive.
Pick three.";
            assert_eq!(
                vec!["safe,fast,productive."],
                search(query, conetent)
            );
    }

    #[test]
    fn test_ne1ssw(){
        let query="fast";
        let conetent="\
Rust:
safe,Fast,productive.
Pick three.";
            assert_eq!(
                vec!["safe,Fast,productive."],
                search_ignior(query, conetent)
            );
    }
}