use grepster::run;
use grepster::Config;
use std::env;
use std::process;
fn main() {
if env::args().len() <= 1 {
print_usage();
process::exit(1);
}
let config = Config::build(env::args()).unwrap_or_else(|err| {
eprintln!("Problem parsing arguments: {err}");
print_usage();
process::exit(1);
});
print_config(&config);
if let Err(e) = run(config) {
eprintln!("Application error: {e}");
process::exit(1);
}
}
fn print_usage() {
println!("Usage: grepster <pattern> <file1> [file2 ...]");
println!("Environment variables:");
println!(" IGNORE_CASE=1 Perform case-insensitive search");
println!(" USE_REGEX=1 Treat pattern as a regular expression");
println!(" SHOW_LINE_NUMBERS=1 Display line numbers in search results");
println!("\nExamples:");
println!(" grepster rust file.txt # Search for 'rust' in file.txt");
println!(" IGNORE_CASE=1 grepster rust *.rs # Case-insensitive search for 'rust' in .rs files");
println!(
" USE_REGEX=1 grepster '^fn\\s+\\w+' *.rs # Search for function definitions in .rs files"
);
}
fn print_config(config: &Config) {
eprintln!("Searching for: {}", config.query);
eprintln!("In file(s): {}", config.file_paths.join(", "));
eprintln!("Search options:");
eprintln!(
" Case insensitive: {}",
if config.ignore_case { "yes" } else { "no" }
);
eprintln!(
" Using regex: {}",
if config.use_regex { "yes" } else { "no" }
);
eprintln!(
" Show line numbers: {}",
if config.show_line_numbers {
"yes"
} else {
"no"
}
);
eprintln!();
}