36 lines
1.2 KiB
Rust
36 lines
1.2 KiB
Rust
use std::env;
|
|
use std::fs;
|
|
use std::io::{self, BufReader, BufRead};
|
|
use itertools::Itertools;
|
|
use timelogging::timetracking::{nearest, process_input_file, generate_individual_timecards};
|
|
|
|
fn main() {
|
|
// Process the file (stdin or file argument)
|
|
let input = env::args().nth(1);
|
|
let mut reader: Box<dyn BufRead> = match input {
|
|
None => Box::new(BufReader::new(io::stdin())),
|
|
Some(filename) => Box::new(BufReader::new(fs::File::open(filename).unwrap()))
|
|
};
|
|
|
|
// For each line of input (build internal data structures)
|
|
let (mut start, mut finish, _) = process_input_file(&mut reader);
|
|
|
|
|
|
// generate individual timecards
|
|
let (ind, gtoth) = generate_individual_timecards(&mut start, &mut finish);
|
|
|
|
// print the output
|
|
for (act, duration) in ind.iter().sorted_by_key(|x| x.0) {
|
|
let f: f64 = nearest(*duration as f64/3600.00);
|
|
let mut fhrs: String = format!("{:2}hrs", 0.08);
|
|
if f > 0.0 {
|
|
fhrs = format!("{:.2}hrs", f);
|
|
};
|
|
println!("{}", format!("{:<75}{:>10}", act.to_string(), fhrs.to_string()));
|
|
};
|
|
|
|
println!();
|
|
|
|
println!("{}", format!("Grand total: {:.2}", gtoth));
|
|
}
|