Improve code quality
This commit is contained in:
parent
8a1f2d9081
commit
68ec6883b7
|
@ -56,9 +56,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.0.0"
|
version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
|
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "base64"
|
name = "base64"
|
||||||
|
@ -123,9 +123,9 @@ checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.58"
|
version = "1.0.59"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518"
|
checksum = "66120af515773fb005778dc07c261bd201ec8ce50bd6e7144c927753fe013381"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cexpr"
|
name = "cexpr"
|
||||||
|
@ -452,9 +452,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.74"
|
version = "0.2.76"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a2f02823cf78b754822df5f7f268fb59822e7296276d3e069d8e8cb26a14bd10"
|
checksum = "755456fae044e6fa1ebbbd1b3e902ae19e73097ed4ed87bb79934a867c007bc3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libdbus-sys"
|
name = "libdbus-sys"
|
||||||
|
@ -821,7 +821,7 @@ checksum = "609feed1d0a73cc36a0182a840a9b37b4a82f0b1150369f0536a9e3f2a31dc48"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.38",
|
"syn 1.0.39",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -921,9 +921,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.38"
|
version = "1.0.39"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e69abc24912995b3038597a7a593be5053eb0fb44f3cc5beec0deb421790c1f4"
|
checksum = "891d8d6567fe7c7f8835a3a98af4208f3846fba258c1bc3c31d6e506239f11f9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
|
@ -965,7 +965,7 @@ checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.38",
|
"syn 1.0.39",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
39
src/main.rs
39
src/main.rs
|
@ -4,7 +4,7 @@ use crossterm::{
|
||||||
event::{poll, read, Event, KeyCode, KeyEvent, KeyModifiers},
|
event::{poll, read, Event, KeyCode, KeyEvent, KeyModifiers},
|
||||||
terminal::{disable_raw_mode, enable_raw_mode},
|
terminal::{disable_raw_mode, enable_raw_mode},
|
||||||
};
|
};
|
||||||
use domasi::pomodoro::{Alert, Clock, Status};
|
use domasi::pomodoro::{Alert, Remaining, Status};
|
||||||
use domasi::{Config, Pomodoro};
|
use domasi::{Config, Pomodoro};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
@ -12,9 +12,9 @@ use std::path::{Path, PathBuf};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let matches = App::new("Domasi")
|
let matches = App::new("domasi")
|
||||||
.version("0.1.0")
|
.version("0.1.0")
|
||||||
.author("paoda <musukarekai@gmail.com>")
|
.author("Rekai Musuka <rekai@musuka.dev>")
|
||||||
.about("Yet another pomodoro timer.")
|
.about("Yet another pomodoro timer.")
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("create-config")
|
Arg::with_name("create-config")
|
||||||
|
@ -91,7 +91,10 @@ pub fn start(args: &ArgMatches) {
|
||||||
thread::spawn(move || loop {
|
thread::spawn(move || loop {
|
||||||
if let Ok(status) = rx.recv() {
|
if let Ok(status) = rx.recv() {
|
||||||
loop {
|
loop {
|
||||||
let (remain, text) = Clock::get_formatted_string(status);
|
let (text, remain) = match Remaining::from_status(status) {
|
||||||
|
Some(seconds) => (seconds.to_string(), seconds.remaining_secs()),
|
||||||
|
None => ("??? Status: ??:??".to_string(), 0),
|
||||||
|
};
|
||||||
|
|
||||||
let out = io::stdout();
|
let out = io::stdout();
|
||||||
let mut handle = out.lock();
|
let mut handle = out.lock();
|
||||||
|
@ -103,7 +106,7 @@ pub fn start(args: &ArgMatches) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread::sleep(Clock::get_polling_interval());
|
thread::sleep(Remaining::polling_interval());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -153,38 +156,28 @@ pub fn start(args: &ArgMatches) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_audio_file(items: std::fs::ReadDir) -> Option<PathBuf> {
|
fn get_audio_file(items: std::fs::ReadDir) -> Option<PathBuf> {
|
||||||
let mut result: Option<PathBuf> = None;
|
|
||||||
|
|
||||||
for maybe_entry in items {
|
for maybe_entry in items {
|
||||||
match maybe_entry {
|
if let Ok(entry) = maybe_entry {
|
||||||
Ok(entry) => match entry.path().extension() {
|
if let Some(ext) = entry.path().extension() {
|
||||||
Some(ext) => match ext.to_str() {
|
if let Some("mp3") | Some("wav") | Some("ogg") | Some("flac") = ext.to_str() {
|
||||||
Some("mp3") | Some("wav") | Some("ogg") | Some("flac") => {
|
return Some(entry.path());
|
||||||
result = Some(entry.path());
|
}
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
_ => continue,
|
|
||||||
},
|
|
||||||
None => continue,
|
|
||||||
},
|
|
||||||
Err(_err) => continue,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_user_input() -> crossterm::Result<()> {
|
fn setup_user_input() -> crossterm::Result<()> {
|
||||||
enable_raw_mode()?;
|
enable_raw_mode()?;
|
||||||
|
|
||||||
get_user_input()?;
|
get_user_input()?;
|
||||||
|
|
||||||
disable_raw_mode()
|
disable_raw_mode()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_user_input() -> crossterm::Result<()> {
|
fn get_user_input() -> crossterm::Result<()> {
|
||||||
loop {
|
loop {
|
||||||
if poll(Clock::get_polling_interval())? {
|
if poll(Remaining::polling_interval())? {
|
||||||
if let Event::Key(event) = read()? {
|
if let Event::Key(event) = read()? {
|
||||||
handle_key_event(event);
|
handle_key_event(event);
|
||||||
}
|
}
|
||||||
|
|
136
src/pomodoro.rs
136
src/pomodoro.rs
|
@ -1,6 +1,7 @@
|
||||||
use super::Config;
|
use super::Config;
|
||||||
use crossbeam::channel::Sender;
|
use crossbeam::channel::Sender;
|
||||||
use rodio::{Decoder, Device, Source};
|
use rodio::{Decoder, Device, Source};
|
||||||
|
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
@ -32,6 +33,7 @@ impl<'a> Alert<'a> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub enum State {
|
pub enum State {
|
||||||
Work,
|
Work,
|
||||||
|
@ -75,7 +77,7 @@ impl<'a> Pomodoro {
|
||||||
alert.play();
|
alert.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
Self::notify(&self.state);
|
let _ = Self::notify(&self.state);
|
||||||
|
|
||||||
match self.state {
|
match self.state {
|
||||||
State::Work => {
|
State::Work => {
|
||||||
|
@ -138,32 +140,24 @@ impl Pomodoro {
|
||||||
tx.send(status).unwrap();
|
tx.send(status).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn notify(state: &State) {
|
fn notify(state: &State) -> Result<(), anyhow::Error> {
|
||||||
let mut toast = notify_rust::Notification::new();
|
let mut toast = notify_rust::Notification::new();
|
||||||
|
|
||||||
match state {
|
match state {
|
||||||
State::Work => {
|
State::Work => toast
|
||||||
toast
|
.summary("Time to Work!")
|
||||||
.summary("Time to Work!")
|
.body("Remember to stay focused!")
|
||||||
.body("Remember to stay focused!")
|
.show()?,
|
||||||
.show()
|
State::ShortBreak | State::LongBreak => toast
|
||||||
.unwrap();
|
.summary("Break Time!")
|
||||||
}
|
.body("Enjoy your well deserved rest!")
|
||||||
State::ShortBreak | State::LongBreak => {
|
.show()?,
|
||||||
toast
|
State::Inactive => toast
|
||||||
.summary("Break Time!")
|
.summary("Pomodoro Cycle Complete.")
|
||||||
.body("Enjoy your well deserved rest!")
|
.body("Now waiting for user input....")
|
||||||
.show()
|
.show()?,
|
||||||
.unwrap();
|
};
|
||||||
}
|
|
||||||
State::Inactive => {
|
Ok(())
|
||||||
toast
|
|
||||||
.summary("Pomodoro Cycle Complete.")
|
|
||||||
.body("Now waiting for user input....")
|
|
||||||
.show()
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,54 +168,72 @@ pub struct Status {
|
||||||
pub state: State,
|
pub state: State,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Clock;
|
pub struct Remaining {
|
||||||
|
state: State,
|
||||||
|
remaining: u64,
|
||||||
|
seconds: u64,
|
||||||
|
hours: u64,
|
||||||
|
minutes: u64,
|
||||||
|
}
|
||||||
|
|
||||||
impl Clock {
|
impl Remaining {
|
||||||
pub fn get_formatted_string(status: Status) -> (u64, String) {
|
pub fn from_status(status: Status) -> Option<Self> {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
let elapsed = now.checked_duration_since(status.start);
|
let maybe_elapsed = now.checked_duration_since(status.start);
|
||||||
|
|
||||||
match elapsed {
|
match maybe_elapsed {
|
||||||
Some(duration) => {
|
Some(duration) => {
|
||||||
let remaining = status.length.as_secs() - duration.as_secs();
|
let remaining = status.length.as_secs() - duration.as_secs();
|
||||||
|
|
||||||
let seconds = remaining;
|
let hours = remaining / 3600;
|
||||||
let hours = seconds / 3600;
|
let minutes = (remaining - (hours * 3600)) / 60;
|
||||||
let minutes = (seconds - (hours * 3600)) / 60;
|
let seconds = remaining - (hours * 3600) - (minutes * 60);
|
||||||
let seconds = seconds - (hours * 3600) - (minutes * 60);
|
|
||||||
|
|
||||||
let mut clock = "\r".to_string();
|
Some(Self {
|
||||||
|
state: status.state,
|
||||||
clock.push_str(&format!("{}", status.state));
|
remaining,
|
||||||
|
hours,
|
||||||
if hours > 0 {
|
minutes,
|
||||||
// We don't want o bother with the hours part if there is none
|
seconds,
|
||||||
if hours < 10 {
|
})
|
||||||
clock.push_str(&format!("0{}:", hours));
|
|
||||||
} else {
|
|
||||||
clock.push_str(&format!("{}:", hours));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if minutes < 10 {
|
|
||||||
clock.push_str(&format!("0{}:", minutes));
|
|
||||||
} else {
|
|
||||||
clock.push_str(&format!("{}:", minutes));
|
|
||||||
}
|
|
||||||
|
|
||||||
if seconds < 10 {
|
|
||||||
clock.push_str(&format!("0{}", seconds));
|
|
||||||
} else {
|
|
||||||
clock.push_str(&format!("{}", seconds));
|
|
||||||
}
|
|
||||||
|
|
||||||
(remaining, clock)
|
|
||||||
}
|
}
|
||||||
None => (0, "??:??:??".to_string()), // This will break the loop
|
None => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_polling_interval() -> Duration {
|
pub fn remaining_secs(&self) -> u64 {
|
||||||
|
self.remaining
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn polling_interval() -> Duration {
|
||||||
Duration::from_millis(500)
|
Duration::from_millis(500)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Display for Remaining {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
|
||||||
|
f.write_str("\r")?;
|
||||||
|
write!(f, "{}", self.state)?;
|
||||||
|
|
||||||
|
if self.hours > 0 {
|
||||||
|
// No need to print the hours if there are none.
|
||||||
|
if self.hours < 10 {
|
||||||
|
write!(f, "0{}:", self.hours)?;
|
||||||
|
} else {
|
||||||
|
write!(f, "{}:", self.hours)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.minutes < 10 {
|
||||||
|
write!(f, "0{}:", self.minutes)?;
|
||||||
|
} else {
|
||||||
|
write!(f, "{}:", self.minutes)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.seconds < 10 {
|
||||||
|
write!(f, "0{}", self.seconds)
|
||||||
|
} else {
|
||||||
|
write!(f, "{}", self.seconds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue