tomato_timer 0.2.1

A simple tomato timer
Documentation
#![warn(clippy::all, rust_2018_idioms)]

mod app;
mod colors;
mod sounds;
use sounds::{finish_sound, start_sound};
use std::{
    thread,
    time::{Duration, SystemTime},
};

pub use app::{TimerStatus, TomatoTimer};

pub fn get_elapsed_time(status: &TimerStatus) -> f32 {
    let current_time = SystemTime::now();
    match status {
        TimerStatus::Running(start_time) => current_time
            .duration_since(*start_time)
            .unwrap()
            .as_secs_f32(),
        TimerStatus::Break(break_start) => current_time
            .duration_since(*break_start)
            .unwrap()
            .as_secs_f32(),
        _ => 0.0,
    }
}

pub fn get_remaining_time(status: &TimerStatus, time_per_round: &f32, time_per_break: &f32) -> f32 {
    let elapsed_time = get_elapsed_time(status);
    match status {
        TimerStatus::Running(_) => (*time_per_round * 60.0) - elapsed_time,
        TimerStatus::Break(_) => (*time_per_break * 60.0) - elapsed_time,
        _ => 0.0,
    }
}

pub fn get_is_round_complete(
    status: &TimerStatus,
    time_per_round: &f32,
    time_per_break: &f32,
) -> bool {
    let remaining_time = get_remaining_time(status, time_per_round, time_per_break);
    remaining_time <= 0.0
}

pub fn handle_round_complete(status: &mut TimerStatus, round_complete: bool) {
    if round_complete {
        match status {
            TimerStatus::Running(_) => {
                notifica::notify("Time is up!", "Take a break").expect("Failed to notify");
                *status = TimerStatus::Break(SystemTime::now());
                thread::spawn(|| {
                    finish_sound();
                });
            }
            TimerStatus::Break(_) => {
                notifica::notify("Back to work!", "Start focusing again :)")
                    .expect("Failed to notify");
                *status = TimerStatus::Running(SystemTime::now());
                thread::spawn(|| {
                    start_sound();
                });
            }
            _ => {}
        }
    }
}

pub fn display_time_remaining(remaining_time: f32) -> String {
    match remaining_time as u32 {
        60..=u32::MAX => format!(
            "{} Minutes left in round",
            (Duration::from_secs_f32(remaining_time).as_secs() / 60) + 1
        ),
        1..=59 => format!(
            "{} Seconds left in round",
            Duration::from_secs_f32(remaining_time).as_secs()
        ),
        _ => format!("Time is up!"),
    }
}