1extern crate chrono;
2
3pub mod session;
4pub mod times;
5pub mod utils;
6
7use session::{Session, SessionStatus};
8use times::{DateRange, Times};
9
10use std::path::Path;
11
12const TEMPUS_DIR_NAME: &str = "/tempus/";
13const SESSION_NAME: &str = ".session";
14const TEMPUS_LOG_NAME: &str = "tempus_log.txt";
15
16fn get_project_dir_path(project: &str) -> String {
17 format!(
18 "{}/{}/{}",
19 utils::get_home_dir(),
20 &TEMPUS_DIR_NAME,
21 &project
22 )
23}
24
25pub fn print_total_log_time(project: &str, date_range: &Option<DateRange>) {
26 let log_file_path_str = format!("{}/{}", get_project_dir_path(project), &TEMPUS_LOG_NAME);
27 let log_file_path = Path::new(&log_file_path_str);
28
29 let contents = utils::get_file_contents(&log_file_path);
30 let times = Times::new(&contents, date_range);
31
32 let total_length_hours = times.fold(0.0, |sum, DateRange(start, end)| {
33 sum + utils::get_length_hours(&start, &end)
34 });
35
36 println!("{:.3}", total_length_hours);
37}
38
39pub fn do_session(project: &str) {
40 let project_dir_path = get_project_dir_path(project);
41 utils::create_dir(&project_dir_path);
42
43 let mut session = Session::new(&project_dir_path, SESSION_NAME);
44 match session.status {
45 SessionStatus::Started(start_time) => {
46 let end_time = session.end();
47 session.record(&TEMPUS_LOG_NAME);
48
49 let length_hours = format!("{:.3}", utils::get_length_hours(&start_time, &end_time));
50
51 println!("{} session ended: {} hours.", &project, &length_hours);
52 }
53 SessionStatus::NotStarted => {
54 let start_time = session.start();
55 println!(
56 "{} session started at {}.",
57 &project,
58 utils::datetime_to_readable_str(&start_time)
59 );
60 }
61 };
62}
63
64pub fn delete_session(project: &str) {
65 let project_dir_path = get_project_dir_path(project);
66
67 let mut session = Session::new(&project_dir_path, SESSION_NAME);
68 match session.status {
69 SessionStatus::Started(_) => {
70 let end_time = session.end();
71
72 println!(
73 "{} session ended at {} and deleted.",
74 &project,
75 utils::datetime_to_readable_str(&end_time)
76 );
77 }
78 SessionStatus::NotStarted => {
79 eprintln!("No session started for {}.", &project);
80 }
81 };
82}
83
84pub fn print_session_start(project: &str) {
85 let project_dir_path = get_project_dir_path(project);
86
87 let session = Session::new(&project_dir_path, SESSION_NAME);
88 match session.status {
89 SessionStatus::Started(start_time) => {
90 println!("{}", utils::datetime_to_readable_str(&start_time))
91 }
92 SessionStatus::NotStarted => eprintln!("No session started for {}.", project),
93 };
94}
95
96pub fn print_log(project: &str, date_range: &Option<DateRange>) {
97 let log_file_path_str = format!("{}/{}", get_project_dir_path(project), &TEMPUS_LOG_NAME);
98 let log_file_path = Path::new(&log_file_path_str);
99
100 let contents = utils::get_file_contents(&log_file_path);
101 let times = Times::new(&contents, date_range);
102
103 for DateRange(start, end) in times {
104 println!(
105 "{}, {}",
106 utils::datetime_to_readable_str(&start),
107 utils::datetime_to_readable_str(&end)
108 );
109 }
110}
111
112pub fn exit(msg: &str) -> ! {
113 eprintln!("{}", msg);
114 std::process::exit(1);
115}