use std::fs::File;
use std::io::{BufRead, BufReader};
use readahead_iterator::IntoReadahead;
pub fn main() {
let args = std::env::args();
if args.len() <= 1 {
println!("usage: line_count_files FILE...");
return;
}
let filenames: Vec<String> = args.skip(1).collect();
let total_lines: usize = filenames
.into_iter()
.filter_map(|filename| {
File::open(filename.clone())
.map_err(|err| eprintln!("failed to open {}: {:?}", filename, err))
.map(|file| (filename, file))
.ok()
})
.readahead(5)
.map(|(filename, file)| {
if file.metadata().expect("failed to get metadata").is_file() {
let line_count = BufReader::new(file).lines().count();
println!("{:>8} {}", line_count, filename);
line_count
} else {
0
}
})
.sum();
println!();
println!("{:>8} TOTAL", total_lines);
}