coreutiles 0.1.0

Core utils in Rust
Documentation
use std::{fs::File, io::{stdin, stdout, BufReader, Read, Write}, process};

use clap::Parser;

#[derive(Parser)]
struct Config {
    files: Vec<String>,
}

pub fn run() -> crate::Result<()> {
    let conf = Config::parse();
    if conf.files.is_empty() {
        cat("-");
    } else {
        for file in &conf.files {
            cat(file);
        }
    }
    Ok(())
}

fn cat(file: &str) {
    let mut buf = [0_u8; 1024 * 1024];
    let mut reader: Box<dyn Read> =
        if file == "-" {
            Box::new(
                BufReader::new(stdin())
            )
        } else {
            let file = File::open(file).unwrap_or_else(|_|{
                eprintln!("cat: Error reading file: {file}");
                process::exit(1);
            });
            Box::new(
                BufReader::new(file)
            )
        };
    while let Ok(n) = reader.read(&mut buf) {
        if n == 0 { break; }
        stdout().write_all(&buf[0..n]).unwrap_or_else(|err| {
            eprint!("cat: Error printing to stdout: {err}");
            process::exit(1);
        })
    }
}