tempus_cli/
lib.rs

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}