74 lines
2.5 KiB
Rust
74 lines
2.5 KiB
Rust
use std::env;
|
|
use std::fs;
|
|
use std::io::{BufReader, BufRead, ErrorKind};
|
|
use regex::Regex;
|
|
use chrono::{Datelike, Duration, offset::Local, NaiveDate, Weekday};
|
|
use timelogging::timetracking::{process_input_file, generate_individual_timecards};
|
|
|
|
fn main() {
|
|
|
|
// Regular Expressions
|
|
let offset = Regex::new(r"^[+-]*\d+").unwrap();
|
|
|
|
// Process options
|
|
let params: Vec<String> = env::args().collect();
|
|
|
|
// If week offset is provided, grab it
|
|
let mut week_offset: i64 = 0;
|
|
for arg in ¶ms {
|
|
if offset.is_match(&arg.to_string()) {
|
|
week_offset = arg.parse::<i64>().unwrap();
|
|
};
|
|
};
|
|
|
|
let day: NaiveDate = last_monday(week_offset);
|
|
let mut filenames: Vec<String> = Vec::new();
|
|
for d in 0..7 {
|
|
filenames.push((day + Duration::days(d)).format("%Y-%m-%d.log").to_string());
|
|
};
|
|
|
|
assert_eq!(filenames.len(), 7);
|
|
|
|
let mut grand_total: f64 = 0.0;
|
|
for filename in filenames {
|
|
println!("{} ", filename);
|
|
// Process the file
|
|
let mut gtoth = match fs::File::open(filename) {
|
|
Ok(file) => {
|
|
// Hash Maps (akin to Python Dictionaires)
|
|
let mut reader: Box<dyn BufRead> = Box::new(BufReader::new(file));
|
|
// For each line of input (build internal data structures)
|
|
let (mut start, mut finish, _) = process_input_file(&mut reader);
|
|
// generate total for this file
|
|
let (_, total) = generate_individual_timecards(&mut start, &mut finish);
|
|
total
|
|
},
|
|
Err(error) => match error.kind() {
|
|
ErrorKind::NotFound => 0.0,
|
|
_ => panic!("Error reading file! Error: {}", error)
|
|
}
|
|
};
|
|
if gtoth > 24.0 {
|
|
gtoth = 24.0;
|
|
};
|
|
// print the output
|
|
println!("{}", format!("{:.2}", gtoth));
|
|
println!();
|
|
grand_total += gtoth;
|
|
};
|
|
println!("Grand total: {:.2}", grand_total);
|
|
}
|
|
|
|
fn last_monday(offset: i64) -> NaiveDate {
|
|
let day: NaiveDate = Local::today().naive_local() - Duration::days(7 * offset);
|
|
match day.weekday() {
|
|
Weekday::Mon => day - Duration::days(0),
|
|
Weekday::Tue => day - Duration::days(1),
|
|
Weekday::Wed => day - Duration::days(2),
|
|
Weekday::Thu => day - Duration::days(3),
|
|
Weekday::Fri => day - Duration::days(4),
|
|
Weekday::Sat => day - Duration::days(5),
|
|
Weekday::Sun => day - Duration::days(6)
|
|
}
|
|
}
|