From 251f117425a67eee100c488ccdb66ccc2ad2df8c Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 16 Jul 2026 15:32:40 +0800 Subject: [PATCH] feat: extensions base --- Cargo.lock | 612 +++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + src/app.rs | 6 + src/app/tile.rs | 3 + src/app/tile/elm.rs | 4 +- src/app/tile/update.rs | 14 + src/config.rs | 2 + src/extensions.rs | 120 ++++++++ src/main.rs | 3 + 9 files changed, 734 insertions(+), 31 deletions(-) create mode 100644 src/extensions.rs diff --git a/Cargo.lock b/Cargo.lock index dafbbe2..c45487a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,6 +81,12 @@ dependencies = [ "equator", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-activity" version = "0.6.1" @@ -130,6 +136,12 @@ version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +[[package]] +name = "anymap3" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5dfbc6d8d2675589ccbe4d0fd61df2419075625f8c1a62325e718e2b0049f9" + [[package]] name = "arbitrary" version = "1.4.2" @@ -156,6 +168,15 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -173,6 +194,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.8" @@ -378,7 +405,7 @@ dependencies = [ "aligned", "anyhow", "arg_enum_proc_macro", - "arrayvec", + "arrayvec 0.7.8", "log", "num-rational", "num-traits", @@ -396,7 +423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ "anyhow", - "arrayvec", + "arrayvec 0.7.8", "log", "nom", "num-rational", @@ -409,7 +436,29 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" dependencies = [ - "arrayvec", + "arrayvec 0.7.8", +] + +[[package]] +name = "bigdecimal" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", ] [[package]] @@ -448,6 +497,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + [[package]] name = "bitstream-io" version = "4.10.0" @@ -463,6 +521,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.12.1" @@ -639,6 +706,15 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" version = "1.2.66" @@ -673,13 +749,24 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + [[package]] name = "cipher" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ - "crypto-common", + "crypto-common 0.2.2", "inout", ] @@ -728,6 +815,25 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" +[[package]] +name = "codegen" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff61280aed771c3070e7dcc9e050c66f1eb1e3b96431ba66f9f74641d02fc41d" +dependencies = [ + "indexmap 1.9.3", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width 0.1.14", +] + [[package]] name = "codespan-reporting" version = "0.12.0" @@ -736,7 +842,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ "serde", "termcolor", - "unicode-width", + "unicode-width 0.2.2", ] [[package]] @@ -755,6 +861,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -922,6 +1043,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.22" @@ -947,6 +1077,16 @@ dependencies = [ "wgpu", ] +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "crypto-common" version = "0.2.2" @@ -980,6 +1120,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "dashmap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "deflate" version = "0.8.6" @@ -1002,15 +1156,25 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + [[package]] name = "digest" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer", + "block-buffer 0.12.1", "const-oid", - "crypto-common", + "crypto-common 0.2.2", "ctutils", "zeroize", ] @@ -1143,6 +1307,12 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "env_home" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" + [[package]] name = "equator" version = "0.4.2" @@ -1556,6 +1726,26 @@ dependencies = [ "system-deps", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "generic_singleton" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab6e923c8e978e57cf63e2e200ca967d1d20f0ea2662b28f6d4e11c44aa6ab16" +dependencies = [ + "anymap3", + "parking_lot", +] + [[package]] name = "gethostname" version = "1.1.0" @@ -1584,9 +1774,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 5.3.0", "wasip2", + "wasm-bindgen", ] [[package]] @@ -1708,6 +1900,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "global-hotkey" version = "0.7.0" @@ -1895,6 +2093,23 @@ dependencies = [ "smallvec", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + [[package]] name = "hashbrown" version = "0.15.5" @@ -1967,9 +2182,15 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest", + "digest 0.11.3", ] +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + [[package]] name = "hybrid-array" version = "0.4.13" @@ -1979,6 +2200,30 @@ dependencies = [ "typenum", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.58.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "iced" version = "0.14.0" @@ -2177,6 +2422,28 @@ dependencies = [ "png 0.16.8", ] +[[package]] +name = "icu_casemap" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "070f98b5b82798fcb93654bf96ed9f40064fc44c86f51a09ea711092cd5cc5be" +dependencies = [ + "icu_casemap_data", + "icu_collections", + "icu_locale_core", + "icu_properties", + "icu_provider", + "potential_utf", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_casemap_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "846b0857ca091204be3c874bc93daaf89d4777e8d2d20b0d3ffe8f671d98014b" + [[package]] name = "icu_collections" version = "2.2.0" @@ -2185,6 +2452,7 @@ checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "serde", "utf8_iter", "yoke", "zerofrom", @@ -2199,6 +2467,7 @@ checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", + "serde", "tinystr", "writeable", "zerovec", @@ -2252,6 +2521,8 @@ checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", + "serde", + "stable_deref_trait", "writeable", "yoke", "zerofrom", @@ -2280,6 +2551,32 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "im-lists" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8490eb8daae746b8d5ba6f95d7aec634cd05cf687723ce62e4e3c6886f2a8030" +dependencies = [ + "allocator-api2", + "generic_singleton", + "smallvec", +] + +[[package]] +name = "im-rc" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + [[package]] name = "image" version = "0.25.10" @@ -2320,6 +2617,16 @@ version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.14.0" @@ -2487,10 +2794,22 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd1bc63440" dependencies = [ - "arrayvec", + "arrayvec 0.7.8", "smallvec", ] +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "ahash", + "dashmap", + "hashbrown 0.14.5", + "serde", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -2723,6 +3042,16 @@ dependencies = [ "rayon", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + [[package]] name = "memchr" version = "2.8.3" @@ -2871,16 +3200,16 @@ version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ - "arrayvec", + "arrayvec 0.7.8", "bit-set", "bitflags 2.13.0", "cfg-if", "cfg_aliases", - "codespan-reporting", + "codespan-reporting 0.12.0", "half", "hashbrown 0.16.1", "hexf-parse", - "indexmap", + "indexmap 2.14.0", "libm", "log", "num-traits", @@ -2968,6 +3297,7 @@ checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", + "serde", ] [[package]] @@ -3015,6 +3345,7 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", + "serde", ] [[package]] @@ -3522,6 +3853,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", + "rand 0.8.7", + "serde", ] [[package]] @@ -3615,7 +3948,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" dependencies = [ - "digest", + "digest 0.11.3", "hmac", ] @@ -3777,6 +4110,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ + "serde_core", + "writeable", "zerovec", ] @@ -3807,6 +4142,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "pretty" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d22152487193190344590e4f30e219cf3fe140d9e7a3fdb683d82aa2c5f4156" +dependencies = [ + "arrayvec 0.5.2", + "typed-arena", + "unicode-width 0.2.2", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3962,6 +4308,16 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "rand_core 0.6.4", + "serde", +] + [[package]] name = "rand" version = "0.9.4" @@ -3969,7 +4325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.5", ] [[package]] @@ -3979,7 +4335,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "serde", ] [[package]] @@ -3991,6 +4356,15 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "range-alloc" version = "0.1.5" @@ -4012,7 +4386,7 @@ dependencies = [ "aligned-vec", "arbitrary", "arg_enum_proc_macro", - "arrayvec", + "arrayvec 0.7.8", "av-scenechange", "av1-grain", "bitstream-io", @@ -4030,7 +4404,7 @@ dependencies = [ "num-traits", "paste", "profiling", - "rand", + "rand 0.9.4", "rand_chacha", "simd_helpers", "thiserror 2.0.18", @@ -4301,13 +4675,14 @@ dependencies = [ "objc2-foundation 0.3.2", "objc2-service-management", "once_cell", - "rand", + "rand 0.9.4", "rayon", "rfd", "rusqlite", "serde", "serde_json", "sha2", + "steel-core", "tempfile", "tokio", "toml 0.9.12+spec-1.1.0", @@ -4371,6 +4746,12 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "same-file" version = "1.0.6" @@ -4507,7 +4888,7 @@ checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.11.3", ] [[package]] @@ -4518,7 +4899,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.11.3", ] [[package]] @@ -4530,6 +4911,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shared_vector" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aacfea9afcf271e69d700140dc2a3e2ff44b1092dd0de71fdd4e5c26672a2" +dependencies = [ + "allocator-api2", +] + [[package]] name = "shlex" version = "2.0.1" @@ -4583,6 +4973,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + [[package]] name = "skrifa" version = "0.37.0" @@ -4770,12 +5170,119 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "steel-core" +version = "0.8.2" +source = "git+https://github.com/mattwparas/steel.git#dec633b908afeafeaf62bab457a92e2bf873745a" +dependencies = [ + "arc-swap", + "bigdecimal", + "bincode", + "chrono", + "codespan-reporting 0.11.1", + "compact_str", + "crossbeam-channel", + "crossbeam-queue", + "crossbeam-utils", + "env_home", + "futures-executor", + "futures-task", + "futures-util", + "getrandom 0.3.4", + "glob", + "httparse", + "icu_casemap", + "im-lists", + "im-rc", + "js-sys", + "lasso", + "log", + "md-5", + "num-bigint", + "num-integer", + "num-rational", + "num-traits", + "once_cell", + "parking_lot", + "polling", + "rand 0.9.4", + "rustc-hash 2.1.3", + "serde", + "serde_json", + "shared_vector", + "smallvec", + "steel-derive", + "steel-gen", + "steel-parser", + "steel-quickscope", + "strsim", + "thin-vec", + "weak-table", + "which", + "xdg", +] + +[[package]] +name = "steel-derive" +version = "0.8.2" +source = "git+https://github.com/mattwparas/steel.git#dec633b908afeafeaf62bab457a92e2bf873745a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "steel-gen" +version = "0.8.2" +source = "git+https://github.com/mattwparas/steel.git#dec633b908afeafeaf62bab457a92e2bf873745a" +dependencies = [ + "codegen", + "serde", +] + +[[package]] +name = "steel-parser" +version = "0.8.2" +source = "git+https://github.com/mattwparas/steel.git#dec633b908afeafeaf62bab457a92e2bf873745a" +dependencies = [ + "compact_str", + "dashmap", + "lasso", + "log", + "num-bigint", + "num-rational", + "num-traits", + "once_cell", + "ordered-float", + "pretty", + "rustc-hash 2.1.3", + "serde", + "smallvec", + "thin-vec", +] + +[[package]] +name = "steel-quickscope" +version = "0.3.2" +source = "git+https://github.com/mattwparas/steel.git#dec633b908afeafeaf62bab457a92e2bf873745a" +dependencies = [ + "indexmap 2.14.0", + "smallvec", +] + [[package]] name = "strict-num" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "svg_fmt" version = "0.4.5" @@ -4875,6 +5382,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thin-vec" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" +dependencies = [ + "serde", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -4965,7 +5481,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.8", "bytemuck", "cfg-if", "log", @@ -5003,6 +5519,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", + "serde_core", "zerovec", ] @@ -5067,7 +5584,7 @@ version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap", + "indexmap 2.14.0", "serde_core", "serde_spanned 1.1.1", "toml_datetime 0.7.5+spec-1.1.0", @@ -5109,7 +5626,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.14.0", "toml_datetime 0.6.3", "winnow 0.5.40", ] @@ -5120,7 +5637,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap", + "indexmap 2.14.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.3", @@ -5133,7 +5650,7 @@ version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ - "indexmap", + "indexmap 2.14.0", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "winnow 1.0.3", @@ -5246,6 +5763,12 @@ dependencies = [ "core_maths", ] +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + [[package]] name = "typed-path" version = "0.12.3" @@ -5299,6 +5822,12 @@ version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-width" version = "0.2.2" @@ -5603,6 +6132,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "weak-table" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" + [[package]] name = "web-sys" version = "0.3.103" @@ -5641,7 +6176,7 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ - "arrayvec", + "arrayvec 0.7.8", "bitflags 2.13.0", "cfg-if", "cfg_aliases", @@ -5670,7 +6205,7 @@ version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ - "arrayvec", + "arrayvec 0.7.8", "bit-set", "bit-vec", "bitflags 2.13.0", @@ -5678,7 +6213,7 @@ dependencies = [ "cfg_aliases", "document-features", "hashbrown 0.16.1", - "indexmap", + "indexmap 2.14.0", "log", "naga", "once_cell", @@ -5730,7 +6265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", - "arrayvec", + "arrayvec 0.7.8", "ash", "bit-set", "bitflags 2.13.0", @@ -5786,6 +6321,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "which" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d7cd18d4acb58fb3cdfe9ea54e6cd96a4e7d4cc45c56338b236e82dad47248" +dependencies = [ + "libc", +] + [[package]] name = "winapi" version = "0.3.9" @@ -6306,6 +6850,12 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" +[[package]] +name = "xdg" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" + [[package]] name = "xkbcommon-dl" version = "0.4.2" @@ -6489,6 +7039,7 @@ dependencies = [ "displaydoc", "yoke", "zerofrom", + "zerovec", ] [[package]] @@ -6497,6 +7048,7 @@ version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -6527,7 +7079,7 @@ dependencies = [ "flate2", "getrandom 0.4.3", "hmac", - "indexmap", + "indexmap 2.14.0", "lzma-rust2", "memchr", "pbkdf2", diff --git a/Cargo.toml b/Cargo.toml index 7bb7ed1..a384296 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ rusqlite = { version = "0.40.1", features = ["bundled"] } serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" sha2 = "0.11.0" +steel-core = { git = "https://github.com/mattwparas/steel.git" } tempfile = "3.27.0" tokio = { version = "1.48.0", features = ["full"] } toml = "0.9.8" diff --git a/src/app.rs b/src/app.rs index fc14b39..b1e9d4c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,5 +1,6 @@ //! Main logic for the app use std::collections::HashMap; +use std::path::PathBuf; use crate::app::apps::{App, AppCommand, AppIcon, ICNS_ICON}; use crate::commands::Function; @@ -139,6 +140,11 @@ pub enum Message { KeyPressed(Shortcut), FocusTextInput(Move), HideWindow(Id), + AddExtensionApp { + display: String, + search: String, + icon_path: PathBuf, + }, RunFunction(Function), OpenFocused, SetConfig(SetConfigFields), diff --git a/src/app/tile.rs b/src/app/tile.rs index 2bc6a5a..6b85ac1 100644 --- a/src/app/tile.rs +++ b/src/app/tile.rs @@ -8,6 +8,7 @@ use crate::autoupdate::new_version_available; use crate::clipboard::ClipBoardContentType; use crate::config::{Config, Shelly}; use crate::debounce::Debouncer; +use crate::extensions::ExtensionEngine; use crate::platform::default_app_paths; use crate::platform::macos::events::Event; use crate::platform::macos::launching::{EventTapHandle, Shortcut}; @@ -188,6 +189,7 @@ pub struct Tile { query_lc: String, results: Vec, options: AppIndex, + extension_apps: AppIndex, emoji_apps: AppIndex, visible: bool, focused: bool, @@ -206,6 +208,7 @@ pub struct Tile { debouncer: Debouncer, pub settings_window: Option, previous_input_source: Option, + extension_engine: Option, conn: Connection, } diff --git a/src/app/tile/elm.rs b/src/app/tile/elm.rs index eeb2fd7..60fed1e 100644 --- a/src/app/tile/elm.rs +++ b/src/app/tile/elm.rs @@ -21,8 +21,8 @@ use crate::app::pages::settings::settings_page; use crate::app::tile::{AppIndex, Hotkeys}; use crate::app::{DEFAULT_WINDOW_HEIGHT, SettingsTab, ToApp, ToApps}; use crate::config::Theme; -use crate::database::load_clipboard; use crate::debounce::Debouncer; +use crate::extensions::ExtensionEngine; use crate::platform::macos::events::Event; use crate::styles::{ contents_style, glass_border, glass_surface, results_scrollbar_style, rustcast_text_input_style, @@ -92,6 +92,7 @@ pub fn new(hotkeys: Hotkeys, config: &Config) -> (Tile, Task) { options, hotkeys, events, + extension_apps: AppIndex::empty(), emoji_apps: AppIndex::from_apps(App::emoji_apps()), visible: true, frontmost: None, @@ -102,6 +103,7 @@ pub fn new(hotkeys: Hotkeys, config: &Config) -> (Tile, Task) { clipboard_content: vec![], tray_icon: None, sender: None, + extension_engine: None, page: Page::Main, height: DEFAULT_WINDOW_HEIGHT, file_search_sender: None, diff --git a/src/app/tile/update.rs b/src/app/tile/update.rs index f4b834e..a53cf08 100644 --- a/src/app/tile/update.rs +++ b/src/app/tile/update.rs @@ -48,6 +48,7 @@ use crate::config::ThemeMode; use crate::database::load_clipboard; use crate::database::store_clipboard_content; use crate::debounce::DebouncePolicy; +use crate::extensions::ExtensionEngine; use crate::platform::macos::events::Event; use crate::platform::macos::launching::Shortcut; use crate::platform::macos::launching::global_handler; @@ -208,7 +209,20 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task { thread::spawn(move || fs::write(home + "/.config/rustcast/config.toml", confg_str)); Task::none() } + Message::AddExtensionApp { + display, + search, + icon_path, + } => { + dbg!("Adding new extension app"); + Task::none() + } Message::SetSender(sender) => { + if tile.config.extensions { + let eng = ExtensionEngine::new(sender.clone()); + tile.extension_engine = Some(eng) + } + tile.sender = Some(sender.clone()); match global_handler(sender.clone(), tile.hotkeys.all_hotkeys()) { Ok(a) => tile.hotkeys.handle = Some(a), diff --git a/src/config.rs b/src/config.rs index 7986001..55cf84f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -98,6 +98,7 @@ pub struct Config { pub buffer_rules: Buffer, pub event_duration: u32, pub main_page: MainPage, + pub extensions: bool, pub start_at_login: bool, pub theme: Theme, pub window_location: Position, @@ -128,6 +129,7 @@ impl Default for Config { theme: Theme::default(), start_at_login: true, event_duration: 60, + extensions: true, placeholder: String::from("Time to be productive!"), search_url: "https://duckduckgo.com/search?q=%s".to_string(), cbhist: true, diff --git a/src/extensions.rs b/src/extensions.rs new file mode 100644 index 0000000..2bdb9f0 --- /dev/null +++ b/src/extensions.rs @@ -0,0 +1,120 @@ +use std::{ + collections::HashMap, + fs, + path::PathBuf, + sync::{Arc, Mutex}, + time::Duration, +}; + +use serde::{Deserialize, Serialize}; +use steel::steel_vm::{builtin::BuiltInModule, engine::Engine, register_fn::RegisterFn}; + +use crate::app::tile::ExtSender; + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub struct ExtensionItem { + src_file: PathBuf, + name: String, + icon_source_file: PathBuf, + ext_type: ExtensionType, + ext_config: HashMap, +} + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum ExtensionType { + Constant, + Polled(Duration), + Dynamic, +} + +pub struct Action { + run_file: PathBuf, +} + +pub struct ExtensionEngine { + engine: Arc>, + extensions: Vec, +} + +impl ExtensionEngine { + pub fn new(sender: ExtSender) -> Self { + let mut engine = Engine::new(); + let mut module = BuiltInModule::new("rustcast/core"); + let sender = sender.clone(); + + module.register_fn("cli", extension_prelude::call_command); + module.register_fn("fswrite", extension_prelude::create_file); + module.register_fn("fsread", extension_prelude::read_file); + module.register_fn( + "populate", + move |name: String, search: String, icon_path: String| { + extension_prelude::populate(sender.clone(), name, search, icon_path) + }, + ); + + engine.register_module(module); + + ExtensionEngine { + engine: Arc::new(Mutex::new(engine)), + extensions: vec![], + } + } + + pub fn load_extension(&mut self, extension_config_path: PathBuf) { + let Ok(config_str) = fs::read_to_string(extension_config_path) else { + return; + }; + + if let Some(conf) = toml::from_str(&config_str).ok() { + self.extensions.push(conf); + } + } +} + +mod extension_prelude { + use std::path::Path; + + use iced::futures::SinkExt; + use log::info; + + use crate::app::tile::ExtSender; + pub fn call_command(command: String) -> String { + info!("Extension is calling CLI: {command}"); + std::process::Command::new("sh") + .arg("-c") + .arg(command) + .output() + .ok() + .and_then(|x| String::from_utf8(x.stdout).ok()) + .unwrap_or_default() + } + + pub fn create_file(path: String, contents: String) { + info!("Extension called file write function"); + std::fs::write(path, contents).ok(); + } + + pub fn read_file(path: String) -> String { + info!("Extension called file write function"); + std::fs::read_to_string(path).unwrap_or_default() + } + + pub fn populate(sender: ExtSender, name: String, search_name: String, icon_path: String) { + let sender = sender.clone(); + tokio::task::spawn_blocking(async move || { + let icon_path = icon_path.clone(); + let mut sender = sender.clone(); + sender + .0 + .send(crate::app::Message::AddExtensionApp { + display: name, + search: search_name, + icon_path: Path::new(&(icon_path.clone())).to_path_buf(), + }) + .await + .unwrap(); + }); + } +} diff --git a/src/main.rs b/src/main.rs index d9df578..6d48b2d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,7 @@ #![deny(clippy::dbg_macro)] +pub use steel::steel_vm; + mod app; mod autoupdate; mod clipboard; @@ -7,6 +9,7 @@ mod commands; mod config; mod database; mod debounce; +mod extensions; mod platform; mod quit; mod styles;