use std::env;
use std::error::Error;
use std::fs;
use std::process;
use minigrepbk::{search, search_case_insensitive};
fn main() {
let config = Config::build(env::args()).unwrap_or_else(|err| {
eprintln!("Problem parsing args: {err}");
process::exit(1);
});
if let Err(e) = run(config) {
eprintln!("Application error: {e}");
process::exit(1)
};
}
fn run(config: Config) -> Result<(), Box<dyn Error>> {
let contents = fs::read_to_string(config.file_path)?;
println!("Query: {}", config.query);
let results: Box<dyn Iterator<Item = &str>> = if config.ignore_case {
Box::new(search_case_insensitive(&config.query, &contents))
} else {
Box::new(search(&config.query, &contents))
};
for line in results {
println!("{line}")
}
Ok(())
}
struct Config {
query: String,
file_path: String,
ignore_case: bool,
}
impl Config {
fn build(mut args: impl Iterator<Item = String> ) -> Result<Self, &'static str> {
args.next();
let query = args.next().ok_or("No query path")?;
let file_path = args.next().ok_or("No file path")?;
let ignore_case = env::var("IGNORE_CASE").is_ok();
println!("{ignore_case}");
Ok(Self { query, file_path, ignore_case })
}
}