diff --git a/Cargo.lock b/Cargo.lock index 9c9cfa9..a66c79b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -25,14 +16,14 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] name = "anstream" -version = "0.6.19" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -45,44 +36,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -95,60 +86,55 @@ checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" [[package]] name = "async-compression" -version = "0.4.27" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" +checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" dependencies = [ - "flate2", - "futures-core", - "memchr", + "compression-codecs", + "compression-core", "pin-project-lite", "tokio", ] [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] -name = "autocfg" -version = "1.5.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "backtrace" -version = "0.3.75" +name = "autocfg" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "base64" -version = "0.22.1" +name = "bitfield-struct" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "3ca6739863c590881f038d033a146c51ddae239186a4327014839fd864f44ed5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] name = "bitflags" @@ -158,11 +144,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -176,9 +162,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byteorder" @@ -188,26 +174,26 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "bzip2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea8dcd42434048e4f7a304411d9273a411f647446c1234a65ce0554923f4cff" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ "libbz2-rs-sys", ] [[package]] name = "camino" -version = "1.1.10" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -247,25 +233,26 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.20", ] [[package]] name = "cargo_toml" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.8.23", + "toml 0.9.12+spec-1.1.0", ] [[package]] name = "cc" -version = "1.2.30" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -273,15 +260,26 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core", +] [[package]] name = "cipher" @@ -295,9 +293,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", "clap_derive", @@ -305,9 +303,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstream", "anstyle", @@ -317,33 +315,59 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cobs" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.20", +] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "config" -version = "0.15.13" +version = "0.15.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1eb4fb07bc7f012422df02766c7bd5971effb894f573865642f06fa3265440" +checksum = "b85f248a4de22d204ceabc6299d89d2c70fbd7f09fea53c06c852369652d8139" dependencies = [ "async-trait", "convert_case", @@ -351,10 +375,11 @@ dependencies = [ "pathdiff", "ron", "rust-ini", - "serde", + "serde-untagged", + "serde_core", "serde_json", - "toml 0.9.8", - "winnow", + "toml 1.1.4+spec-1.1.0", + "winnow 1.0.4", "yaml-rust2", ] @@ -373,7 +398,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -402,6 +427,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -411,6 +445,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossterm" version = "0.25.0" @@ -444,38 +484,47 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", ] +[[package]] +name = "csscolorparser" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199f851bd3cb5004c09474252c7f74e7c047441ed0979bf3688a7106a13da952" +dependencies = [ + "num-traits", + "phf", + "serde", + "uncased", +] + [[package]] name = "deflate64" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -491,13 +540,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -511,9 +560,56 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embassy-futures" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" + +[[package]] +name = "embassy-sync" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbd85cf5a5ae56bdf26f618364af642d1d0a4e245cdd75cd9aabda382f65a81" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async", + "futures-core", + "futures-sink", + "heapless", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eb1aa714776b75c7e67e1da744b81a129b3ff919c8712b5e1b32252c1f07cc7" + +[[package]] +name = "embedded-io-async" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564b9f813c544241430e147d8bc454815ef9ac998878d30cc3055449f7fd4c0" +dependencies = [ + "embedded-io 0.7.1", +] [[package]] name = "encoding_rs" @@ -532,51 +628,68 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] -name = "flate2" -version = "1.1.2" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "crc32fast", - "libz-rs-sys", - "miniz_oxide", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "flate2" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.9", + "zlib-rs", +] [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -589,9 +702,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -599,15 +712,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -616,38 +729,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -657,7 +770,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -691,36 +803,51 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "r-efi 6.0.0", + "rand_core", "wasm-bindgen", ] [[package]] -name = "gimli" -version = "0.31.1" +name = "hash32" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] [[package]] name = "hashbrown" @@ -730,26 +857,37 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "foldhash", ] [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hashlink" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.16.1", +] + +[[package]] +name = "heapless" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ba4bd83f9415b58b4ed8dc5714c76e626a105be4646c02630ad730ad3b5aa4" +dependencies = [ + "hash32", + "serde_core", + "stable_deref_trait", ] [[package]] @@ -769,20 +907,19 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", - "fnv", "itoa", ] [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -790,9 +927,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", @@ -809,13 +946,14 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.6.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "http", "http-body", "httparse", @@ -828,15 +966,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -845,14 +982,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -869,12 +1005,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -882,9 +1019,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -895,11 +1032,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -910,42 +1046,39 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -955,9 +1088,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -966,9 +1099,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -976,12 +1109,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", ] [[package]] @@ -999,7 +1132,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.1", "crossterm", "dyn-clone", "fuzzy-matcher", @@ -1010,62 +1143,42 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "io-uring" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -1080,32 +1193,44 @@ dependencies = [ "serde", ] +[[package]] +name = "kle-serial" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada2ce67a08613bce6d3f44eaa76f999bc9eb92f6513edeaf594e34ddfcbcfc4" +dependencies = [ + "csscolorparser", + "num-traits", + "rgb", + "serde", +] + [[package]] name = "libbz2-rs-sys" -version = "0.2.1" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "liblzma" -version = "0.4.2" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0791ab7e08ccc8e0ce893f6906eb2703ed8739d8e89b57c0714e71bad09024c8" +checksum = "2fe0a34ca854fd4f20c07f696fc8675aec78f87d88d29f5e10257a7490a1b2e1" dependencies = [ "liblzma-sys", ] [[package]] name = "liblzma-sys" -version = "0.4.4" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" +checksum = "a0dad045e4b1b7b170be4b60b54b780cafb4490165461bac7d1cf7b703f61d5f" dependencies = [ "cc", "libc", @@ -1113,35 +1238,31 @@ dependencies = [ ] [[package]] -name = "libz-rs-sys" -version = "0.5.1" +name = "libm" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" -dependencies = [ - "zlib-rs", -] +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "lru-slab" @@ -1151,15 +1272,25 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "memchr" -version = "2.7.5" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" dependencies = [ "adler2", ] @@ -1172,19 +1303,19 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -1198,9 +1329,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-traits" @@ -1209,28 +1340,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", + "libm", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "ordered-float" @@ -1253,9 +1376,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1263,15 +1386,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1298,77 +1421,138 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pest_meta" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" +dependencies = [ + "pest", +] [[package]] -name = "pest" -version = "2.8.1" +name = "phf" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "memchr", - "thiserror 2.0.12", - "ucd-trie", + "phf_macros", + "phf_shared", + "serde", ] [[package]] -name = "pest_derive" -version = "2.8.1" +name = "phf_generator" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "pest", - "pest_generator", + "fastrand", + "phf_shared", ] [[package]] -name = "pest_generator" -version = "2.8.1" +name = "phf_macros" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "pest", - "pest_meta", + "phf_generator", + "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.119", + "uncased", ] [[package]] -name = "pest_meta" -version = "2.8.1" +name = "phf_shared" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "pest", - "sha2", + "siphasher", + "uncased", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "pkg-config" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] -name = "pkg-config" -version = "0.3.32" +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "postcard-derive", + "serde", +] + +[[package]] +name = "postcard-derive" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -1381,33 +1565,24 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c834641d8ad1b348c9ee86dec3b9840d805acd5f24daa5f90c788951a52ff59b" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -1417,7 +1592,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.12", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -1425,20 +1600,21 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.4.3", "lru-slab", "rand", + "rand_pcg", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -1446,23 +1622,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -1474,51 +1650,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "rand" -version = "0.9.2" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha", - "rand_core", -] +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] -name = "rand_chacha" -version = "0.9.0" +name = "rand" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "ppv-lite86", + "chacha20", + "getrandom 0.4.3", "rand_core", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" dependencies = [ - "getrandom 0.3.3", + "rand_core", ] [[package]] name = "redox_syscall" -version = "0.5.15" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.1", ] [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "async-compression", - "base64 0.22.1", + "base64", "bytes", "futures-core", "futures-util", @@ -1553,6 +1731,12 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" + [[package]] name = "ring" version = "0.17.14" @@ -1561,7 +1745,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -1569,25 +1753,39 @@ dependencies = [ [[package]] name = "rmk-config" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2259baa0ceacff7b4168b206a1c0c4d85264bc80022071d284cbbe992e01fd99" +version = "0.7.0" +source = "git+https://github.com/rmk-rs/rmk?rev=93726512f2fb383cdb5a419b09ff181c7c123b5f#93726512f2fb383cdb5a419b09ff181c7c123b5f" dependencies = [ - "cargo_toml", "config", + "miniz_oxide 0.9.1", "once_cell", "paste", "pest", "pest_derive", + "postcard", "serde", "serde-inline-default", - "serde_derive", - "toml 0.9.8", + "toml 1.1.4+spec-1.1.0", +] + +[[package]] +name = "rmk-types" +version = "0.3.0" +source = "git+https://github.com/rmk-rs/rmk?rev=93726512f2fb383cdb5a419b09ff181c7c123b5f#93726512f2fb383cdb5a419b09ff181c7c123b5f" +dependencies = [ + "bitfield-struct", + "cobs", + "heapless", + "postcard", + "rmk-config", + "serde", + "strum", + "toml 1.1.4+spec-1.1.0", ] [[package]] name = "rmkit" -version = "0.0.21" +version = "0.1.0" dependencies = [ "cargo_metadata", "cargo_toml", @@ -1597,54 +1795,51 @@ dependencies = [ "inquire", "reqwest", "rmk-config", + "rynk-kle", "serde", "serde_derive", "serde_json", "tokio", - "toml 0.9.8", + "toml 0.9.12+spec-1.1.0", "walkdir", "zip", ] [[package]] name = "ron" -version = "0.8.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "base64 0.21.7", - "bitflags 2.9.1", + "bitflags 2.13.1", + "once_cell", "serde", "serde_derive", + "typeid", + "unicode-ident", ] [[package]] name = "rust-ini" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7295b7ce3bf4806b419dc3420745998b447178b7005e2011947b38fc5aa6791" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ "cfg-if", "ordered-multimap", ] -[[package]] -name = "rustc-demangle" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" - [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "once_cell", "ring", @@ -1656,9 +1851,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -1666,9 +1861,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "0527518605e68109d875e248ea259b6758801cf165e4b2c2733ae3b51f12535a" dependencies = [ "ring", "rustls-pki-types", @@ -1677,15 +1872,46 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "rynk" +version = "0.2.0" +source = "git+https://github.com/rmk-rs/rmk?rev=93726512f2fb383cdb5a419b09ff181c7c123b5f#93726512f2fb383cdb5a419b09ff181c7c123b5f" +dependencies = [ + "critical-section", + "embassy-futures", + "embassy-sync", + "embedded-io-async", + "heapless", + "log", + "postcard", + "rmk-config", + "rmk-types", + "serde", + "thiserror 2.0.20", +] + +[[package]] +name = "rynk-kle" +version = "0.2.0" +source = "git+https://github.com/rmk-rs/rmk?rev=93726512f2fb383cdb5a419b09ff181c7c123b5f#93726512f2fb383cdb5a419b09ff181c7c123b5f" +dependencies = [ + "kle-serial", + "rmk-config", + "rynk", + "serde", + "serde_json", + "toml 1.1.4+spec-1.1.0", +] [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -1704,18 +1930,19 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -1723,23 +1950,24 @@ dependencies = [ [[package]] name = "serde-inline-default" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d48532bc0781ac622a5fea0f16502d3b4f1af0fcebe56d618120969f35d315" +checksum = "7a024ee82abb97858516d2539fa845e6ef82ef57fdede6833ca24ed26425b614" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde-untagged" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" dependencies = [ "erased-serde", "serde", + "serde_core", "typeid", ] @@ -1755,34 +1983,35 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] @@ -1796,9 +2025,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -1817,31 +2046,20 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook" @@ -1855,9 +2073,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio 0.8.11", @@ -1866,46 +2084,53 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" @@ -1913,6 +2138,27 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "subtle" version = "2.6.1" @@ -1921,9 +2167,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.104" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -1947,7 +2204,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1961,11 +2218,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.20", ] [[package]] @@ -1976,47 +2233,47 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.41" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", ] [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "tiny-keccak" @@ -2029,9 +2286,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -2039,9 +2296,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -2054,40 +2311,37 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", - "mio 1.0.4", + "mio 1.2.2", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -2095,9 +2349,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", @@ -2120,17 +2374,32 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.8" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ "indexmap", "serde_core", - "serde_spanned 1.0.3", - "toml_datetime 0.7.3", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", ] [[package]] @@ -2144,9 +2413,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -2162,16 +2440,16 @@ dependencies = [ "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow", + "winnow 1.0.4", ] [[package]] @@ -2182,15 +2460,15 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.4" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -2203,20 +2481,25 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.9.1", + "async-compression", + "bitflags 2.13.1", "bytes", + "futures-core", "futures-util", "http", "http-body", - "iri-string", + "http-body-util", "pin-project-lite", + "tokio", + "tokio-util", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -2233,9 +2516,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-core", @@ -2243,9 +2526,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -2264,9 +2547,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -2274,17 +2557,26 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -2306,13 +2598,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -2359,58 +2652,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2418,22 +2695,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn", - "wasm-bindgen-backend", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] @@ -2453,9 +2730,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ "js-sys", "wasm-bindgen", @@ -2473,9 +2750,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -2498,11 +2775,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2511,6 +2788,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.48.0" @@ -2531,11 +2814,11 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -2661,33 +2944,39 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "winnow" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ - "bitflags 2.9.1", + "memchr", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "yaml-rust2" -version = "0.10.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce2a4ff45552406d02501cea6c18d8a7e50228e7736a872951fe2fe75c91be7" +checksum = "631a50d867fafb7093e709d75aaee9e0e0d5deb934021fcea25ac2fe09edc51e" dependencies = [ "arraydeque", "encoding_rs", @@ -2696,11 +2985,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -2708,82 +2996,62 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -2792,9 +3060,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8" dependencies = [ "yoke", "zerofrom", @@ -2803,20 +3071,20 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "47402523226a02bfe5230160dc3ccc089aa6f6f19e7fcbb4e6f824bbb1b4aa62" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "zip" -version = "4.3.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" dependencies = [ "aes", "arbitrary", @@ -2825,7 +3093,7 @@ dependencies = [ "crc32fast", "deflate64", "flate2", - "getrandom 0.3.3", + "getrandom 0.3.4", "hmac", "indexmap", "liblzma", @@ -2841,15 +3109,21 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.1" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zopfli" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", @@ -2877,9 +3151,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 9ab029d..970a617 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rmkit" -version = "0.0.21" +version = "0.1.0" edition = "2021" homepage = "https://github.com/rmk-rs/rmkit" repository = "https://github.com/rmk-rs/rmkit" @@ -9,7 +9,11 @@ description = "rmkit is a toolkit set for RMK keyboard firmware" license = "Apache-2.0" [dependencies] -rmk-config = { version = "0.6.0" } +# TODO: back to crates.io versions (rmk-config = "0.7", rynk-kle) once they are +# published — a git dependency cannot be published. +rmk-config = { git = "https://github.com/rmk-rs/rmk", rev = "93726512f2fb383cdb5a419b09ff181c7c123b5f" } +# The KLE/Vial ↔ [layout] conversion engine; `rmkit layout` is CLI glue over it. +rynk-kle = { git = "https://github.com/rmk-rs/rmk", rev = "93726512f2fb383cdb5a419b09ff181c7c123b5f" } clap = { version = "4.5.23", features = ["derive", "string"] } toml = "0.9.8" serde = "1.0" diff --git a/README.md b/README.md index 0b140e4..e54173b 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,10 @@ Now rmkit can be used to generate RMK project directly from `keyboard.toml` and ```shell # macOS/linux - curl --proto '=https' --tlsv1.2 -LsSf https://github.com/rmk-rs/rmkit/releases/download/v0.0.1/rmkit-installer.sh | sh + curl --proto '=https' --tlsv1.2 -LsSf https://github.com/rmk-rs/rmkit/releases/latest/download/rmkit-installer.sh | sh # Windows(powershell) - powershell -ExecutionPolicy ByPass -c "irm https://github.com/rmk-rs/rmkit/releases/download/v0.0.1/rmkit-installer.ps1 | iex" + powershell -ExecutionPolicy ByPass -c "irm https://github.com/rmk-rs/rmkit/releases/latest/download/rmkit-installer.ps1 | iex" ``` 2. Create RMK project from `keyboard.toml` and `vial.json`: @@ -40,3 +40,39 @@ Now rmkit can be used to generate RMK project directly from `keyboard.toml` and ``` The available project template can be found at [rmk-template](https://github.com/rmk-rs/rmk-template) + +## Layout tools + +`rmkit layout` works with the physical `[layout]` section of a `keyboard.toml`. The conversion engine is the [`rynk-kle`](https://github.com/rmk-rs/rmk/tree/main/rynk/rynk-kle) library crate (which also compiles to a wasm package for the web); this CLI wraps it. + +Convert a [KLE](http://www.keyboard-layout-editor.com/) JSON export or a [Vial](https://get.vial.today/) definition (`vial.json`) into RMK's `[layout]` — key positions, cap sizes, split gaps, rotation, ISO/L-shaped caps, encoders, and VIA layout options are all converted, and the result is validated against RMK's own layout builder. KLE carries no keycodes, so author the `[keymap]` yourself: + +```shell +rmkit layout convert path/to/vial.json -o layout.toml # vial.json → [layout] +rmkit layout convert path/to/kle_export.json # raw KLE "Download JSON" export too +rmkit layout convert --to-vial keyboard.toml # reverse: [layout] → vial.json +``` + +Render a physical layout as box-drawing art, to check the geometry in a terminal without flashing anything. The input can be a `keyboard.toml`, or a `vial.json` / raw KLE export directly (converted on the fly); `--variant` picks one `[[layout.variant]]`: + +```shell +$ rmkit layout show keyboard.toml +variant 'default': 17 keys, 4u × 5u + +┌─────┬─────┬─────┬─────┐ +│ 0,0 │ 0,1 │ 0,2 │ 0,3 │ +│ │ │ │ │ +├─────┼─────┼─────┼─────┤ +│ 1,0 │ 1,1 │ 1,2 │ │ +│ │ │ │ │ +├─────┼─────┼─────┤ 1,3 │ +│ 2,0 │ 2,1 │ 2,2 │ │ +│ │ │ │ │ +├─────┼─────┼─────┼─────┤ +│ 3,0 │ 3,1 │ 3,2 │ │ +│ │ │ │ │ +├─────┴─────┼─────┤ 3,3 │ +│ 4,0 │ 4,1 │ │ +│ │ │ │ +└───────────┴─────┴─────┘ +``` diff --git a/keyboard.toml b/keyboard.toml index 0828fc3..e141082 100644 --- a/keyboard.toml +++ b/keyboard.toml @@ -4,28 +4,38 @@ product_name = "RMK Keyboard" vendor_id = 0x4c4b product_id = 0x4643 manufacturer = "haobo" -chip = "rp2040" +chip = "nrf52840" [layout] -# WARNING: Currently row2col/col2row is set in RMK's feature gate, configs here do nothing actually -# row2col = true rows = 4 cols = 3 +map = """ +(0,0) (0,1) (0,2) +(1,0) (1,1) (1,2) +(2,0) (2,1) (2,2) +(3,0) (3,1) (3,2) +""" + +[keymap] layers = 2 -keymap = [ - [ - ["A", "B", "C"], - ["Kc1", "Kc2", "Kc3"], - ["LCtrl", "MO(1)", "LShift"], - ["OSL(1)", "LT(2, Kc9)", "LM(1, LShift | LGui)"] - ], - [ - ["_", "TT(1)", "TG(2)"], - ["_", "_", "_"], - ["_", "_", "_"], - ["_", "_", "_"] - ], -] + +[[keymap.layer]] +name = "base" +keys = """ +A B C +Kc1 Kc2 Kc3 +LCtrl MO(1) LShift +OSL(1) LT(2, Kc9) LM(1, LShift | LGui) +""" + +[[keymap.layer]] +name = "fn" +keys = """ +_ TT(1) TG(2) +_ _ _ +_ _ _ +_ _ _ +""" [storage] @@ -42,8 +52,8 @@ row_offset = 0 col_offset = 0 ble_addr = [0x18, 0xe2, 0x21, 0x80, 0xc0, 0xc7] [split.central.matrix] -input_pins = ["P0_12", "P0_13"] -output_pins = ["P0_14", "P0_15"] +row_pins = ["P0_12", "P0_13"] +col_pins = ["P0_14", "P0_15"] [[split.peripheral]] rows = 2 @@ -52,14 +62,5 @@ row_offset = 2 col_offset = 2 ble_addr = [0x7e, 0xfe, 0x73, 0x9e, 0x66, 0xe3] [split.peripheral.matrix] -input_pins = ["P1_11", "P1_10"] -output_pins = ["P0_30"] - -# [[split.peripheral]] -# rows = 2 -# cols = 1 -# row_offset = 2 -# col_offset = 2 -# serial = [{ instance = "UART0", tx_pin = "PIN_0", rx_pin = "PIN_1" }] -# input_pins = ["PIN_9", "PIN_11"] -# output_pins = ["PIN_10"] +row_pins = ["P1_11", "P1_10"] +col_pins = ["P0_30"] diff --git a/src/args.rs b/src/args.rs index 8ac988e..0f433bf 100644 --- a/src/args.rs +++ b/src/args.rs @@ -62,4 +62,39 @@ pub enum Commands { #[arg(long)] keyboard_toml_path: String, }, + /// Physical-layout tools: convert KLE/Vial layouts and preview [layout] geometry + Layout { + #[command(subcommand)] + command: LayoutCommands, + }, +} + +#[derive(Subcommand, Debug)] +pub enum LayoutCommands { + /// Convert a KLE JSON export or vial.json into an RMK [layout] section (or back with --to-vial) + Convert { + /// Path to a KLE JSON export or a vial.json (a keyboard.toml with --to-vial) + input: String, + + /// Write the result to FILE instead of stdout + #[arg(short, long)] + output: Option, + + /// Reverse: a keyboard.toml's [layout] → a minimal vial.json + #[arg(long)] + to_vial: bool, + + /// Skip the rmk-config round-trip check (forward only) + #[arg(long)] + no_validate: bool, + }, + /// Render a physical layout (keyboard.toml, vial.json, or KLE export) as box-drawing art + Show { + /// Path to a keyboard.toml (or bare [layout] snippet), a vial.json, or a raw KLE JSON export + input: String, + + /// Render only this [[layout.variant]] (default: all) + #[arg(long)] + variant: Option, + }, } diff --git a/src/chip.rs b/src/chip.rs index 84bc386..e558580 100644 --- a/src/chip.rs +++ b/src/chip.rs @@ -27,6 +27,7 @@ pub(crate) fn get_chip_options(split: bool) -> Vec<&'static str> { "Pi Pico W", "esp32c3", "esp32c6", + "esp32h2", "esp32s3", ] } else { @@ -41,6 +42,7 @@ pub(crate) fn get_chip_options(split: bool) -> Vec<&'static str> { "esp32c3", "esp32s3", "esp32c6", + "esp32h2", "nice!nano_v2", "XIAO BLE", "nice!nano", diff --git a/src/keyboard_toml.rs b/src/keyboard_toml.rs index f33e385..7bb6bda 100644 --- a/src/keyboard_toml.rs +++ b/src/keyboard_toml.rs @@ -26,11 +26,10 @@ pub(crate) fn parse_keyboard_toml( target_dir: Option, ) -> Result> { let keyboard_toml_config = KeyboardTomlConfig::new_from_toml_path(keyboard_toml); + let hardware = keyboard_toml_config.hardware()?; + let host = keyboard_toml_config.host(); - let project_name = keyboard_toml_config - .get_device_config() - .name - .replace(" ", "_"); + let project_name = keyboard_toml_config.identity()?.name.replace(" ", "_"); let target_dir = if let Some(dir) = target_dir { dir } else { @@ -48,39 +47,30 @@ pub(crate) fn parse_keyboard_toml( // Check keyboard.toml - // Storage config - let storage_config = keyboard_toml_config.get_storage_config(); - if !storage_config.enabled { + if hardware.storage.is_none() { disabled_default_feature.push("storage".to_string()); } - // Defmt config - let dep_config = keyboard_toml_config.get_dependency_config(); - if !dep_config.defmt_log { + if !hardware.dependency.defmt_log { disabled_default_feature.push("defmt".to_string()); } - if !keyboard_toml_config.get_host_config().vial_enabled { + // Vial and Rynk are mutually exclusive, and `vial` is a default feature. + if host.rynk_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()); + enabled_feature.push("rynk".to_string()); + } else if !host.vial_enabled { + // No host protocol at all, so the lock gate has nothing to guard either. + disabled_default_feature.push("vial".to_string()); + disabled_default_feature.push("host_lock".to_string()); } - let board_config = keyboard_toml_config.get_board_config().unwrap(); - let matrix_type = match board_config { - rmk_config::BoardConfig::Split(_) => "split".to_string(), - rmk_config::BoardConfig::UniBody(_) => "normal".to_string(), + let matrix_type = match hardware.board { + rmk_config::resolved::hardware::BoardConfig::Split(_) => "split".to_string(), + rmk_config::resolved::hardware::BoardConfig::UniBody(_) => "normal".to_string(), }; - let chip_model = keyboard_toml_config.get_chip_model().unwrap(); + let chip_model = hardware.chip; let chip_or_board = if let Some(board) = chip_model.board { board } else { diff --git a/src/layout_cmd.rs b/src/layout_cmd.rs new file mode 100644 index 0000000..782b998 --- /dev/null +++ b/src/layout_cmd.rs @@ -0,0 +1,263 @@ +//! `rmkit layout` — CLI over the `rynk-kle` conversion library. +//! +//! `convert` turns a physical keyboard layout — a raw +//! [KLE](http://keyboard-layout-editor.com) JSON export or a Vial keyboard +//! definition (`vial.json`) — into the `[layout]` section of an RMK/Rynk +//! `keyboard.toml`, or the reverse with `--to-vial`. Neither input carries +//! keycodes, so no `[keymap]` is emitted — author it yourself against the +//! generated map. +//! +//! `show` renders the physical layout as Unicode box-drawing text, for +//! checking the geometry in a terminal. It takes a keyboard.toml — or a +//! vial.json / raw KLE export directly, converting it on the fly. +//! +//! All parsing, conversion, and blob decoding live in `rynk_kle`; this module +//! only adds file IO, stderr reporting, and the terminal renderer. + +use rynk_kle::layout::{LayoutInfo, Variant}; +use serde_json::Value; + +use crate::render; + +/// `rmkit layout convert`: KLE export or vial.json → `[layout]` (or, with +/// `to_vial`, a keyboard.toml's `[layout]` → a minimal vial.json). +pub fn convert( + input: &str, + output: Option<&str>, + to_vial: bool, + validate: bool, +) -> Result<(), String> { + if to_vial { + let text = + std::fs::read_to_string(input).map_err(|e| format!("cannot read {input}: {e}"))?; + let vial = rynk_kle::keyboard_toml_to_vial(&text)?; + let out = format!( + "{}\n", + serde_json::to_string_pretty(&vial).map_err(|e| e.to_string())? + ); + match output { + Some(path) => { + std::fs::write(path, &out).map_err(|e| format!("cannot write {path}: {e}"))?; + eprintln!("wrote {path}"); + } + None => print!("{out}"), + } + return Ok(()); + } + + let text = std::fs::read_to_string(input).map_err(|e| format!("cannot read {input}: {e}"))?; + let root: Value = + serde_json::from_str(&text).map_err(|e| format!("invalid JSON in {input}: {e}"))?; + let generated = rynk_kle::convert_kle(&root)?; + + // Round-trip the generated [layout] through RMK's own builder. + let mut validation_error = None; + if validate { + match rynk_kle::decode_layout(&generated.layout_toml) { + Ok(info) => eprintln!( + "validation: OK ({} variant{} decoded)", + info.variants.len(), + if info.variants.len() == 1 { "" } else { "s" } + ), + Err(e) => validation_error = Some(e), + } + } + + for w in &generated.warnings { + eprintln!("warning: {w}"); + } + + let header = format!( + "# Generated from {input} by rmkit — review the geometry. The source\n\ + # carries no keycodes, so author the [keymap] yourself: its `keys` follow the\n\ + # map's key order, plus one [\"cw\", \"ccw\"] pair per encoder in `encoders`.\n\n" + ); + let out = header + &generated.layout_toml; + match output { + Some(path) => { + std::fs::write(path, &out).map_err(|e| format!("cannot write {path}: {e}"))?; + eprintln!("wrote {path}"); + } + None => print!("{out}"), + } + + if let Some(e) = validation_error { + return Err(format!( + "the generated layout did not pass rmk-config validation: {e}\n\ + (output was still written; please report this as a converter bug)" + )); + } + Ok(()) +} + +/// Any supported `show` input → decoded [`LayoutInfo`]. Content that parses as +/// JSON is a vial.json / raw KLE export and goes through the same conversion +/// `convert` performs; anything else is treated as keyboard.toml. +fn decode_input(input: &str, text: &str) -> Result { + match serde_json::from_str::(text) { + Ok(root) => { + let generated = rynk_kle::convert_kle(&root)?; + for w in &generated.warnings { + eprintln!("warning: {w}"); + } + rynk_kle::decode_layout(&generated.layout_toml) + } + // Not JSON but named like it: report the JSON error, not a TOML one. + Err(e) if input.ends_with(".json") => Err(format!("invalid JSON in {input}: {e}")), + Err(_) => rynk_kle::decode_layout(text), + } +} + +/// `rmkit layout show`: print the physical layout of a keyboard.toml — or, +/// directly, of a vial.json / raw KLE export — as box-drawing art. Keys are +/// labeled with their matrix position `row,col`; encoder knobs are drawn with +/// rounded corners and labeled `E` plus `↺ ↻`. A character grid cannot draw +/// rotation, so rotated keys render axis-aligned with the angle printed inside. +pub fn show(input: &str, variant: Option<&str>) -> Result<(), String> { + let text = std::fs::read_to_string(input).map_err(|e| format!("cannot read {input}: {e}"))?; + let info = decode_input(input, &text)?; + + let variants: Vec<(usize, &Variant)> = match variant { + Some(name) => { + let idx = info + .variants + .iter() + .position(|v| v.name == name) + .ok_or_else(|| { + let names: Vec<&str> = info.variants.iter().map(|v| v.name.as_str()).collect(); + format!("no variant '{name}' (available: {})", names.join(", ")) + })?; + vec![(idx, &info.variants[idx])] + } + None => info.variants.iter().enumerate().collect(), + }; + + for (idx, v) in variants { + // The default marker only means something when there's a choice. + let is_default = info.variants.len() > 1 && idx == info.default_variant as usize; + print!("{}", render::render_variant(v, is_default)); + println!(); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use rynk_kle::decode_layout; + + #[test] + fn two_keys_snapshot() { + let info = decode_layout("rows = 1\ncols = 2\nmap = \"(0,0) (0,1,@2u)\"").unwrap(); + let art = render::render_variant(&info.variants[0], false); + let expected = "\ +variant 'default': 2 keys, 3u × 1u + +┌─────┬───────────┐ +│ 0,0 │ 0,1 │ +│ │ │ +└─────┴───────────┘ +"; + assert_eq!(art, expected); + } + + #[test] + fn numpad_snapshot() { + // The nrf52840_ble example numpad: 2u-tall Plus/Enter (@2u_tall) + // spanning two rows and a 2u-wide zero — pins the junction merging. + let toml = r#" +rows = 5 +cols = 4 +map = """ +(0,0) (0,1) (0,2) (0,3) +(1,0) (1,1) (1,2) (1,3,@2u_tall) +(2,0) (2,1) (2,2) +(3,0) (3,1) (3,2) (3,3,@2u_tall) +(4,0,@2u) (4,1) +""" +"#; + let art = render::render_variant(&decode_layout(toml).unwrap().variants[0], false); + let expected = "\ +variant 'default': 17 keys, 4u × 5u + +┌─────┬─────┬─────┬─────┐ +│ 0,0 │ 0,1 │ 0,2 │ 0,3 │ +│ │ │ │ │ +├─────┼─────┼─────┼─────┤ +│ 1,0 │ 1,1 │ 1,2 │ │ +│ │ │ │ │ +├─────┼─────┼─────┤ 1,3 │ +│ 2,0 │ 2,1 │ 2,2 │ │ +│ │ │ │ │ +├─────┼─────┼─────┼─────┤ +│ 3,0 │ 3,1 │ 3,2 │ │ +│ │ │ │ │ +├─────┴─────┼─────┤ 3,3 │ +│ 4,0 │ 4,1 │ │ +│ │ │ │ +└───────────┴─────┴─────┘ +"; + assert_eq!(art, expected); + } + + #[test] + fn encoder_and_rotation_render() { + // The [0.5] gap keeps the encoder freestanding — adjacent boxes would + // merge its left corners into ┬/┴ junctions instead of ╭/╰. + let info = decode_layout( + "rows = 1\ncols = 1\nmap = \"(0,0,@t) [0.5] (e,0)\"\n[shapes]\nt = { r = 15.0 }", + ) + .unwrap(); + let art = render::render_variant(&info.variants[0], false); + assert!(art.contains("15°"), "rotation angle shown:\n{art}"); + assert!(art.contains("E0"), "encoder label shown:\n{art}"); + assert!(art.contains("↺ ↻"), "rotary arrows shown:\n{art}"); + assert!( + art.contains('╭') && art.contains('╯'), + "encoder corners rounded:\n{art}" + ); + } + + #[test] + fn iso_enter_two_rects_render() { + // @iso_enter pokes above its row (negative y) — exercises the origin offset. + let info = decode_layout("rows = 1\ncols = 2\nmap = \"(0,0) (0,1,@iso_enter)\"").unwrap(); + let v = &info.variants[0]; + assert!(v.keys[1].rect2.is_some()); + let art = render::render_variant(v, false); + assert!(art.contains("0,0") && art.contains("0,1"), "{art}"); + } + + #[test] + fn show_accepts_vial_and_raw_kle_json() { + // A vial.json-shaped input: `row,col` legends, matrix dims, a 2u cap. + let vial = r#"{"matrix": {"rows": 1, "cols": 2}, + "layouts": {"keymap": [["0,0", {"w": 2.0}, "0,1"]]}}"#; + let info = decode_input("vial.json", vial).unwrap(); + let keys = &info.variants[0].keys; + assert_eq!(keys.len(), 2); + assert!((keys[1].rect.w - 2.0).abs() < 1e-3); + + // A raw KLE "Download JSON" export: metadata object first, label + // legends only — positions are assigned row-major. + let kle = r#"[{"name": "plain"}, ["Esc", "Q"], [{"w": 1.5}, "Tab"]]"#; + let info = decode_input("kle_export.json", kle).unwrap(); + let v = &info.variants[0]; + assert_eq!(v.keys.len(), 3); + assert_eq!((v.keys[2].row, v.keys[2].col), (1, 0)); + assert!((v.keys[2].rect.w - 1.5).abs() < 1e-3); + } + + #[test] + fn show_input_errors_match_the_format() { + // Broken content named .json reports the JSON error, not a TOML one. + let e = decode_input("x.json", "{not json").unwrap_err(); + assert!(e.contains("invalid JSON"), "{e}"); + // Anything else falls back to the TOML path. + let e = decode_input("x.toml", "= bad").unwrap_err(); + assert!(e.contains("invalid TOML"), "{e}"); + // Valid JSON that isn't a layout still gets the shape hint. + let e = decode_input("x.json", "{\"a\": 1}").unwrap_err(); + assert!(e.contains("layouts.keymap"), "{e}"); + } +} diff --git a/src/main.rs b/src/main.rs index 5bcaf57..56e108d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,8 @@ use zip::ZipArchive; mod args; mod chip; mod keyboard_toml; +mod layout_cmd; +mod render; mod version; #[tokio::main] @@ -46,6 +48,24 @@ async fn main() -> Result<(), Box> { println!("{}", project_info.project_name); Ok(()) } + args::Commands::Layout { command } => { + let result = match command { + args::LayoutCommands::Convert { + input, + output, + to_vial, + no_validate, + } => layout_cmd::convert(&input, output.as_deref(), to_vial, !no_validate), + args::LayoutCommands::Show { input, variant } => layout_cmd::show(&input, variant.as_deref()), + }; + // The layout tools speak plain stderr + exit code (their output is + // piped/captured), not the interactive error style of create/init. + if let Err(e) = result { + eprintln!("error: {e}"); + std::process::exit(1); + } + Ok(()) + } } } @@ -162,7 +182,7 @@ async fn download_project_template( project_info: &ProjectInfo, commit_or_branch: &str, ) -> Result<(), Box> { - let user = "HaoboGu"; + let user = "rmk-rs"; let repo = "rmk-template"; // Build download URL diff --git a/src/render.rs b/src/render.rs new file mode 100644 index 0000000..ab7a316 --- /dev/null +++ b/src/render.rs @@ -0,0 +1,307 @@ +//! Render a decoded layout variant as Unicode box-drawing text. +//! +//! Key-units map onto a fixed character grid (1u = 6 columns × 3 rows, roughly +//! square in a terminal). Every box edge is drawn into a per-cell direction +//! bitmask, so borders shared between keys merge into proper `┬`/`├`/`┼` +//! junctions. Labels overlay the interior afterwards. A character grid cannot +//! draw rotation: rotated keys render axis-aligned at their position with the +//! angle printed inside. + +use rynk_kle::layout::Variant; + +/// Character cells per key-unit. +const SX: f32 = 6.0; +const SY: f32 = 3.0; + +/// Per-cell line-direction bits; `GLYPHS` is indexed by their combination. +const N: u8 = 1; +const S: u8 = 2; +const E: u8 = 4; +const W: u8 = 8; + +const GLYPHS: [char; 16] = [ + ' ', '╵', '╷', '│', '╶', '└', '┌', '├', '╴', '┘', '┐', '┤', '─', '┴', '┬', '┼', +]; + +/// A rectangle in character-cell coordinates, borders inclusive. +#[derive(Clone, Copy)] +struct CellBox { + r0: i32, + c0: i32, + r1: i32, + c1: i32, +} + +impl CellBox { + /// From a center + size in key-units; `(ox, oy)` is the canvas origin. + fn new(x: f32, y: f32, w: f32, h: f32, ox: f32, oy: f32) -> Self { + let c0 = ((x - w / 2.0 - ox) * SX).round() as i32; + let r0 = ((y - h / 2.0 - oy) * SY).round() as i32; + // Clamp to at least one cell so a degenerate shape still draws a box. + let c1 = (((x + w / 2.0 - ox) * SX).round() as i32).max(c0 + 1); + let r1 = (((y + h / 2.0 - oy) * SY).round() as i32).max(r0 + 1); + CellBox { r0, c0, r1, c1 } + } + + fn strictly_contains(&self, r: i32, c: i32) -> bool { + r > self.r0 && r < self.r1 && c > self.c0 && c < self.c1 + } +} + +/// One drawable item: a key (optionally two rectangles) or an encoder. +struct Item { + b: CellBox, + b2: Option, + round: bool, + label: Vec, +} + +struct Canvas { + w: usize, + h: usize, + line: Vec, + round: Vec, + text: Vec, +} + +impl Canvas { + fn set(&mut self, r: i32, c: i32, bits: u8, round: bool) { + if (0..self.h as i32).contains(&r) && (0..self.w as i32).contains(&c) { + let i = r as usize * self.w + c as usize; + self.line[i] |= bits; + self.round[i] |= round; + } + } + + /// Erase line bits strictly inside `b`: keys that physically overlap (e.g. + /// rotated thumbs drawn axis-aligned) occlude what's under them, painter's + /// style, while shared borders still merge into junctions. + fn clear_inside(&mut self, b: CellBox) { + for r in b.r0 + 1..b.r1 { + for c in b.c0 + 1..b.c1 { + if (0..self.h as i32).contains(&r) && (0..self.w as i32).contains(&c) { + let i = r as usize * self.w + c as usize; + self.line[i] = 0; + self.round[i] = false; + } + } + } + } + + /// Draw a box outline. `skip` erases cells interior to the sibling rect of + /// a two-rect key, so the pair renders as its union silhouette. + fn draw_box(&mut self, b: CellBox, round: bool, skip: impl Fn(i32, i32) -> bool) { + for c in b.c0..=b.c1 { + let mut bits = 0; + if c > b.c0 { + bits |= W; + } + if c < b.c1 { + bits |= E; + } + let end = c == b.c0 || c == b.c1; + if !skip(b.r0, c) { + self.set(b.r0, c, bits | if end { S } else { 0 }, round); + } + if !skip(b.r1, c) { + self.set(b.r1, c, bits | if end { N } else { 0 }, round); + } + } + for r in b.r0 + 1..b.r1 { + if !skip(r, b.c0) { + self.set(r, b.c0, N | S, round); + } + if !skip(r, b.c1) { + self.set(r, b.c1, N | S, round); + } + } + } + + /// Center `lines` in the interior of `b`, clipped to fit. + fn label(&mut self, b: CellBox, lines: &[String]) { + let iw = (b.c1 - b.c0 - 1).max(0) as usize; + let ih = (b.r1 - b.r0 - 1).max(0) as usize; + let n = lines.len().min(ih); + let r_start = b.r0 + 1 + ((ih - n) / 2) as i32; + for (i, line) in lines[..n].iter().enumerate() { + let chars: Vec = line.chars().collect(); + let len = chars.len().min(iw); + let c_start = b.c0 + 1 + ((iw - len) / 2) as i32; + for (j, &ch) in chars[..len].iter().enumerate() { + let (r, c) = (r_start + i as i32, c_start + j as i32); + if (0..self.h as i32).contains(&r) && (0..self.w as i32).contains(&c) { + self.text[r as usize * self.w + c as usize] = ch; + } + } + } + } +} + +/// Render one variant: a one-line stats header, a blank line, then the art. +pub fn render_variant(v: &Variant, is_default: bool) -> String { + let mut header = format!("variant '{}'", v.name); + if is_default { + header.push_str(" (default)"); + } + if v.keys.is_empty() && v.encoders.is_empty() { + return format!("{header}: empty (all keys hidden)\n"); + } + + // Bounds over every rectangle, in key-units. + let mut min = (f32::MAX, f32::MAX); + let mut max = (f32::MIN, f32::MIN); + let mut grow = |x: f32, y: f32, w: f32, h: f32| { + min.0 = min.0.min(x - w / 2.0); + min.1 = min.1.min(y - h / 2.0); + max.0 = max.0.max(x + w / 2.0); + max.1 = max.1.max(y + h / 2.0); + }; + for k in &v.keys { + grow(k.rect.x, k.rect.y, k.rect.w, k.rect.h); + if let Some(r2) = &k.rect2 { + grow(r2.x, r2.y, r2.w, r2.h); + } + } + for e in &v.encoders { + // Encoders are fixed 1u knobs: center only. + grow(e.x, e.y, 1.0, 1.0); + } + + let n = v.keys.len(); + header.push_str(&format!(": {n} key{}", if n == 1 { "" } else { "s" })); + let n = v.encoders.len(); + if n > 0 { + header.push_str(&format!(", {n} encoder{}", if n == 1 { "" } else { "s" })); + } + // Snap the size to 0.01u so f32 walk noise doesn't print as 4.0500002. + header.push_str(&format!( + ", {}u × {}u", + ((max.0 - min.0) * 100.0).round() / 100.0, + ((max.1 - min.1) * 100.0).round() / 100.0 + )); + + let items: Vec = v + .keys + .iter() + .map(|k| { + let mut label = vec![format!("{},{}", k.row, k.col)]; + if k.r != 0.0 { + label.push(format!("{}°", k.r)); + } + Item { + b: CellBox::new(k.rect.x, k.rect.y, k.rect.w, k.rect.h, min.0, min.1), + b2: k + .rect2 + .as_ref() + .map(|r2| CellBox::new(r2.x, r2.y, r2.w, r2.h, min.0, min.1)), + round: false, + label, + } + }) + .chain(v.encoders.iter().map(|e| { + // A fixed 1u knob, never resized or angled; the arrows mark it rotary. + let label = vec![format!("E{}", e.id), "↺ ↻".to_string()]; + Item { + b: CellBox::new(e.x, e.y, 1.0, 1.0, min.0, min.1), + b2: None, + round: true, + label, + } + })) + .collect(); + + let (mut w, mut h) = (0i32, 0i32); + for b in items.iter().flat_map(|i| [Some(i.b), i.b2]).flatten() { + w = w.max(b.c1 + 1); + h = h.max(b.r1 + 1); + } + let (w, h) = (w as usize, h as usize); + let mut canvas = Canvas { + w, + h, + line: vec![0; w * h], + round: vec![false; w * h], + text: vec!['\0'; w * h], + }; + + for it in &items { + canvas.clear_inside(it.b); + match it.b2 { + None => canvas.draw_box(it.b, it.round, |_, _| false), + Some(b2) => { + canvas.clear_inside(b2); + canvas.draw_box(it.b, it.round, |r, c| b2.strictly_contains(r, c)); + canvas.draw_box(b2, it.round, |r, c| it.b.strictly_contains(r, c)); + } + } + } + // Occlusion chops edges mid-run, leaving direction bits that point at + // nothing. Prune to a fixpoint: a bit survives only if the neighbor it + // points at holds the reciprocal bit, so remnants end in clean junctions. + loop { + let snap = canvas.line.clone(); + let at = |r: i32, c: i32| -> u8 { + if (0..h as i32).contains(&r) && (0..w as i32).contains(&c) { + snap[r as usize * w + c as usize] + } else { + 0 + } + }; + let mut changed = false; + for r in 0..h as i32 { + for c in 0..w as i32 { + let i = r as usize * w + c as usize; + let mut bits = snap[i]; + if bits & N != 0 && at(r - 1, c) & S == 0 { + bits &= !N; + } + if bits & S != 0 && at(r + 1, c) & N == 0 { + bits &= !S; + } + if bits & E != 0 && at(r, c + 1) & W == 0 { + bits &= !E; + } + if bits & W != 0 && at(r, c - 1) & E == 0 { + bits &= !W; + } + if bits != snap[i] { + canvas.line[i] = bits; + changed = true; + } + } + } + if !changed { + break; + } + } + + // Labels go on top of all lines. + for it in &items { + canvas.label(it.b, &it.label); + } + + let mut out = header; + out.push_str("\n\n"); + for r in 0..h { + let mut row = String::with_capacity(w); + for c in 0..w { + let i = r * w + c; + let ch = if canvas.text[i] != '\0' { + canvas.text[i] + } else { + let bits = canvas.line[i]; + match bits { + b if canvas.round[i] && b == N | E => '╰', + b if canvas.round[i] && b == S | E => '╭', + b if canvas.round[i] && b == N | W => '╯', + b if canvas.round[i] && b == S | W => '╮', + b => GLYPHS[b as usize], + } + }; + row.push(ch); + } + out.push_str(row.trim_end()); + out.push('\n'); + } + out +} diff --git a/tests/cli.rs b/tests/cli.rs new file mode 100644 index 0000000..fc3843c --- /dev/null +++ b/tests/cli.rs @@ -0,0 +1,183 @@ +//! End-to-end: run the built binary (`rmkit layout convert`) on fixture inputs +//! (vial.json and raw KLE exports) and check the output (including that the +//! generated `[layout]` passes rmk-config validation, which the command reports +//! on stderr and exits non-zero on failure). + +use std::process::Command; + +fn run(fixture: &str) -> std::process::Output { + let path = format!("{}/tests/fixtures/{fixture}", env!("CARGO_MANIFEST_DIR")); + Command::new(env!("CARGO_BIN_EXE_rmkit")) + .args(["layout", "convert", &path]) + .output() + .expect("failed to run rmkit") +} + +#[test] +fn ansi60_split_backspace_converts_and_validates() { + let out = run("ansi60_splitbs.json"); + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + + assert!(out.status.success(), "converter failed:\n{stderr}"); + // Validation ran and passed (exit 0 already implies it, but be explicit). + assert!(stderr.contains("validation: OK"), "stderr:\n{stderr}"); + + // Matrix size and the stock-width caps come through without shape defs. + assert!(stdout.contains("rows = 5")); + assert!(stdout.contains("cols = 15")); + assert!(stdout.contains("(0,13,@2u)")); // default 2u backspace + assert!(stdout.contains("(1,0,@1.5u)")); // 1.5u tab + assert!(stdout.contains("(2,0,@1.75u)")); // 1.75u caps + assert!(stdout.contains("(4,3,@6.25u)")); // 6.25u space + // Caps are all stock widths; the only generated shape is the 1u reset the + // split-backspace variant uses to shrink (0,13). + assert!(stdout.contains("s1 = { w = 1.0 }")); + + // The split-backspace option became a variant that hides the extra key by + // default and shows/reshapes it in the alternate. + assert!(stdout.contains("[[layout.variant]]")); + assert!(stdout.contains("name = \"default\"")); + assert!(stdout.contains("name = \"Split_Backspace\"")); + assert!(stdout.contains("hidden = [\"(0,14)\"]")); + + // KLE carries no keycodes — the output is geometry only, no [keymap] section + // (the header comment still points the user at authoring one). + assert!(!stdout.contains("\n[keymap]")); + assert!(!stdout.contains("[[keymap.layer]]")); +} + +#[test] +fn raw_kle_export_auto_assigns_matrix() { + // A KLE "Download JSON" file: bare array, metadata object first, label + // legends only — the matrix is derived row-major with a warning. + let out = run("kle_export.json"); + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + + assert!(out.status.success(), "converter failed:\n{stderr}"); + assert!(stderr.contains("validation: OK"), "stderr:\n{stderr}"); + assert!( + stderr.contains("row-major"), + "expected the auto-assign warning, got:\n{stderr}" + ); + + assert!(stdout.contains("rows = 3")); + assert!(stdout.contains("cols = 4")); + assert!(stdout.contains("(0,0) (0,1) (0,2) (0,3)")); + assert!(stdout.contains("(1,0,@1.5u)")); // 1.5u Tab + assert!(stdout.contains("(2,1,@2u)")); // 2u space +} + +#[test] +fn bare_kle_array_with_matrix_legends_converts() { + // The same KLE array a vial.json would embed, passed directly: `row,col` + // legends win over the row-major fallback, and the undeclared matrix is + // derived silently. + let out = run("kle_rowcol.json"); + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + + assert!(out.status.success(), "converter failed:\n{stderr}"); + assert!(!stderr.contains("warning:"), "stderr:\n{stderr}"); + assert!(stdout.contains("rows = 2")); + assert!(stdout.contains("cols = 3")); + assert!(stdout.contains("(0,0) (0,1) (0,2)")); + assert!(stdout.contains("(1,0,@2u) (1,2)")); // legends place (1,2) after the 2u key +} + +#[test] +fn missing_keymap_is_a_clean_error() { + // A JSON file that isn't a Vial definition should fail with a helpful message. + let out = Command::new(env!("CARGO_BIN_EXE_rmkit")) + .args(["layout", "convert"]) + .arg(format!("{}/Cargo.toml", env!("CARGO_MANIFEST_DIR"))) + .output() + .expect("failed to run"); + assert!(!out.status.success()); + let stderr = String::from_utf8_lossy(&out.stderr); + assert!(stderr.contains("error:"), "stderr:\n{stderr}"); +} + +#[test] +fn converted_toml_fixtures_are_up_to_date() { + // Every JSON fixture has a committed `.toml` golden next to it: the exact + // `layout convert` output. After changing the converter, regenerate with + // for f in tests/fixtures/*.json; do + // cargo run -- layout convert "$f" -o "${f%.json}.toml"; done + // (from the crate root, so the generated-from header stays relative). + let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures"); + let mut checked = 0; + for entry in std::fs::read_dir(&dir).unwrap().flatten() { + let json = entry.path(); + if !json.extension().is_some_and(|e| e == "json") { + continue; + } + let golden = json.with_extension("toml"); + let expected = std::fs::read_to_string(&golden) + .unwrap_or_else(|_| panic!("missing golden {golden:?} — regenerate (see comment above)")); + let name = json.file_name().unwrap().to_string_lossy(); + let out = Command::new(env!("CARGO_BIN_EXE_rmkit")) + .current_dir(env!("CARGO_MANIFEST_DIR")) + .args(["layout", "convert"]) + .arg(format!("tests/fixtures/{name}")) + .output() + .expect("failed to run rmkit"); + assert!(out.status.success(), "{}", String::from_utf8_lossy(&out.stderr)); + let stdout = String::from_utf8_lossy(&out.stdout); + assert_eq!(stdout, expected, "stale golden for {name} — regenerate (see comment above)"); + checked += 1; + } + assert!(checked >= 5, "expected the committed fixture pairs, found {checked}"); +} + +#[test] +fn layout_show_accepts_vial_and_kle_json() { + let show = |fixture: &str, extra: &[&str]| { + let path = format!("{}/tests/fixtures/{fixture}", env!("CARGO_MANIFEST_DIR")); + Command::new(env!("CARGO_BIN_EXE_rmkit")) + .args(["layout", "show", &path]) + .args(extra) + .output() + .expect("failed to run rmkit") + }; + + // A vial.json renders directly, without converting to keyboard.toml first. + let out = show("corne.json", &[]); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(out.status.success(), "{}", String::from_utf8_lossy(&out.stderr)); + assert!(stdout.contains("42 keys"), "stdout:\n{stdout}"); + assert!(stdout.contains("│ 0,0 │"), "stdout:\n{stdout}"); + + // VIA layout options become variants, so --variant works on a vial.json. + let out = show("ansi60_splitbs.json", &["--variant", "Split_Backspace"]); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(out.status.success(), "{}", String::from_utf8_lossy(&out.stderr)); + assert!(stdout.contains("variant 'Split_Backspace'"), "stdout:\n{stdout}"); + + // A raw KLE export renders too, with the row-major fallback warning. + let out = show("kle_export.json", &[]); + let stderr = String::from_utf8_lossy(&out.stderr); + assert!(out.status.success(), "{stderr}"); + assert!(stderr.contains("row-major"), "stderr:\n{stderr}"); +} + +#[test] +fn layout_show_renders_box_art() { + // `layout show` on a bare map snippet prints the box-drawing art. + let dir = std::env::temp_dir().join("rmkit_cli_show_test"); + std::fs::create_dir_all(&dir).unwrap(); + let path = dir.join("layout.toml"); + std::fs::write(&path, "rows = 1\ncols = 2\nmap = \"(0,0) (0,1)\"\n").unwrap(); + + let out = Command::new(env!("CARGO_BIN_EXE_rmkit")) + .args(["layout", "show"]) + .arg(&path) + .output() + .expect("failed to run"); + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + assert!(out.status.success(), "show failed:\n{stderr}"); + assert!(stdout.contains("2 keys"), "stdout:\n{stdout}"); + assert!(stdout.contains("┌─────┬─────┐"), "stdout:\n{stdout}"); +} diff --git a/tests/fixtures/BAlice65_vial.json b/tests/fixtures/BAlice65_vial.json new file mode 100644 index 0000000..43257ce --- /dev/null +++ b/tests/fixtures/BAlice65_vial.json @@ -0,0 +1,85 @@ +{ + "name": "BAlice65 BT", + "vendorId": "0xFEED", + "productId": "0x1120", + "lighting": "none", + "matrix": { + "rows": 5, + "cols": 17 + }, + "layouts": { + "keymap": [ + [{"x":0.5},"0,0",{"x":16.11,"w":2},"0,15",{"x":0.64},"0,16","0,0\n\n\n\n\n\n\n\n\ne","0,1\n\n\n\n\n\n\n\n\ne"], + [{"x":18.42,"w":1.5},"1,15"], + [{"y":-0.75,"x":20.75},"3,15"], + [{"y":-0.75},"1,0"], + [{"y":-0.5,"x":18,"w":2.25},"2,14"], + [{"y":-0.75,"x":20.75},"3,16"], + [{"y":-0.75},"2,0"], + [{"y":-0.5,"x":17.75,"w":1.75},"2,15"], + [{"y":-0.75,"x":19.75},"4,14"], + [{"y":-0.75},"2,1"], + [{"y":-0.5,"x":1.55,"w":1.25},"4,0"], + [{"y":-0.75,"x":18.75},"4,13","4,15","4,16"], + [{"r":0.85,"rx":2.1,"ry":28.5,"y":-26.5,"x":-0.6,"w":1.75},"2,2"], + [{"r":1,"ry":7.5,"y":-4.5,"x":-0.6,"w":2.25},"3,2"], + [{"r":1.45,"ry":28.5,"y":-27.5,"x":-0.6,"w":1.5},"1,1"], + [{"r":1.9,"y":-2,"x":-0.6},"0,1"], + [{"r":4,"y":-1,"x":-0.6},"0,2"], + [{"r":4.7,"x":-0.6},"1,2"], + [{"r":4.8,"x":-0.6},"2,3"], + [{"r":5.25,"y":1,"x":-0.6,"w":1.25},"4,1"], + [{"r":5.4,"y":-2,"x":-0.6},"3,3"], + [{"r":6.1,"y":-4,"x":-0.6},"0,3"], + [{"r":6.9,"x":-0.6},"1,3"], + [{"r":7.1,"x":-0.6},"2,4"], + [{"r":7.8,"x":-0.6},"3,4"], + [{"r":8.2,"y":-4,"x":-0.6},"0,4"], + [{"r":8.35,"y":3,"x":-0.6,"w":1.25},"4,4"], + [{"r":9.1,"y":-4,"x":-0.6},"1,4"], + [{"r":9.4,"x":-0.6},"2,5"], + [{"r":10.2,"x":-0.6},"3,5"], + [{"r":10.3,"y":-4,"x":-0.6},"0,5"], + [{"r":11.3,"x":-0.6},"1,5"], + [{"r":11.7,"x":-0.6},"2,6"], + [{"r":12.4,"y":-3,"x":-0.6},"0,6"], + [{"r":12.5,"ry":26.5,"y":-22.52,"x":-0.6,"w":2.25},"4,5"], + [{"r":12.6,"ry":28.5,"y":-25.5,"x":-0.6},"3,6"], + [{"r":13.5,"y":-3,"x":-0.6},"1,6"], + [{"r":14,"x":-0.6},"2,7"], + [{"r":14.5,"y":-3,"x":-0.6},"0,7"], + [{"r":15,"y":2,"x":-0.6},"3,7"], + [{"r":15.7,"y":-3,"x":-0.6},"1,7"], + [{"r":-15.5,"rx":18.6,"y":-28.5,"x":-0.6},"0,8"], + [{"r":-15,"y":2,"x":-0.6},"3,8"], + [{"r":-14.5,"y":-3,"x":-0.6},"1,8"], + [{"r":-13.8,"x":-0.6},"2,8"], + [{"r":-13.4,"y":-3,"x":-0.6},"0,9"], + [{"r":-12.6,"y":2,"x":-0.6},"3,9"], + [{"r":-12.5,"ry":28,"y":-23.98,"x":-1.45,"w":2.75},"4,8"], + [{"r":-12.3,"ry":28.5,"y":-27.5,"x":-0.6},"1,9"], + [{"r":-11.5,"x":-0.6},"2,9"], + [{"r":-11.3,"y":-3,"x":-0.6},"0,10"], + [{"r":-10.2,"y":2,"x":-0.6},"3,10"], + [{"r":-10.1,"y":-3,"x":-0.6},"1,10"], + [{"r":-9.2,"y":-2,"x":-0.6},"0,11"], + [{"y":1,"x":-0.6},"2,10"], + [{"r":-7.9,"y":-2,"x":-0.6},"1,11"], + [{"r":-7.8,"y":1,"x":-0.6},"3,11"], + [{"r":-7.55,"x":-0.6,"w":1.25},"4,10"], + [{"r":-7.1,"y":-5,"x":-0.6},"0,12"], + [{"r":-6.9,"y":1,"x":-0.6},"2,11"], + [{"r":-5.7,"y":-2,"x":-0.6},"1,12"], + [{"r":-5.4,"y":1,"x":-0.6},"3,12"], + [{"r":-5,"y":-4,"x":-0.6},"0,13"], + [{"r":-4.6,"y":1,"x":-0.6},"2,12"], + [{"r":-4.45,"y":1,"x":-0.6},"4,11"], + [{"r":-3.5,"y":-4,"x":-0.6},"1,13"], + [{"r":-3,"y":1,"x":-0.6},"3,13"], + [{"r":-2.9,"y":-4,"x":-0.6},"0,14"], + [{"r":-2.3,"y":1,"x":-0.6},"2,13"], + [{"r":-1.95,"y":1,"x":-0.6},"4,12"], + [{"r":-1.3,"y":-4,"x":-0.6},"1,14"] + ] + } +} diff --git a/tests/fixtures/BAlice65_vial.toml b/tests/fixtures/BAlice65_vial.toml new file mode 100644 index 0000000..56b8393 --- /dev/null +++ b/tests/fixtures/BAlice65_vial.toml @@ -0,0 +1,135 @@ +# Generated from tests/fixtures/BAlice65_vial.json by rmkit — review the geometry. The source +# carries no keycodes, so author the [keymap] yourself: its `keys` follow the +# map's key order, plus one ["cw", "ccw"] pair per encoder in `encoders`. + +[layout] +rows = 5 +cols = 17 +map = """ +[0.5] (0,0) [16.11] (0,15,@2u) [0.64] (0,16) [0.5] (e,0) +[18.42] (1,15,@1.5u) +[y=-0.75] +[20.75] (3,15) +[y=-0.75] +(1,0) +[y=-0.5] +[18.0] (2,14,@2.25u) +[y=-0.75] +[20.75] (3,16) +[y=-0.75] +(2,0) +[y=-0.5] +[17.75] (2,15,@1.75u) +[y=-0.75] +[19.75] (4,14) +[y=-0.75] +(2,1) +[y=-0.5] +[1.55] (4,0,@1.25u) +[y=-0.75] +[18.75] (4,13) (4,15) (4,16) +[y=-3.25] +[r=0.85@(2.1,28.5)] [1.5] (2,2,@1.75u) +[r=1.0@(2.1,7.5)] [1.5] (3,2,@2.25u) +[y=-3.0] +[r=1.45@(2.1,28.5)] [1.5] (1,1,@1.5u) +[y=-2.0] +[r=1.9@(2.1,28.5)] [1.5] (0,1) +[y=-1.0] +[r=4.0@(2.1,28.5)] [1.5] (0,2) +[r=4.7@(2.1,28.5)] [1.5] (1,2) +[r=4.8@(2.1,28.5)] [1.5] (2,3) +[y=1.0] +[r=5.25@(2.1,28.5)] [1.5] (4,1,@1.25u) +[y=-2.0] +[r=5.4@(2.1,28.5)] [1.5] (3,3) +[y=-4.0] +[r=6.1@(2.1,28.5)] [1.5] (0,3) +[r=6.9@(2.1,28.5)] [1.5] (1,3) +[r=7.1@(2.1,28.5)] [1.5] (2,4) +[r=7.8@(2.1,28.5)] [1.5] (3,4) +[y=-4.0] +[r=8.2@(2.1,28.5)] [1.5] (0,4) +[y=3.0] +[r=8.35@(2.1,28.5)] [1.5] (4,4,@1.25u) +[y=-4.0] +[r=9.1@(2.1,28.5)] [1.5] (1,4) +[r=9.4@(2.1,28.5)] [1.5] (2,5) +[r=10.2@(2.1,28.5)] [1.5] (3,5) +[y=-4.0] +[r=10.3@(2.1,28.5)] [1.5] (0,5) +[r=11.3@(2.1,28.5)] [1.5] (1,5) +[r=11.7@(2.1,28.5)] [1.5] (2,6) +[y=-3.0] +[r=12.4@(2.1,28.5)] [1.5] (0,6) +[y=2.98] +[r=12.5@(2.1,26.5)] [1.5] (4,5,@2.25u) +[y=-1.98] +[r=12.6@(2.1,28.5)] [1.5] (3,6) +[y=-3.0] +[r=13.5@(2.1,28.5)] [1.5] (1,6) +[r=14.0@(2.1,28.5)] [1.5] (2,7) +[y=-3.0] +[r=14.5@(2.1,28.5)] [1.5] (0,7) +[y=2.0] +[r=15.0@(2.1,28.5)] [1.5] (3,7) +[y=-3.0] +[r=15.7@(2.1,28.5)] [1.5] (1,7) +[y=-2.0] +[r=-15.5@(18.6,28.5)] [18.0] (0,8) +[y=2.0] +[r=-15.0@(18.6,28.5)] [18.0] (3,8) +[y=-3.0] +[r=-14.5@(18.6,28.5)] [18.0] (1,8) +[r=-13.8@(18.6,28.5)] [18.0] (2,8) +[y=-3.0] +[r=-13.4@(18.6,28.5)] [18.0] (0,9) +[y=2.0] +[r=-12.6@(18.6,28.5)] [18.0] (3,9) +[y=0.02] +[r=-12.5@(18.6,28.0)] [17.15] (4,8,@2.75u) +[y=-4.02] +[r=-12.3@(18.6,28.5)] [18.0] (1,9) +[r=-11.5@(18.6,28.5)] [18.0] (2,9) +[y=-3.0] +[r=-11.3@(18.6,28.5)] [18.0] (0,10) +[y=2.0] +[r=-10.2@(18.6,28.5)] [18.0] (3,10) +[y=-3.0] +[r=-10.1@(18.6,28.5)] [18.0] (1,10) +[y=-2.0] +[r=-9.2@(18.6,28.5)] [18.0] (0,11) +[y=1.0] +[18.0] (2,10) +[y=-2.0] +[r=-7.9@(18.6,28.5)] [18.0] (1,11) +[y=1.0] +[r=-7.8@(18.6,28.5)] [18.0] (3,11) +[r=-7.55@(18.6,28.5)] [18.0] (4,10,@1.25u) +[y=-5.0] +[r=-7.1@(18.6,28.5)] [18.0] (0,12) +[y=1.0] +[r=-6.9@(18.6,28.5)] [18.0] (2,11) +[y=-2.0] +[r=-5.7@(18.6,28.5)] [18.0] (1,12) +[y=1.0] +[r=-5.4@(18.6,28.5)] [18.0] (3,12) +[y=-4.0] +[r=-5.0@(18.6,28.5)] [18.0] (0,13) +[y=1.0] +[r=-4.6@(18.6,28.5)] [18.0] (2,12) +[y=1.0] +[r=-4.45@(18.6,28.5)] [18.0] (4,11) +[y=-4.0] +[r=-3.5@(18.6,28.5)] [18.0] (1,13) +[y=1.0] +[r=-3.0@(18.6,28.5)] [18.0] (3,13) +[y=-4.0] +[r=-2.9@(18.6,28.5)] [18.0] (0,14) +[y=1.0] +[r=-2.3@(18.6,28.5)] [18.0] (2,13) +[y=1.0] +[r=-1.95@(18.6,28.5)] [18.0] (4,12) +[y=-4.0] +[r=-1.3@(18.6,28.5)] [18.0] (1,14) +""" diff --git a/tests/fixtures/ansi60_splitbs.json b/tests/fixtures/ansi60_splitbs.json new file mode 100644 index 0000000..88e150b --- /dev/null +++ b/tests/fixtures/ansi60_splitbs.json @@ -0,0 +1,35 @@ +{ + "name": "ANSI 60 (test fixture)", + "vendorId": "0x4C4B", + "productId": "0x0060", + "matrix": { "rows": 5, "cols": 15 }, + "layouts": { + "labels": ["Split Backspace"], + "keymap": [ + [ + "0,0", "0,1", "0,2", "0,3", "0,4", "0,5", "0,6", "0,7", "0,8", + "0,9", "0,10", "0,11", "0,12", + {"w": 2}, "0,13", + {"x": -2}, "0,13\n\n\n\n\n\n\n\n\n0,1", "0,14\n\n\n\n\n\n\n\n\n0,1" + ], + [ + {"w": 1.5}, "1,0", "1,1", "1,2", "1,3", "1,4", "1,5", "1,6", + "1,7", "1,8", "1,9", "1,10", "1,11", "1,12", {"w": 1.5}, "1,13" + ], + [ + {"w": 1.75}, "2,0", "2,1", "2,2", "2,3", "2,4", "2,5", "2,6", + "2,7", "2,8", "2,9", "2,10", "2,11", {"w": 2.25}, "2,12" + ], + [ + {"w": 2.25}, "3,0", "3,1", "3,2", "3,3", "3,4", "3,5", "3,6", + "3,7", "3,8", "3,9", "3,10", {"w": 2.75}, "3,11" + ], + [ + {"w": 1.25}, "4,0", {"w": 1.25}, "4,1", {"w": 1.25}, "4,2", + {"w": 6.25}, "4,3", + {"w": 1.25}, "4,9", {"w": 1.25}, "4,10", {"w": 1.25}, "4,11", + {"w": 1.25}, "4,12" + ] + ] + } +} diff --git a/tests/fixtures/ansi60_splitbs.toml b/tests/fixtures/ansi60_splitbs.toml new file mode 100644 index 0000000..98330ab --- /dev/null +++ b/tests/fixtures/ansi60_splitbs.toml @@ -0,0 +1,26 @@ +# Generated from tests/fixtures/ansi60_splitbs.json by rmkit — review the geometry. The source +# carries no keycodes, so author the [keymap] yourself: its `keys` follow the +# map's key order, plus one ["cw", "ccw"] pair per encoder in `encoders`. + +[layout] +rows = 5 +cols = 15 +default_variant = "default" +map = """ +(0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9) (0,10) (0,11) (0,12) (0,13,@2u) (0,14) +(1,0,@1.5u) (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9) (1,10) (1,11) (1,12) (1,13,@1.5u) +(2,0,@1.75u) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9) (2,10) (2,11) (2,12,@2.25u) +(3,0,@2.25u) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9) (3,10) (3,11,@2.75u) +(4,0,@1.25u) (4,1,@1.25u) (4,2,@1.25u) (4,3,@6.25u) (4,9,@1.25u) (4,10,@1.25u) (4,11,@1.25u) (4,12,@1.25u) +""" + +[layout.shapes] +s1 = { w = 1.0 } + +[[layout.variant]] +name = "default" +hidden = ["(0,14)"] + +[[layout.variant]] +name = "Split_Backspace" +shapes = { "(0,13)" = "@s1" } diff --git a/tests/fixtures/corne.json b/tests/fixtures/corne.json new file mode 100644 index 0000000..963d88b --- /dev/null +++ b/tests/fixtures/corne.json @@ -0,0 +1,28 @@ +{ + "name": "Crkbd", + "vendorId": "0x4653", + "productId": "0x0001", + "lighting": "vialrgb", + "matrix": { "rows": 8, "cols": 6 }, + "layouts": { + "keymap": [ + [{"y":1,"x":3.5},"0,3",{"x":7.5},"4,3"], + [{"y":-0.875,"x":2.5},"0,2",{"x":1},"0,4",{"x":5.5},"4,4",{"x":1},"4,2"], + [{"y":-0.875,"x":5.5},"0,5",{"x":3.5},"4,5"], + [{"y":-0.875,"x":0.5},"0,0","0,1",{"x":11.5},"4,1","4,0"], + [{"y":-0.375,"x":3.5},"1,3",{"x":7.5},"5,3"], + [{"y":-0.875,"x":2.5},"1,2",{"x":1},"1,4",{"x":5.5},"5,4",{"x":1},"5,2"], + [{"y":-0.875,"x":5.5},"1,5",{"x":3.5},"5,5"], + [{"y":-0.875,"x":0.5},"1,0","1,1",{"x":11.5},"5,1","5,0"], + [{"y":-0.375,"x":3.5},"2,3",{"x":7.5},"6,3"], + [{"y":-0.875,"x":2.5},"2,2",{"x":1},"2,4",{"x":5.5},"6,4",{"x":1},"6,2"], + [{"y":-0.875,"x":5.5},"2,5",{"x":3.5},"6,5"], + [{"y":-0.875,"x":0.5},"2,0","2,1",{"x":11.5},"6,1","6,0"], + [{"y":-0.125,"x":4},"3,3",{"x":6.5},"7,3"], + [{"r":15,"rx":4.5,"ry":9.1,"y":-4.85,"x":-0.5},"3,4"], + [{"r":30,"rx":5.4,"ry":9.3,"y":-5.05,"x":-1.4,"h":1.5},"3,5"], + [{"r":-30,"rx":11.1,"y":-5.05,"x":0.4,"h":1.5},"7,5"], + [{"r":-15,"rx":12,"ry":9.1,"y":-4.85,"x":-0.5},"7,4"] + ] + } +} diff --git a/tests/fixtures/corne.toml b/tests/fixtures/corne.toml new file mode 100644 index 0000000..872fd38 --- /dev/null +++ b/tests/fixtures/corne.toml @@ -0,0 +1,45 @@ +# Generated from tests/fixtures/corne.json by rmkit — review the geometry. The source +# carries no keycodes, so author the [keymap] yourself: its `keys` follow the +# map's key order, plus one ["cw", "ccw"] pair per encoder in `encoders`. + +[layout] +rows = 8 +cols = 6 +map = """ +[3.5] (0,3) [7.5] (4,3) +[y=-0.875] +[2.5] (0,2) [1.0] (0,4) [5.5] (4,4) [1.0] (4,2) +[y=-0.875] +[5.5] (0,5) [3.5] (4,5) +[y=-0.875] +[0.5] (0,0) (0,1) [11.5] (4,1) (4,0) +[y=-0.375] +[3.5] (1,3) [7.5] (5,3) +[y=-0.875] +[2.5] (1,2) [1.0] (1,4) [5.5] (5,4) [1.0] (5,2) +[y=-0.875] +[5.5] (1,5) [3.5] (5,5) +[y=-0.875] +[0.5] (1,0) (1,1) [11.5] (5,1) (5,0) +[y=-0.375] +[3.5] (2,3) [7.5] (6,3) +[y=-0.875] +[2.5] (2,2) [1.0] (2,4) [5.5] (6,4) [1.0] (6,2) +[y=-0.875] +[5.5] (2,5) [3.5] (6,5) +[y=-0.875] +[0.5] (2,0) (2,1) [11.5] (6,1) (6,0) +[y=-0.125] +[4.0] (3,3) [6.5] (7,3) +[y=-1.0] +[r=15.0@(4.5,8.1)] [4.0] (3,4) +[y=-1.0] +[r=30.0@(5.4,8.3)] [4.0] (3,5,@s1) +[y=-1.0] +[r=-30.0@(11.1,8.3)] [11.5] (7,5,@s1) +[y=-1.0] +[r=-15.0@(12.0,8.1)] [11.5] (7,4) +""" + +[layout.shapes] +s1 = { h = 1.5 } diff --git a/tests/fixtures/kle_export.json b/tests/fixtures/kle_export.json new file mode 100644 index 0000000..d34f744 --- /dev/null +++ b/tests/fixtures/kle_export.json @@ -0,0 +1,6 @@ +[ + { "name": "Sample KLE export", "author": "rmk" }, + ["Esc", "Q", "W", "E"], + [{ "w": 1.5 }, "Tab", "A", "S"], + [{ "y": 0.5, "x": 1 }, "Z", { "w": 2 }, "Space"] +] diff --git a/tests/fixtures/kle_export.toml b/tests/fixtures/kle_export.toml new file mode 100644 index 0000000..1c0c921 --- /dev/null +++ b/tests/fixtures/kle_export.toml @@ -0,0 +1,13 @@ +# Generated from tests/fixtures/kle_export.json by rmkit — review the geometry. The source +# carries no keycodes, so author the [keymap] yourself: its `keys` follow the +# map's key order, plus one ["cw", "ccw"] pair per encoder in `encoders`. + +[layout] +rows = 3 +cols = 4 +map = """ +(0,0) (0,1) (0,2) (0,3) +(1,0,@1.5u) (1,1) (1,2) +[y=0.5] +[1.0] (2,0) (2,1,@2u) +""" diff --git a/tests/fixtures/kle_rowcol.json b/tests/fixtures/kle_rowcol.json new file mode 100644 index 0000000..ddcdeb0 --- /dev/null +++ b/tests/fixtures/kle_rowcol.json @@ -0,0 +1,4 @@ +[ + ["0,0", "0,1", "0,2"], + [{ "w": 2 }, "1,0", "1,2"] +] diff --git a/tests/fixtures/kle_rowcol.toml b/tests/fixtures/kle_rowcol.toml new file mode 100644 index 0000000..b50b72d --- /dev/null +++ b/tests/fixtures/kle_rowcol.toml @@ -0,0 +1,11 @@ +# Generated from tests/fixtures/kle_rowcol.json by rmkit — review the geometry. The source +# carries no keycodes, so author the [keymap] yourself: its `keys` follow the +# map's key order, plus one ["cw", "ccw"] pair per encoder in `encoders`. + +[layout] +rows = 2 +cols = 3 +map = """ +(0,0) (0,1) (0,2) +(1,0,@2u) (1,2) +"""