diff --git a/Cargo.lock b/Cargo.lock index 68dfc98..344a89f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,12 +19,6 @@ dependencies = [ "winapi 0.3.8", ] -[[package]] -name = "arc-swap" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" - [[package]] name = "arrayref" version = "0.3.6" @@ -37,6 +31,41 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" +[[package]] +name = "async-std" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" +dependencies = [ + "async-task", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "futures-core", + "futures-io", + "futures-timer", + "kv-log-macro", + "log", + "memchr", + "mio", + "mio-uds", + "num_cpus", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "async-task" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" +dependencies = [ + "libc", + "winapi 0.3.8", +] + [[package]] name = "atty" version = "0.2.14" @@ -97,24 +126,12 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -[[package]] -name = "bytes" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" - [[package]] name = "cc" version = "1.0.54" @@ -136,17 +153,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -[[package]] -name = "chrono" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" -dependencies = [ - "num-integer", - "num-traits", - "time", -] - [[package]] name = "clang-sys" version = "0.29.3" @@ -227,6 +233,42 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "crossbeam-channel" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" +dependencies = [ + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -239,21 +281,22 @@ dependencies = [ ] [[package]] -name = "dbus" -version = "0.6.5" +name = "directories" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48b5f0f36f1eebe901b0e6bee369a77ed3396334bf3f09abd46454a576f71819" +checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" dependencies = [ - "libc", - "libdbus-sys", + "cfg-if", + "dirs-sys", ] [[package]] -name = "dirs" -version = "1.0.5" +name = "dirs-sys" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" dependencies = [ + "cfg-if", "libc", "redox_users", "winapi 0.3.8", @@ -263,19 +306,12 @@ dependencies = [ name = "domasi" version = "0.1.0" dependencies = [ + "async-std", "clap", - "lazy_static", - "notify-rust", + "directories", "rodio", - "tokio", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -298,6 +334,18 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" +[[package]] +name = "futures-io" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" + +[[package]] +name = "futures-timer" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" + [[package]] name = "getrandom" version = "0.1.14" @@ -349,6 +397,15 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "kv-log-macro" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2d3beed37e5483887d81eb39de6de03a8346531410e1306ca48a9a89bd3a51" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -378,15 +435,6 @@ version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" -[[package]] -name = "libdbus-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc12a3bc971424edbbf7edaf6e5740483444db63aa8e23d3751ff12a30f306f0" -dependencies = [ - "pkg-config", -] - [[package]] name = "libloading" version = "0.5.2" @@ -406,18 +454,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "mac-notification-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" -dependencies = [ - "cc", - "chrono", - "dirs", - "objc-foundation", -] - [[package]] name = "mach" version = "0.3.2" @@ -428,13 +464,10 @@ dependencies = [ ] [[package]] -name = "malloc_buf" -version = "0.0.6" +name = "maybe-uninit" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" @@ -442,6 +475,15 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +[[package]] +name = "memoffset" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +dependencies = [ + "autocfg", +] + [[package]] name = "minimp3" version = "0.3.5" @@ -474,24 +516,12 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow 0.2.1", + "miow", "net2", "slab", "winapi 0.2.8", ] -[[package]] -name = "mio-named-pipes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" -dependencies = [ - "log", - "mio", - "miow 0.3.4", - "winapi 0.3.8", -] - [[package]] name = "mio-uds" version = "0.6.8" @@ -515,16 +545,6 @@ dependencies = [ "ws2_32-sys", ] -[[package]] -name = "miow" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22dfdd1d51b2639a5abd17ed07005c3af05fb7a2a3b1a1d0d7af1000a520c1c7" -dependencies = [ - "socket2", - "winapi 0.3.8", -] - [[package]] name = "net2" version = "0.2.34" @@ -546,26 +566,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "notify-rust" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8da29142be3f71b2165a6b3991c26045b674edbf04cdfc42f323094fc3e4b5a" -dependencies = [ - "dbus", - "mac-notification-sys", -] - -[[package]] -name = "num-integer" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -dependencies = [ - "autocfg", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.11" @@ -585,35 +585,6 @@ dependencies = [ "libc", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - [[package]] name = "ogg" version = "0.7.0" @@ -623,6 +594,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "once_cell" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -635,6 +612,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.17" @@ -723,22 +706,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "shlex" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" -[[package]] -name = "signal-hook-registry" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" -dependencies = [ - "arc-swap", - "libc", -] - [[package]] name = "slab" version = "0.4.2" @@ -756,18 +735,6 @@ dependencies = [ "winapi 0.3.8", ] -[[package]] -name = "socket2" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "winapi 0.3.8", -] - [[package]] name = "stdweb" version = "0.1.3" @@ -820,57 +787,12 @@ dependencies = [ "syn", ] -[[package]] -name = "time" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -dependencies = [ - "libc", - "winapi 0.3.8", -] - [[package]] name = "tinyvec" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53953d2d3a5ad81d9f844a32f14ebb121f50b650cd59d0ee2a07cf13c617efed" -[[package]] -name = "tokio" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "iovec", - "lazy_static", - "libc", - "memchr", - "mio", - "mio-named-pipes", - "mio-uds", - "num_cpus", - "pin-project-lite", - "signal-hook-registry", - "slab", - "tokio-macros", - "winapi 0.3.8", -] - -[[package]] -name = "tokio-macros" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "unicode-width" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index be7da10..9ef32a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "0.2.21", features = ["full"] } rodio = "0.11.0" clap = "2.33.1" -notify-rust = "3.6.3" -lazy_static = "1.4.0" +directories = "2.0.2" +async-std = "1.5.0" diff --git a/src/lib.rs b/src/lib.rs index 77d1576..c612b04 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,38 @@ pub use pomodoro::Pomodoro; pub mod pomodoro { + use directories::ProjectDirs; + use rodio::{Decoder, Device, Source}; + use std::fs::{self, File}; + use std::io::BufReader; + use std::path::{Path, PathBuf}; + + #[derive(Copy, Clone)] + pub struct Alert<'a> { + path: &'a Path, + device: &'a Device, + } + + impl Alert<'_> { + pub fn new<'a, P: AsRef>(path: &'a P, device: &'a Device) -> Alert<'a> { + Alert { + path: path.as_ref(), + device, + } + } + + pub fn load<'a, 'b, P: AsRef>(&'a mut self, _path: &'b P) { + unimplemented!() + } + + pub fn play(&self) { + let file = File::open(self.path).unwrap(); + let source = Decoder::new(BufReader::new(file)).unwrap(); + + rodio::play_raw(self.device, source.convert_samples()); + } + } + #[derive(PartialEq, Eq)] pub enum State { Work, @@ -13,33 +45,43 @@ pub mod pomodoro { pub work_time: u64, pub short_break: u64, pub long_break: u64, + pub data_directory: PathBuf, } impl Default for Config { fn default() -> Self { + let dirs = ProjectDirs::from("moe", "paoda", "domasi").unwrap(); + + let data_directory = dirs.data_dir().to_owned(); + + if !data_directory.exists() { + fs::create_dir_all(&data_directory).unwrap(); + } + Config { work_time: 1, short_break: 1, long_break: 1, + data_directory, } } } - pub struct Pomodoro { - pub count: u64, - pub state: State, + pub struct Pomodoro<'a> { + count: u64, + state: State, + alert: Alert<'a>, } - impl Default for Pomodoro { - fn default() -> Self { + impl Pomodoro<'_> { + pub fn new<'a>(alert: &'a Alert) -> Pomodoro<'a> { Pomodoro { count: 0, state: State::Inactive, + alert: *alert, } } - } - impl Pomodoro { fn next(&mut self) { match self.state { State::Work => { @@ -59,16 +101,17 @@ pub mod pomodoro { async fn wait(minutes: u64) { use std::time::Duration; - use tokio::time::delay_for; let duration = Duration::from_secs(minutes * 5); - delay_for(duration).await; + async_std::task::sleep(duration).await; } pub async fn start(&mut self, config: Config) { loop { self.next(); + self.alert.play(); + match self.state { State::Work => { println!("Start Work."); diff --git a/src/main.rs b/src/main.rs index e7041cc..8d85529 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ +use async_std::task; use clap::{App, ArgMatches, SubCommand}; -use domasi::pomodoro::Config; +use domasi::pomodoro::{Alert, Config}; use domasi::Pomodoro; + fn main() { let matches = App::new("Domasi") .version("0.1.0") @@ -10,15 +12,20 @@ fn main() { .get_matches(); match matches.subcommand() { - ("start", Some(args)) => start(args), + ("start", Some(sub_matches)) => start(sub_matches), _ => {} } } -#[tokio::main] -pub async fn start(_args: &ArgMatches) { - let mut pomodoro = Pomodoro::default(); +pub fn start(_args: &ArgMatches) { let config = Config::default(); - pomodoro.start(config).await; + let audio_path = config.data_directory.join("sound/alert.ogg"); + let default_device = rodio::default_output_device().unwrap(); + let alert = Alert::new(&audio_path, &default_device); + let mut pomodoro = Pomodoro::new(&alert); + + task::block_on(async { + pomodoro.start(config).await; + }); }