From 706570cca26630091f67ec87b4be08e64d0f9fb9 Mon Sep 17 00:00:00 2001 From: Haobo Gu Date: Tue, 25 Nov 2025 19:09:45 +0800 Subject: [PATCH 1/2] feat: support to latest rmk, bump version Signed-off-by: Haobo Gu --- Cargo.toml | 6 ++--- src/args.rs | 4 --- src/keyboard_toml.rs | 39 ++++++++++++++++----------- src/main.rs | 64 +++++++++++++++++++++++++++++++++++++------- 4 files changed, 82 insertions(+), 31 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4df4eb0..281175f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rmkit" -version = "0.0.16" +version = "0.0.17" edition = "2021" homepage = "https://github.com/haobogu/rmkit" repository = "https://github.com/haobogu/rmkit" @@ -9,9 +9,9 @@ description = "rmkit is a toolkit set for RMK keyboard firmware" license = "Apache-2.0" [dependencies] -rmk-config = { version = "0.5.5" } +rmk-config = { version = "0.6.0" } clap = { version = "4.5.23", features = ["derive", "string"] } -toml = "0.8" +toml = "0.9.8" serde = "1.0" serde_derive = "1.0" reqwest = { version = "0.12", default-features = false, features = ["json", "gzip", "stream", "rustls-tls"] } diff --git a/src/args.rs b/src/args.rs index bd4a211..0fb93de 100644 --- a/src/args.rs +++ b/src/args.rs @@ -41,10 +41,6 @@ pub enum Commands { /// (Optional) Local project template path #[arg(long)] local_path: Option, - - /// (Optional) Whether the keyboard is row2col - #[arg(long)] - row2col: Option, }, /// Get chip name from keyboard.toml GetChip { diff --git a/src/keyboard_toml.rs b/src/keyboard_toml.rs index 2db2d53..ae6798b 100644 --- a/src/keyboard_toml.rs +++ b/src/keyboard_toml.rs @@ -1,4 +1,4 @@ -use rmk_config::{BoardConfig, KeyboardTomlConfig}; +use rmk_config::KeyboardTomlConfig; use std::{env, fs, path::PathBuf, process}; /// All info needed to create a RMK project @@ -16,6 +16,8 @@ pub(crate) struct ProjectInfo { pub(crate) uf2_key: String, /// List of disabled default features pub(crate) disabled_default_feature: Vec, + /// List of enabled non-default features + pub(crate) enabled_feature: Vec, } /// Parse `keyboard.toml`, get all needed project info for creating a new RMK project @@ -25,7 +27,7 @@ pub(crate) fn parse_keyboard_toml( ) -> Result> { let keyboard_toml_config = KeyboardTomlConfig::new_from_toml_path(keyboard_toml); - let project_name = keyboard_toml_config.get_basic_info().name.replace(" ", "_"); + let project_name = keyboard_toml_config.get_device_config().name.replace(" ", "_"); let target_dir = if target_dir.is_none() { project_name.clone() } else { @@ -38,29 +40,35 @@ pub(crate) fn parse_keyboard_toml( process::exit(1); } - let mut default_feature_config = vec![]; + let mut disabled_default_feature = vec![]; + let mut enabled_feature = vec![]; // Check keyboard.toml - if match keyboard_toml_config - .get_board_config() - .expect("No matrix config found") - { - BoardConfig::Split(split_config) => split_config.central.matrix.row2col, - BoardConfig::UniBody(uni_body_config) => uni_body_config.matrix.row2col, - } { - default_feature_config.push("col2row".to_string()); - } // Storage config let storage_config = keyboard_toml_config.get_storage_config(); if !storage_config.enabled { - default_feature_config.push("storage".to_string()); + disabled_default_feature.push("storage".to_string()); } // Defmt config let dep_config = keyboard_toml_config.get_dependency_config(); if !dep_config.defmt_log { - default_feature_config.push("defmt".to_string()); + disabled_default_feature.push("defmt".to_string()); + } + + if !keyboard_toml_config.get_host_config().vial_enabled { + disabled_default_feature.push("vial".to_string()); + disabled_default_feature.push("vial_lock".to_string()); + } + + // Light config requires controller feature if any light pin is configured + let light_config = keyboard_toml_config.get_light_config(); + if light_config.capslock.is_some() + || light_config.scrolllock.is_some() + || light_config.numslock.is_some() + { + enabled_feature.push("controller".to_string()); } let board_config = keyboard_toml_config.get_board_config().unwrap(); @@ -93,6 +101,7 @@ pub(crate) fn parse_keyboard_toml( remote_folder: folder, chip: chip_or_board, uf2_key, - disabled_default_feature: default_feature_config, + disabled_default_feature, + enabled_feature, }) } diff --git a/src/main.rs b/src/main.rs index 811be8d..81bd338 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,8 +32,7 @@ async fn main() -> Result<(), Box> { chip, split, local_path, - row2col, - } => init_project(project_name, chip, split, local_path, row2col).await, + } => init_project(project_name, chip, split, local_path).await, args::Commands::GetChip { keyboard_toml_path } => { let project_info = parse_keyboard_toml(&keyboard_toml_path, None)?; println!("{}", project_info.chip); @@ -121,6 +120,11 @@ fn post_process(project_info: ProjectInfo) -> Result<(), Box> { disable_rmk_default_features(&project_info.target_dir, &metadata, project_info.disabled_default_feature)?; } + // Enable non-default features + if project_info.enabled_feature.len() > 0 { + enable_rmk_features(&project_info.target_dir, project_info.enabled_feature)?; + } + Ok(()) } @@ -160,7 +164,6 @@ async fn init_project( chip: Option, split: Option, local_path: Option, - row2col: Option, ) -> Result<(), Box> { let project_name = if project_name.is_none() { Text::new("Project Name:").prompt()?.replace(" ", "_") @@ -179,11 +182,6 @@ async fn init_project( } else { chip.unwrap() }; - let mut default_feature_config = vec![]; - let row2col = row2col.unwrap_or(false); - if row2col { - default_feature_config.push("col2row".to_string()); - } // Get project info from parameters let target_dir = PathBuf::from(&project_name); @@ -216,7 +214,8 @@ async fn init_project( remote_folder, chip: chip_or_board, uf2_key, - disabled_default_feature: default_feature_config, + disabled_default_feature: Vec::new(), + enabled_feature: Vec::new(), }; // Download template @@ -504,3 +503,50 @@ fn get_dependency_default_features( .cloned() .ok_or(format!("Failed to get default {} features", dependency)) } + +/// Enable non-default features for rmk dependency in Cargo.toml +/// +/// This function adds features to the rmk dependency's feature list +/// +/// # Arguments +/// * `target_dir` - Target directory path containing Cargo.toml +/// * `features` - List of features to enable +/// +/// # Returns +/// * `Result<(), String>` - Returns Ok on success, Err on failure +fn enable_rmk_features( + target_dir: &PathBuf, + features: Vec, +) -> Result<(), String> { + println!("Enabling features: {:?}", features); + // Define the path to Cargo.toml + let cargo_toml_path = Path::new(target_dir).join("Cargo.toml"); + + // Parse as Manifest using cargo_toml + let mut manifest = + cargo_toml::Manifest::from_path(&cargo_toml_path).map_err(|e| e.to_string())?; + + // Get dependencies and modify rmk configuration + if let Some(cargo_toml::Dependency::Detailed(rmk_dep)) = manifest.dependencies.get_mut("rmk") { + // Add features to the existing feature list + for feature in features { + if !rmk_dep.features.contains(&feature) { + rmk_dep.features.push(feature); + } + } + rmk_dep.features.sort_unstable(); + rmk_dep.features.dedup(); + } else { + return Err("No valid rmk dependency found".to_string()); + } + + // Convert the modified Manifest to a string + let updated_toml = toml::to_string(&manifest) + .map_err(|e| format!("Failed to serialize updated Cargo.toml: {}", e))?; + + // Write the updated content back to the file + fs::write(&cargo_toml_path, updated_toml) + .map_err(|e| format!("Failed to write updated Cargo.toml: {}", e))?; + + Ok(()) +} From 3987f434294bef6fbad6d445eed8e02504c63833 Mon Sep 17 00:00:00 2001 From: Haobo Gu Date: Tue, 25 Nov 2025 22:17:06 +0800 Subject: [PATCH 2/2] chore: update lock file Signed-off-by: Haobo Gu --- Cargo.lock | 84 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 336d6ce..1963a61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -353,7 +353,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml 0.9.2", + "toml 0.9.8", "winnow", "yaml-rust2", ] @@ -737,6 +737,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hashlink" version = "0.10.0" @@ -970,12 +976,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.1", ] [[package]] @@ -1563,9 +1569,9 @@ dependencies = [ [[package]] name = "rmk-config" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d989e032855befe85fecfc72381969fe21b4268fe631a4c120c7184196137748" +checksum = "2259baa0ceacff7b4168b206a1c0c4d85264bc80022071d284cbbe992e01fd99" dependencies = [ "cargo_toml", "config", @@ -1576,12 +1582,12 @@ dependencies = [ "serde", "serde-inline-default", "serde_derive", - "toml 0.8.23", + "toml 0.9.8", ] [[package]] name = "rmkit" -version = "0.0.16" +version = "0.0.17" dependencies = [ "cargo_metadata", "cargo_toml", @@ -1594,7 +1600,7 @@ dependencies = [ "serde", "serde_derive", "tokio", - "toml 0.8.23", + "toml 0.9.8", "walkdir", "zip", ] @@ -1706,18 +1712,19 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde-inline-default" -version = "0.2.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fb1bedd774187d304179493b0d3c41fbe97b04b14305363f68d2bdf5e47cb9" +checksum = "92d48532bc0781ac622a5fea0f16502d3b4f1af0fcebe56d618120969f35d315" dependencies = [ "proc-macro2", "quote", @@ -1745,11 +1752,20 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1779,11 +1795,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2103,14 +2119,16 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "indexmap", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", "toml_parser", + "toml_writer", "winnow", ] @@ -2125,11 +2143,11 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2148,9 +2166,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] @@ -2161,6 +2179,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tower" version = "0.5.2" @@ -2636,9 +2660,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ]