Tried to write idiomatic rust. hard to shake off being for-loop-brained.
use std::fs;
use std::process;
use std::error::Error;
use clap::Parser;
#[derive(Parser)]
struct Args {
file_path: std::path::PathBuf,
#[arg(short = 'n', long)]
line_numbers: bool,
}
fn get_lines(args: &Args) -> Result<Vec<String>, Box<dyn Error>> {
let contents = fs::read_to_string(&args.file_path)?;
let results = if args.line_numbers {
contents
.lines()
.enumerate()
.map(|(i, line)| format!("{:>6}\t{line}", i+1))
.collect()
} else {
contents
.lines()
.map(|line| format!("{line}"))
.collect()
};
Ok(results)
}
fn main() {
let args = Args::parse();
let results = get_lines(&args);
let _ = match results {
Ok(lines) => {
for line in lines {
println!("{line}");
}
},
Err(e) => {
eprintln!("An error occured: {e}");
process::exit(1);
}
};
}