Improve code quality

This commit is contained in:
Rekai Nyangadzayi Musuka 2020-08-23 22:27:49 -05:00
parent 8a1f2d9081
commit 68ec6883b7
3 changed files with 100 additions and 95 deletions

20
Cargo.lock generated
View File

@ -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]]

View File

@ -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);
} }

View File

@ -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)
}
}
}