2023-07-29 12:15:19 +02:00
|
|
|
use std::{fmt::Display, time::Duration};
|
|
|
|
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
|
|
|
use crate::daemon::Timer;
|
|
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
|
|
pub struct Pomodoro {
|
|
|
|
work: Duration,
|
|
|
|
pause: Duration,
|
|
|
|
long_pause: Duration,
|
|
|
|
pauses_till_long: u64,
|
|
|
|
pauses: u64,
|
|
|
|
status: Status,
|
|
|
|
pub timer: Timer,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Display for Pomodoro {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
write!(
|
|
|
|
f,
|
2023-07-29 12:52:50 +02:00
|
|
|
"Pomodoro ({}, {}, {}) currently {} with {} remaining.",
|
|
|
|
humantime::format_duration(self.work),
|
|
|
|
humantime::format_duration(self.pause),
|
|
|
|
humantime::format_duration(self.long_pause),
|
2023-07-29 12:15:19 +02:00
|
|
|
self.status,
|
2023-07-29 12:52:50 +02:00
|
|
|
humantime::format_duration(self.timer.remaining())
|
2023-07-29 12:15:19 +02:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
|
|
enum Status {
|
|
|
|
Working,
|
|
|
|
Pausing,
|
2023-07-29 12:52:50 +02:00
|
|
|
LongPause,
|
2023-07-29 12:15:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Display for Status {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
match self {
|
2023-07-29 15:56:31 +02:00
|
|
|
Status::Working => write!(f, "work"),
|
|
|
|
Status::Pausing => write!(f, "pause"),
|
|
|
|
Status::LongPause => write!(f, "long pause"),
|
2023-07-29 12:15:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Pomodoro {
|
|
|
|
pub fn new(
|
|
|
|
work: Duration,
|
|
|
|
pause: Duration,
|
|
|
|
long_pause: Duration,
|
|
|
|
pauses_till_long: u64,
|
|
|
|
) -> Self {
|
|
|
|
Pomodoro {
|
|
|
|
work,
|
|
|
|
pause,
|
|
|
|
long_pause,
|
|
|
|
pauses_till_long,
|
|
|
|
pauses: 0,
|
|
|
|
status: Status::Working,
|
|
|
|
timer: Timer::new(Status::Working.to_string().into_boxed_str(), work),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn handle_expiration(&mut self, notify: bool) {
|
|
|
|
self.timer.handle_expiration(notify);
|
|
|
|
let duration = match self.status {
|
|
|
|
Status::Working => {
|
|
|
|
if self.pauses == self.pauses_till_long {
|
|
|
|
self.long_pause
|
|
|
|
} else {
|
|
|
|
self.pause
|
|
|
|
}
|
|
|
|
}
|
2023-07-29 12:52:50 +02:00
|
|
|
_ => self.work,
|
2023-07-29 12:15:19 +02:00
|
|
|
};
|
|
|
|
self.status = match self.status {
|
|
|
|
Status::Working => {
|
2023-07-29 16:11:25 +02:00
|
|
|
if self.pauses == self.pauses_till_long {
|
|
|
|
self.pauses = 0;
|
|
|
|
Status::LongPause
|
|
|
|
} else {
|
|
|
|
self.pauses += 1;
|
|
|
|
Status::Pausing
|
|
|
|
}
|
2023-07-29 12:15:19 +02:00
|
|
|
}
|
2023-07-29 12:52:50 +02:00
|
|
|
_ => Status::Working,
|
2023-07-29 12:15:19 +02:00
|
|
|
};
|
|
|
|
self.timer = Timer::new(self.status.to_string().into_boxed_str(), duration);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn is_expired(&self) -> bool {
|
|
|
|
self.timer.is_expired()
|
|
|
|
}
|
|
|
|
}
|