From f6802af3b59f0e002c6ce0a8ff9f7c8125b43911 Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Fri, 27 Oct 2023 23:07:16 +0200 Subject: [PATCH 01/11] refactor(crates): change to workspace with separate crates --- Cargo.lock | 51 ++++++++++++------- Cargo.toml | 50 +++--------------- crates/daktilo/Cargo.toml | 51 +++++++++++++++++++ {src => crates/daktilo/src}/args.rs | 2 +- .../daktilo/src}/bin/completions.rs | 0 {src => crates/daktilo/src}/bin/mangen.rs | 0 crates/daktilo/src/lib.rs | 8 +++ {src => crates/daktilo/src}/main.rs | 23 ++++----- crates/daktilo_lib/Cargo.toml | 36 +++++++++++++ {src => crates/daktilo_lib/src}/app.rs | 0 crates/daktilo_lib/src/audio.rs | 12 +++++ {src => crates/daktilo_lib/src}/config.rs | 5 +- {src => crates/daktilo_lib/src}/embed.rs | 9 ++-- {src => crates/daktilo_lib/src}/error.rs | 0 {src => crates/daktilo_lib/src}/lib.rs | 8 +-- {src => crates/daktilo_lib/src}/logger.rs | 0 16 files changed, 172 insertions(+), 83 deletions(-) create mode 100644 crates/daktilo/Cargo.toml rename {src => crates/daktilo/src}/args.rs (98%) rename {src => crates/daktilo/src}/bin/completions.rs (100%) rename {src => crates/daktilo/src}/bin/mangen.rs (100%) create mode 100644 crates/daktilo/src/lib.rs rename {src => crates/daktilo/src}/main.rs (85%) create mode 100644 crates/daktilo_lib/Cargo.toml rename {src => crates/daktilo_lib/src}/app.rs (100%) create mode 100644 crates/daktilo_lib/src/audio.rs rename {src => crates/daktilo_lib/src}/config.rs (98%) rename {src => crates/daktilo_lib/src}/embed.rs (84%) rename {src => crates/daktilo_lib/src}/error.rs (100%) rename {src => crates/daktilo_lib/src}/lib.rs (93%) rename {src => crates/daktilo_lib/src}/logger.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 9a392af..a045884 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -474,6 +474,21 @@ dependencies = [ "clap", "clap_complete", "clap_mangen", + "colored", + "daktilo_lib", + "dirs", + "pretty_assertions", + "regex", + "serde", + "serde_regex", + "tokio", + "tracing", +] + +[[package]] +name = "daktilo_lib" +version = "0.5.0" +dependencies = [ "colored", "dirs", "fastrand", @@ -615,9 +630,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] name = "heck" @@ -858,9 +873,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", @@ -1289,9 +1304,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.19" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.1", "errno", @@ -1397,9 +1412,9 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", @@ -1555,14 +1570,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3efaf127c78d5339cc547cce4e4d973bd5e4f56e949a06d091c082ebeef2f800" +checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.5", + "toml_edit 0.20.7", ] [[package]] @@ -1587,9 +1602,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.5" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782bf6c2ddf761c1e7855405e8975472acf76f7f36d0d4328bd3b7a2fae12a85" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap", "serde", @@ -1632,12 +1647,12 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] diff --git a/Cargo.toml b/Cargo.toml index 9310031..5f4c24b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,8 @@ -[package] -name = "daktilo" +[workspace] +members = ["crates/*"] +resolver = "2" + +[workspace.package] version = "0.5.0" description = "Turn your keyboard into a typewriter! πŸ“‡" authors = ["Orhun ParmaksΔ±z "] @@ -9,43 +12,16 @@ homepage = "https://github.com/orhun/daktilo" repository = "https://github.com/orhun/daktilo" keywords = ["typewriter", "keyboard", "nostalgic", "type"] categories = ["command-line-utilities", "multimedia"] -default-run = "daktilo" rust-version = "1.70.0" edition = "2021" -[features] -audio-tests = [] - -[[bin]] -name = "daktilo-completions" -path = "src/bin/completions.rs" - -[[bin]] -name = "daktilo-mangen" -path = "src/bin/mangen.rs" - -[dependencies] -rdev = { version = "0.5.3", features = ["serialize"] } -rodio = { version = "0.17.3", default-features = false, features = [ - "symphonia-mp3", -] } -rust-embed = { version = "8.0.0", features = ["debug-embed", "compression"] } +[workspace.dependencies] thiserror = "1.0.50" -tokio = { version = "1.33.0", features = ["full"] } +serde = { version = "1.0.190", features = ["derive"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -clap = { version = "4.4.7", features = ["derive", "env", "wrap_help", "cargo"] } -serde = { version = "1.0.190", features = ["derive"] } -dirs = "5.0.1" -toml = "0.8.5" -regex = "1.10.2" -serde_regex = "1.1.0" +tokio = { version = "1.33.0", features = ["full"] } colored = "2.0.4" -clap_complete = "4.4.4" -clap_mangen = "0.2.15" -fastrand = "2.0.1" - -[dev-dependencies] pretty_assertions = "1.4.0" [profile.dev] @@ -93,13 +69,3 @@ targets = [ pr-run-mode = "upload" # Skip checking whether the specified configuration files are up to date allow-dirty = ["ci", "msi"] - -[workspace.metadata.dist.dependencies.apt] -libasound2-dev = '*' -libxi-dev = '*' -libxtst-dev = '*' -pkg-config = '*' - -[package.metadata.wix] -upgrade-guid = "51610A8E-55C9-4F49-8C9F-3529499D5C60" -path-guid = "2198A7FB-5F3C-4FAB-B253-2314115AD2DD" diff --git a/crates/daktilo/Cargo.toml b/crates/daktilo/Cargo.toml new file mode 100644 index 0000000..0d5f147 --- /dev/null +++ b/crates/daktilo/Cargo.toml @@ -0,0 +1,51 @@ +[package] +name = "daktilo" +version.workspace = true +description.workspace = true +authors.workspace = true +license.workspace = true +readme.workspace = true +homepage.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true +rust-version.workspace = true +edition.workspace = true +default-run = "daktilo" + +[features] +audio-tests = [] + +[[bin]] +name = "daktilo-completions" +path = "src/bin/completions.rs" + +[[bin]] +name = "daktilo-mangen" +path = "src/bin/mangen.rs" + +[dependencies] +clap = { version = "4.4.7", features = ["derive", "env", "wrap_help", "cargo"] } +dirs = "5.0.1" +regex = "1.10.2" +serde_regex = "1.1.0" +clap_complete = "4.4.4" +clap_mangen = "0.2.15" +tokio.workspace = true +serde.workspace = true +tracing.workspace = true +colored.workspace = true +daktilo_lib = { path = "../daktilo_lib" } + +[dev-dependencies] +pretty_assertions.workspace = true + +[package.metadata.dist.dependencies.apt] +libasound2-dev = '*' +libxi-dev = '*' +libxtst-dev = '*' +pkg-config = '*' + +[package.metadata.wix] +upgrade-guid = "51610A8E-55C9-4F49-8C9F-3529499D5C60" +path-guid = "2198A7FB-5F3C-4FAB-B253-2314115AD2DD" diff --git a/src/args.rs b/crates/daktilo/src/args.rs similarity index 98% rename from src/args.rs rename to crates/daktilo/src/args.rs index 8ab022f..47be7ba 100644 --- a/src/args.rs +++ b/crates/daktilo/src/args.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use clap::Parser; -use crate::config::SoundVariation; +use daktilo_lib::config::SoundVariation; /// Typewriter ASCII banner. pub const BANNER: &str = r#" diff --git a/src/bin/completions.rs b/crates/daktilo/src/bin/completions.rs similarity index 100% rename from src/bin/completions.rs rename to crates/daktilo/src/bin/completions.rs diff --git a/src/bin/mangen.rs b/crates/daktilo/src/bin/mangen.rs similarity index 100% rename from src/bin/mangen.rs rename to crates/daktilo/src/bin/mangen.rs diff --git a/crates/daktilo/src/lib.rs b/crates/daktilo/src/lib.rs new file mode 100644 index 0000000..6c3dc7e --- /dev/null +++ b/crates/daktilo/src/lib.rs @@ -0,0 +1,8 @@ +//! Turn your keyboard into a typewriter! πŸ“‡ + +#![warn(missing_docs)] + +/// Cli argument parsing. +/// +/// Needs to be in a lib for completions and mangen. +pub mod args; diff --git a/src/main.rs b/crates/daktilo/src/main.rs similarity index 85% rename from src/main.rs rename to crates/daktilo/src/main.rs index d807ec8..0979cd6 100644 --- a/src/main.rs +++ b/crates/daktilo/src/main.rs @@ -1,16 +1,13 @@ use clap::Parser; -use colored::*; -use rodio::cpal::traits::HostTrait; -use rodio::DeviceTrait; +use colored::Colorize; +use daktilo::args::Args; +use daktilo_lib::config::{Config, DEFAULT_CONFIG}; +use daktilo_lib::embed::EmbeddedConfig; +use daktilo_lib::error::Result; +use daktilo_lib::logger; use std::{fs, process}; use tracing::Level; -use daktilo::args::Args; -use daktilo::config::{Config, DEFAULT_CONFIG}; -use daktilo::embed::EmbeddedConfig; -use daktilo::error::Result; -use daktilo::logger; - #[tokio::main] async fn main() -> Result<()> { // Parse command-line arguments. @@ -52,10 +49,10 @@ async fn main() -> Result<()> { return Ok(()); } else if args.list_devices { tracing::info!("Available devices:"); - rodio::cpal::default_host() - .output_devices()? + daktilo_lib::audio::get_devices()? + .iter() .try_for_each::<_, Result<()>>(|v| { - println!("β€’ {}", v.name()?.white().bold()); + println!("β€’ {}", v.0.white().bold()); Ok(()) })?; return Ok(()); @@ -71,7 +68,7 @@ async fn main() -> Result<()> { .map(|name| config.select_preset(name)) .collect::>>()?; - match daktilo::run( + match daktilo_lib::run( presets, args.sound_variation_args.map(|v| v.into()), args.device, diff --git a/crates/daktilo_lib/Cargo.toml b/crates/daktilo_lib/Cargo.toml new file mode 100644 index 0000000..4fb2800 --- /dev/null +++ b/crates/daktilo_lib/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "daktilo_lib" +version.workspace = true +description.workspace = true +authors.workspace = true +license.workspace = true +readme.workspace = true +homepage.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true +rust-version.workspace = true +edition.workspace = true + +[dependencies] +rdev = { version = "0.5.3", features = ["serialize"] } +rodio = { version = "0.17.3", default-features = false, features = [ + "symphonia-mp3", +] } +rust-embed = { version = "8.0.0", features = ["debug-embed", "compression"] } +toml = "0.8.5" +fastrand = "2.0.1" +dirs = "5.0.1" +regex = "1.10.2" +serde_regex = "1.1.0" +tokio.workspace = true +serde.workspace = true +thiserror.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true +# To be moved to cli? Not core lib functionality +colored.workspace = true + +[dev-dependencies] +pretty_assertions.workspace = true + diff --git a/src/app.rs b/crates/daktilo_lib/src/app.rs similarity index 100% rename from src/app.rs rename to crates/daktilo_lib/src/app.rs diff --git a/crates/daktilo_lib/src/audio.rs b/crates/daktilo_lib/src/audio.rs new file mode 100644 index 0000000..be46ebb --- /dev/null +++ b/crates/daktilo_lib/src/audio.rs @@ -0,0 +1,12 @@ +use rodio::cpal::traits::HostTrait; +use rodio::DeviceTrait; + +use crate::Result; + +/// Get a list of all available audio devices. +pub fn get_devices() -> Result> { + Ok(rodio::cpal::default_host() + .output_devices()? + .map(|d| (d.name().unwrap_or("Unknown".to_string()), d)) + .collect()) +} diff --git a/src/config.rs b/crates/daktilo_lib/src/config.rs similarity index 98% rename from src/config.rs rename to crates/daktilo_lib/src/config.rs index 03d28ad..3ef6653 100644 --- a/src/config.rs +++ b/crates/daktilo_lib/src/config.rs @@ -10,7 +10,7 @@ use std::path::{Path, PathBuf}; use std::str; /// Default configuration file. -pub const DEFAULT_CONFIG: &str = concat!(env!("CARGO_PKG_NAME"), ".toml"); +pub const DEFAULT_CONFIG: &str = "daktilo.toml"; /// Configuration. #[derive(Debug, Serialize, Deserialize)] @@ -217,8 +217,9 @@ mod tests { #[test] fn test_parse_config() -> Result<()> { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../") .join("config") - .join(format!("{}.toml", env!("CARGO_PKG_NAME"))); + .join("daktilo.toml"); if let Some(global_path) = Config::get_default_location() { path = global_path; } diff --git a/src/embed.rs b/crates/daktilo_lib/src/embed.rs similarity index 84% rename from src/embed.rs rename to crates/daktilo_lib/src/embed.rs index 6be59c6..df09a96 100644 --- a/src/embed.rs +++ b/crates/daktilo_lib/src/embed.rs @@ -8,7 +8,7 @@ use std::str; /// Embedded sound assets. #[derive(RustEmbed)] -#[folder = "sounds"] +#[folder = "../../sounds"] pub struct EmbeddedSound; impl EmbeddedSound { @@ -22,7 +22,7 @@ impl EmbeddedSound { /// /// Embeds `config/`[`DEFAULT_CONFIG`] into the binary. #[derive(Debug, RustEmbed)] -#[folder = "config/"] +#[folder = "../../config/"] pub struct EmbeddedConfig; impl EmbeddedConfig { @@ -30,7 +30,10 @@ impl EmbeddedConfig { pub fn get_config() -> Result { match Self::get(DEFAULT_CONFIG) { Some(v) => Ok(str::from_utf8(&v.data)?.to_string()), - None => Err(Error::Embedded(String::from("embedded config not found"))), + None => Err(Error::Embedded(format!( + "embedded config {} not found", + DEFAULT_CONFIG, + ))), } } diff --git a/src/error.rs b/crates/daktilo_lib/src/error.rs similarity index 100% rename from src/error.rs rename to crates/daktilo_lib/src/error.rs diff --git a/src/lib.rs b/crates/daktilo_lib/src/lib.rs similarity index 93% rename from src/lib.rs rename to crates/daktilo_lib/src/lib.rs index 9ed510d..067eb3a 100644 --- a/src/lib.rs +++ b/crates/daktilo_lib/src/lib.rs @@ -1,4 +1,4 @@ -//! Turn your keyboard into a typewriter! πŸ“‡ +//! Library Crate to turn your keyboard into a typewriter! πŸ“‡ #![warn(missing_docs)] @@ -11,15 +11,15 @@ pub mod logger; /// File embedder. pub mod embed; -/// Command-line arguments. -pub mod args; - /// Application state. pub mod app; /// Configuration file. pub mod config; +/// Rodio helpers. +pub mod audio; + use app::App; use config::{SoundPreset, SoundVariation}; use error::Result; diff --git a/src/logger.rs b/crates/daktilo_lib/src/logger.rs similarity index 100% rename from src/logger.rs rename to crates/daktilo_lib/src/logger.rs From 79caeca0ee48be6c021374c281a10ab402de5a9c Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Fri, 27 Oct 2023 23:08:58 +0200 Subject: [PATCH 02/11] ci(lint): add workaround for msrv workspace inheritance --- .github/workflows/ci.yml | 4 +++- crates/daktilo/Cargo.toml | 4 ++++ crates/daktilo_lib/Cargo.toml | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f4ecc5..fb80f25 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -186,4 +186,6 @@ jobs: wget -qi - tar -xvf cargo-msrv*.tar* -C ~/.cargo/bin/ cargo-msrv printf "%s" "Checking MSRV..." - cargo msrv --output-format json verify | tail -n 1 | jq --exit-status '.success' + # Workaround for https://github.com/foresterre/cargo-msrv/issues/590 + cargo msrv --output-format json --path crates/daktilo verify | tail -n 1 | jq --exit-status '.success' + cargo msrv --output-format json --path crates/daktilo_lib verify | tail -n 1 | jq --exit-status '.success' diff --git a/crates/daktilo/Cargo.toml b/crates/daktilo/Cargo.toml index 0d5f147..90668fb 100644 --- a/crates/daktilo/Cargo.toml +++ b/crates/daktilo/Cargo.toml @@ -49,3 +49,7 @@ pkg-config = '*' [package.metadata.wix] upgrade-guid = "51610A8E-55C9-4F49-8C9F-3529499D5C60" path-guid = "2198A7FB-5F3C-4FAB-B253-2314115AD2DD" + +# Workaround for https://github.com/foresterre/cargo-msrv/issues/590 +[package.metadata] +msrv = "1.70.0" diff --git a/crates/daktilo_lib/Cargo.toml b/crates/daktilo_lib/Cargo.toml index 4fb2800..2e1ee55 100644 --- a/crates/daktilo_lib/Cargo.toml +++ b/crates/daktilo_lib/Cargo.toml @@ -34,3 +34,6 @@ colored.workspace = true [dev-dependencies] pretty_assertions.workspace = true +# Workaround for https://github.com/foresterre/cargo-msrv/issues/590 +[package.metadata] +msrv = "1.70.0" From db05552f6cea4df2ad8f4d59e5e4b44ed9b24d2b Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Fri, 27 Oct 2023 23:09:11 +0200 Subject: [PATCH 03/11] build(wix): move wxs to bin crate --- {wix => crates/daktilo/wix}/main.wxs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {wix => crates/daktilo/wix}/main.wxs (100%) diff --git a/wix/main.wxs b/crates/daktilo/wix/main.wxs similarity index 100% rename from wix/main.wxs rename to crates/daktilo/wix/main.wxs From 560bc53abe53e77d325ecbd9d96c7ebbb25f578b Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:06:11 +0200 Subject: [PATCH 04/11] test: fix testcases for gh actions --- crates/daktilo/src/bin/completions.rs | 12 ++++++++++-- crates/daktilo/src/bin/mangen.rs | 11 +++++++++-- crates/daktilo_lib/src/config.rs | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/crates/daktilo/src/bin/completions.rs b/crates/daktilo/src/bin/completions.rs index 9290197..0c25d72 100644 --- a/crates/daktilo/src/bin/completions.rs +++ b/crates/daktilo/src/bin/completions.rs @@ -27,12 +27,20 @@ fn main() -> Result<()> { #[cfg(test)] mod tests { + use std::path::PathBuf; + use super::*; #[test] fn generate_completions() -> Result<()> { - if env::var(OUT_DIR_ENV).is_ok() { - main()?; + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../"); + if let Ok(out_dir) = env::var(OUT_DIR_ENV) { + path = path.join(out_dir); + } else { + path = path.join("target"); } + + env::set_var(OUT_DIR_ENV, path); + main()?; Ok(()) } } diff --git a/crates/daktilo/src/bin/mangen.rs b/crates/daktilo/src/bin/mangen.rs index af46f42..53260f1 100644 --- a/crates/daktilo/src/bin/mangen.rs +++ b/crates/daktilo/src/bin/mangen.rs @@ -32,11 +32,18 @@ fn main() -> Result<()> { #[cfg(test)] mod tests { use super::*; + #[test] fn generate_manpage() -> Result<()> { - if env::var(OUT_DIR_ENV).is_ok() { - main()?; + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../"); + if let Ok(out_dir) = env::var(OUT_DIR_ENV) { + path = path.join(out_dir); + } else { + path = path.join("target"); } + + env::set_var(OUT_DIR_ENV, path); + main()?; Ok(()) } } diff --git a/crates/daktilo_lib/src/config.rs b/crates/daktilo_lib/src/config.rs index 3ef6653..ef10d36 100644 --- a/crates/daktilo_lib/src/config.rs +++ b/crates/daktilo_lib/src/config.rs @@ -219,7 +219,7 @@ mod tests { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .join("../../") .join("config") - .join("daktilo.toml"); + .join(DEFAULT_CONFIG); if let Some(global_path) = Config::get_default_location() { path = global_path; } From 72680de2af3749e0a3d24181024d1e3f8aa6dcd3 Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:47:43 +0200 Subject: [PATCH 05/11] refactor(dependencies): limit tokio to required features --- Cargo.lock | 37 ------------------------------------- Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a045884..7cb71ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -871,17 +871,6 @@ dependencies = [ "adler", ] -[[package]] -name = "mio" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - [[package]] name = "ndk" version = "0.7.0" @@ -1395,31 +1384,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - [[package]] name = "smallvec" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys", -] - [[package]] name = "strsim" version = "0.10.0" @@ -1545,16 +1515,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ "backtrace", - "bytes", - "libc", - "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", - "socket2", "tokio-macros", - "windows-sys", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 5f4c24b..513fb9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ thiserror = "1.0.50" serde = { version = "1.0.190", features = ["derive"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -tokio = { version = "1.33.0", features = ["full"] } +tokio = { version = "1.33.0", features = ["macros", "rt-multi-thread", "sync"] } colored = "2.0.4" pretty_assertions = "1.4.0" From 6ed6b65fc1dd389a1159aafa06a27674671e8c95 Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:12:57 +0100 Subject: [PATCH 06/11] refactor(ci): use package metadata for msrv workaround Refs: #66 --- .github/workflows/ci.yml | 9 ++++++--- .github/workflows/release.yml | 4 ++-- crates/daktilo/Cargo.toml | 4 ---- crates/daktilo/src/lib.rs | 2 +- crates/daktilo_lib/Cargo.toml | 4 ---- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb80f25..af1db05 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -185,7 +185,10 @@ jobs: select(.name | ascii_downcase | test(\"linux.*x86_64|x86_64.*linux\")).browser_download_url" | \ wget -qi - tar -xvf cargo-msrv*.tar* -C ~/.cargo/bin/ cargo-msrv - printf "%s" "Checking MSRV..." # Workaround for https://github.com/foresterre/cargo-msrv/issues/590 - cargo msrv --output-format json --path crates/daktilo verify | tail -n 1 | jq --exit-status '.success' - cargo msrv --output-format json --path crates/daktilo_lib verify | tail -n 1 | jq --exit-status '.success' + for package in $(cargo metadata --format-version 1 --no-deps | jq -r ".workspace_members[]" | awk '{print $1}'); do + version=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name | test("^daktilo$")) | .rust_version') + printf "Checking MSRV $version for $package..." + echo -e "[package.metadata]\nmsrv = \"${version}\"" >> "crates/${package}/Cargo.toml" + cargo msrv --output-format json --path "crates/${package}" verify | tail -n 1 | jq --exit-status '.success' + done diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 166c84e..28de66a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -58,7 +58,7 @@ jobs: with: submodules: recursive - name: Install cargo-dist - run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.4.0/cargo-dist-installer.sh | sh" + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.4.2/cargo-dist-installer.sh | sh" - id: plan run: | cargo dist plan ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} --output-format=json > dist-manifest.json @@ -140,7 +140,7 @@ jobs: with: submodules: recursive - name: Install cargo-dist - run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.4.0/cargo-dist-installer.sh | sh" + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.4.2/cargo-dist-installer.sh | sh" # Get all the local artifacts for the global tasks to use (for e.g. checksums) - name: Fetch local artifacts uses: actions/download-artifact@v3 diff --git a/crates/daktilo/Cargo.toml b/crates/daktilo/Cargo.toml index 90668fb..0d5f147 100644 --- a/crates/daktilo/Cargo.toml +++ b/crates/daktilo/Cargo.toml @@ -49,7 +49,3 @@ pkg-config = '*' [package.metadata.wix] upgrade-guid = "51610A8E-55C9-4F49-8C9F-3529499D5C60" path-guid = "2198A7FB-5F3C-4FAB-B253-2314115AD2DD" - -# Workaround for https://github.com/foresterre/cargo-msrv/issues/590 -[package.metadata] -msrv = "1.70.0" diff --git a/crates/daktilo/src/lib.rs b/crates/daktilo/src/lib.rs index 6c3dc7e..892dcf5 100644 --- a/crates/daktilo/src/lib.rs +++ b/crates/daktilo/src/lib.rs @@ -2,7 +2,7 @@ #![warn(missing_docs)] -/// Cli argument parsing. +/// CLI argument parser. /// /// Needs to be in a lib for completions and mangen. pub mod args; diff --git a/crates/daktilo_lib/Cargo.toml b/crates/daktilo_lib/Cargo.toml index da6caeb..66a36f2 100644 --- a/crates/daktilo_lib/Cargo.toml +++ b/crates/daktilo_lib/Cargo.toml @@ -33,7 +33,3 @@ colored.workspace = true [dev-dependencies] pretty_assertions.workspace = true - -# Workaround for https://github.com/foresterre/cargo-msrv/issues/590 -[package.metadata] -msrv = "1.70.0" From 7c0ced1778de2dfd7483685cee48b28a71faeb9c Mon Sep 17 00:00:00 2001 From: Xenira <1288524+Xenira@users.noreply.github.com> Date: Sat, 4 Nov 2023 21:30:48 +0100 Subject: [PATCH 07/11] fix(logging): fix logging for split crates Refs: #66 --- crates/daktilo/src/args.rs | 4 ++-- crates/daktilo/src/main.rs | 9 ++++++++- crates/daktilo_lib/src/logger.rs | 31 +++++++++++++++---------------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/crates/daktilo/src/args.rs b/crates/daktilo/src/args.rs index 47be7ba..e94855d 100644 --- a/crates/daktilo/src/args.rs +++ b/crates/daktilo/src/args.rs @@ -34,8 +34,8 @@ pub const BANNER: &str = r#" )] pub struct Args { /// Enables verbose logging. - #[arg(short, long, env)] - pub verbose: bool, + #[arg(short, long, action = clap::ArgAction::Count)] + pub verbose: u8, /// Sets the name of the sound preset to use. /// /// Can be specified multiple times to play multiple presets at once. diff --git a/crates/daktilo/src/main.rs b/crates/daktilo/src/main.rs index 0979cd6..926b06c 100644 --- a/crates/daktilo/src/main.rs +++ b/crates/daktilo/src/main.rs @@ -14,7 +14,14 @@ async fn main() -> Result<()> { let args = Args::parse(); // Initialize the logger. - logger::init(args.verbose.then_some(Level::DEBUG))?; + logger::init( + Some(match args.verbose { + 0 => Level::INFO, + 1 => Level::DEBUG, + _ => Level::TRACE, + }), + vec![env!("CARGO_PKG_NAME").to_string()], + )?; tracing::info!("Starting..."); // Parse the config file. diff --git a/crates/daktilo_lib/src/logger.rs b/crates/daktilo_lib/src/logger.rs index be43cd7..fa0812b 100644 --- a/crates/daktilo_lib/src/logger.rs +++ b/crates/daktilo_lib/src/logger.rs @@ -3,21 +3,20 @@ use tracing::Level; use tracing_subscriber::EnvFilter; /// Initializes the logger with the given default log level. -pub fn init(default_level: Option) -> Result<()> { - tracing_subscriber::fmt() - .with_env_filter( - EnvFilter::builder() - .from_env_lossy() - .add_directive("none".parse()?) - .add_directive( - format!( - "{}={}", - env!("CARGO_PKG_NAME"), - default_level.unwrap_or(Level::INFO) - ) - .parse()?, - ), - ) - .init(); +/// Provide your crate names to enable logging for them. +pub fn init(default_level: Option, mut crates: Vec) -> Result<()> { + crates.push(env!("CARGO_PKG_NAME").to_string()); + + let mut env_filter = EnvFilter::builder() + .from_env_lossy() + .add_directive("none".parse()?); + for crate_name in crates { + env_filter = env_filter.add_directive( + format!("{}={}", crate_name, default_level.unwrap_or(Level::INFO)).parse()?, + ); + } + + tracing_subscriber::fmt().with_env_filter(env_filter).init(); + Ok(()) } From 30f2b6729ebbef3115873b8157d1e4a391ca46d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 5 Nov 2023 11:45:44 +0100 Subject: [PATCH 08/11] docs(lib): update the lib description --- crates/daktilo_lib/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/daktilo_lib/src/lib.rs b/crates/daktilo_lib/src/lib.rs index 067eb3a..5549484 100644 --- a/crates/daktilo_lib/src/lib.rs +++ b/crates/daktilo_lib/src/lib.rs @@ -1,4 +1,6 @@ -//! Library Crate to turn your keyboard into a typewriter! πŸ“‡ +//! A library for turning your keyboard into a typewriter! πŸ“‡ +//! +//! See [`daktilo`](https://github.com/orhun/daktilo). #![warn(missing_docs)] From ef574f2569f87a740d5200791a98b60e5e6b916d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 5 Nov 2023 11:46:32 +0100 Subject: [PATCH 09/11] style(logger): update the formatting of logger::init --- crates/daktilo_lib/src/logger.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/daktilo_lib/src/logger.rs b/crates/daktilo_lib/src/logger.rs index fa0812b..7b9d2cf 100644 --- a/crates/daktilo_lib/src/logger.rs +++ b/crates/daktilo_lib/src/logger.rs @@ -3,10 +3,10 @@ use tracing::Level; use tracing_subscriber::EnvFilter; /// Initializes the logger with the given default log level. +/// /// Provide your crate names to enable logging for them. pub fn init(default_level: Option, mut crates: Vec) -> Result<()> { crates.push(env!("CARGO_PKG_NAME").to_string()); - let mut env_filter = EnvFilter::builder() .from_env_lossy() .add_directive("none".parse()?); @@ -15,8 +15,6 @@ pub fn init(default_level: Option, mut crates: Vec) -> Result<()> format!("{}={}", crate_name, default_level.unwrap_or(Level::INFO)).parse()?, ); } - tracing_subscriber::fmt().with_env_filter(env_filter).init(); - Ok(()) } From 292f4c1031cb83454532b0a6c0b6b89ad2ce63b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 5 Nov 2023 11:47:34 +0100 Subject: [PATCH 10/11] style(audio): use explicit import for Result type --- crates/daktilo_lib/src/audio.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/daktilo_lib/src/audio.rs b/crates/daktilo_lib/src/audio.rs index be46ebb..4bc2692 100644 --- a/crates/daktilo_lib/src/audio.rs +++ b/crates/daktilo_lib/src/audio.rs @@ -1,8 +1,7 @@ +use crate::error::Result; use rodio::cpal::traits::HostTrait; use rodio::DeviceTrait; -use crate::Result; - /// Get a list of all available audio devices. pub fn get_devices() -> Result> { Ok(rodio::cpal::default_host() From 98fba20c358243883179e2792ce74e3783a8d400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 5 Nov 2023 12:00:07 +0100 Subject: [PATCH 11/11] refactor(lib): move color-printing functionality to CLI --- Cargo.lock | 1 - crates/daktilo/Cargo.toml | 2 +- crates/daktilo/src/main.rs | 46 ++++++++++++++++++++++++++++---- crates/daktilo_lib/Cargo.toml | 2 -- crates/daktilo_lib/src/config.rs | 38 -------------------------- 5 files changed, 42 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7cb71ab..5d87b67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -489,7 +489,6 @@ dependencies = [ name = "daktilo_lib" version = "0.5.0" dependencies = [ - "colored", "dirs", "fastrand", "pretty_assertions", diff --git a/crates/daktilo/Cargo.toml b/crates/daktilo/Cargo.toml index 0d5f147..127664f 100644 --- a/crates/daktilo/Cargo.toml +++ b/crates/daktilo/Cargo.toml @@ -31,10 +31,10 @@ regex = "1.10.2" serde_regex = "1.1.0" clap_complete = "4.4.4" clap_mangen = "0.2.15" +colored = "2.0.4" tokio.workspace = true serde.workspace = true tracing.workspace = true -colored.workspace = true daktilo_lib = { path = "../daktilo_lib" } [dev-dependencies] diff --git a/crates/daktilo/src/main.rs b/crates/daktilo/src/main.rs index 926b06c..7cab2f3 100644 --- a/crates/daktilo/src/main.rs +++ b/crates/daktilo/src/main.rs @@ -1,13 +1,52 @@ use clap::Parser; use colored::Colorize; use daktilo::args::Args; -use daktilo_lib::config::{Config, DEFAULT_CONFIG}; +use daktilo_lib::config::{Config, KeyEvent, SoundPreset, DEFAULT_CONFIG}; use daktilo_lib::embed::EmbeddedConfig; use daktilo_lib::error::Result; use daktilo_lib::logger; use std::{fs, process}; use tracing::Level; +/// Prints the available presets to stdout as a table. +fn list_presets(presets: Vec) { + tracing::info!("Available presets:"); + presets.iter().for_each(|preset| { + println!("[{}]", preset.name.white().bold()); + let mut table = format!( + " {:<20} {:<20} {:<20}\n", + "Event".bold(), + "Keys".bold(), + "File".bold() + ); + table.push_str(&format!( + " {:<20} {:<20} {:<20}\n", + "-----", "----", "----" + )); + for key_config in &preset.key_config { + let event_str = match key_config.event { + KeyEvent::KeyPress => "Key Press", + KeyEvent::KeyRelease => "Key Release", + }; + let keys_str = key_config.keys.as_str(); + let file_str = &key_config + .files + .iter() + .map(|v| v.path.clone()) + .collect::>() + .join(","); + table.push_str(&format!( + " {:<20} {:<20} {:<20}\n", + event_str, + keys_str, + file_str.italic() + )); + } + println!("{}", table) + }); +} + +/// Entry-point of the application. #[tokio::main] async fn main() -> Result<()> { // Parse command-line arguments. @@ -49,10 +88,7 @@ async fn main() -> Result<()> { // Start the typewriter. if args.list_presets { tracing::info!("Available presets:"); - config - .sound_presets - .iter() - .for_each(|preset| println!("{}", preset)); + list_presets(config.sound_presets); return Ok(()); } else if args.list_devices { tracing::info!("Available devices:"); diff --git a/crates/daktilo_lib/Cargo.toml b/crates/daktilo_lib/Cargo.toml index 66a36f2..c43542c 100644 --- a/crates/daktilo_lib/Cargo.toml +++ b/crates/daktilo_lib/Cargo.toml @@ -28,8 +28,6 @@ serde.workspace = true thiserror.workspace = true tracing.workspace = true tracing-subscriber.workspace = true -# To be moved to cli? Not core lib functionality -colored.workspace = true [dev-dependencies] pretty_assertions.workspace = true diff --git a/crates/daktilo_lib/src/config.rs b/crates/daktilo_lib/src/config.rs index ef10d36..f26a558 100644 --- a/crates/daktilo_lib/src/config.rs +++ b/crates/daktilo_lib/src/config.rs @@ -1,10 +1,8 @@ use crate::error::{Error, Result}; -use colored::*; use rdev::Key; use regex::Regex; use serde::{Deserialize, Serialize}; use std::env; -use std::fmt; use std::fs; use std::path::{Path, PathBuf}; use std::str; @@ -116,42 +114,6 @@ pub struct SoundPreset { pub variation: Option, } -impl fmt::Display for SoundPreset { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - writeln!(f, "[{}]", self.name.white().bold())?; - let mut table = format!( - " {:<20} {:<20} {:<20}\n", - "Event".bold(), - "Keys".bold(), - "File".bold() - ); - table.push_str(&format!( - " {:<20} {:<20} {:<20}\n", - "-----", "----", "----" - )); - for key_config in &self.key_config { - let event_str = match key_config.event { - KeyEvent::KeyPress => "Key Press", - KeyEvent::KeyRelease => "Key Release", - }; - let keys_str = key_config.keys.as_str(); - let file_str = &key_config - .files - .iter() - .map(|v| v.path.clone()) - .collect::>() - .join(","); - table.push_str(&format!( - " {:<20} {:<20} {:<20}\n", - event_str, - keys_str, - file_str.italic() - )); - } - write!(f, "{}", table) - } -} - /// Key configuration. #[derive(Clone, Debug, Serialize, Deserialize)] pub struct KeyConfig {