use std::error::Error;
use std::{env, fs, process};
use rwxaegrep::{search, search_case_insensitive};
fn main() {
let config = Config::build(env::args()).unwrap_or_else(|err| {
eprintln!("Unable to parse arguments: {}", err);
process::exit(1);
});
if let Err(err) = run(config) {
eprintln!("Application error: {err}");
process::exit(1);
};
}
fn run(config: Config) -> Result<(), Box<dyn Error>> {
let contents = fs::read_to_string(&config.file_name)?;
if config.ignore_case {
let results = search_case_insensitive(&config.query, &contents);
for line in results {
println!("{line}");
}
} else {
let results = search(&config.query, &contents);
for line in results {
println!("{line}");
}
};
Ok(())
}
struct Config {
file_name: String,
query: String,
ignore_case: bool,
}
impl Config {
fn build<T>(mut args: T) -> Result<Config, &'static str>
where T: Iterator<Item = String> {
args.next();
let query = match args.next() {
Some(value) => value,
None => return Err("Query is not set")
};
let file_name = match args.next() {
Some(value) => value,
None => return Err("File path is not set")
};
Ok(Config {
query,
file_name,
ignore_case: env::var("IGNORE_CASE").is_ok(),
})
}
}