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)
);
}
}