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);
})
}
}