rwxaegrep 0.1.0

A simple grep implemetantation from Rust Book
Documentation
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> {
        // Skip binary name
        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(),
        })
    }
}