From 7b6c5df268c1d8cdadfdfcd9f0e0ceca58ff48fd Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Wed, 21 Aug 2024 09:10:56 -0700 Subject: [PATCH 01/56] Update MetaInfo for v0.0.10 release (#335) --- docs/iamb.metainfo.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/iamb.metainfo.xml b/docs/iamb.metainfo.xml index e064c6c..305c632 100644 --- a/docs/iamb.metainfo.xml +++ b/docs/iamb.metainfo.xml @@ -8,6 +8,7 @@ + @@ -23,8 +24,8 @@ - https://iamb.chat/static/images/iamb-demo.gif - Example conversation within iamb + https://iamb.chat/static/images/metainfo-screenshot.png + Example screenshot of room and lists of rooms, spaces and members within iamb From 3355eb2d2622f28d2fed6eb00a6aa78868a87b83 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 23 Aug 2024 11:35:32 -0700 Subject: [PATCH 02/56] Do not use icons in MetaInfo (#336) --- docs/iamb.metainfo.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/iamb.metainfo.xml b/docs/iamb.metainfo.xml index 305c632..ee7b3b0 100644 --- a/docs/iamb.metainfo.xml +++ b/docs/iamb.metainfo.xml @@ -1,20 +1,21 @@ - iamb + chat.iamb.iamb iamb A terminal Matrix client for Vim addicts https://iamb.chat - + Ulyssa + Ulyssa CC-BY-SA-4.0 Apache-2.0 @@ -38,7 +39,6 @@

- https://iamb.chat/images/iamb.svg iamb.desktop From a32915b7e95207bb8491482a88f03e7b041c611f Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 30 Aug 2024 09:08:12 -0700 Subject: [PATCH 03/56] Update `Cargo.toml` to v0.0.11-alpha.1 (#346) --- .github/workflows/ci.yml | 4 +- Cargo.lock | 1334 ++++++++++++++++++++++---------------- Cargo.toml | 8 +- README.md | 2 +- src/message/mod.rs | 7 +- 5 files changed, 776 insertions(+), 579 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 086e700..745e198 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: uses: actions/checkout@v3 with: submodules: true - - name: Install Rust (1.70 w/ clippy) - uses: dtolnay/rust-toolchain@1.70 + - name: Install Rust (1.74 w/ clippy) + uses: dtolnay/rust-toolchain@1.74 with: components: clippy - name: Install Rust (nightly w/ rustfmt) diff --git a/Cargo.lock b/Cargo.lock index afa92c9..572c39a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,21 +4,21 @@ version = 3 [[package]] name = "accessory" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850bb534b9dc04744fbbb71d30ad6d25a7e4cf6dc33e223c81ef3a92ebab4e0b" +checksum = "87537f9ae7cfa78d5b8ebd1a1db25959f5e737126be4d8eb44a5452fc4b63cde" dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -29,6 +29,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aead" version = "0.5.2" @@ -109,24 +115,24 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] @@ -143,9 +149,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "anymap2" @@ -164,24 +170,23 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "arboard" -version = "3.3.2" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2041f1943049c7978768d84e6d0fd95de98b76d6c4727b09e78ec253d29fa58" +checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" dependencies = [ "clipboard-win", "core-graphics", - "image", + "image 0.25.2", "log", - "objc", - "objc-foundation", - "objc_id", - "parking_lot 0.12.1", - "thiserror", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot 0.12.3", "windows-sys 0.48.0", "wl-clipboard-rs", "x11rb", @@ -189,15 +194,15 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" dependencies = [ "serde", ] @@ -226,27 +231,25 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", - "event-listener-strategy 0.5.1", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.2", + "fastrand 2.1.1", "futures-lite 2.3.0", "slab", ] @@ -285,21 +288,21 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", "futures-lite 2.3.0", "parking", - "polling 3.5.0", - "rustix 0.38.32", + "polling 3.7.3", + "rustix 0.38.35", "slab", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -313,12 +316,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener 5.3.1", + "event-listener-strategy", "pin-project-lite", ] @@ -335,37 +338,37 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.32", + "rustix 0.38.35", "windows-sys 0.48.0", ] [[package]] name = "async-recursion" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.3.2", - "async-lock 2.8.0", + "async-io 2.3.4", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.32", + "rustix 0.38.35", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -387,24 +390,24 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -415,9 +418,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backoff" @@ -435,15 +438,15 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] @@ -454,6 +457,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -474,9 +483,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitmaps" @@ -486,9 +495,9 @@ checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" dependencies = [ "arrayref", "arrayvec", @@ -522,19 +531,25 @@ dependencies = [ ] [[package]] -name = "blocking" -version = "1.5.1" +name = "block2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock 3.3.0", "async-task", - "fastrand 2.0.2", "futures-io", "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] @@ -554,9 +569,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" [[package]] name = "byteorder" @@ -565,10 +580,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "bytes" -version = "1.6.0" +name = "byteorder-lite" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "bytesize" @@ -584,9 +605,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "castaway" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" dependencies = [ "rustversion", ] @@ -602,9 +623,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.94" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -656,16 +680,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -708,10 +732,10 @@ version = "4.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -722,9 +746,9 @@ checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "clipboard-win" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" dependencies = [ "error-code", ] @@ -737,9 +761,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "compact_str" @@ -773,9 +797,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -788,15 +812,15 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_panic" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" +checksum = "7782af8f90fe69a4bb41e460abe1727d493403d8b2cc43201a3a3e906b24379f" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "convert_case" @@ -816,9 +840,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -846,27 +870,27 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -892,9 +916,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crossterm" @@ -902,11 +926,11 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "crossterm_winapi", "libc", - "mio", - "parking_lot 0.12.1", + "mio 0.8.11", + "parking_lot 0.12.3", "signal-hook", "signal-hook-mio", "winapi", @@ -958,16 +982,15 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest", "fiat-crypto", - "platforms", "rustc_version", "serde", "subtle", @@ -982,7 +1005,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1070,7 +1093,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1087,13 +1110,13 @@ dependencies = [ [[package]] name = "der_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1124,7 +1147,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1160,22 +1183,22 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.76", ] [[package]] name = "deunicode" -version = "1.4.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322ef0094744e63628e6f0eb2295517f79276a5b342a4c2ff3042566ca181d4e" +checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00" [[package]] name = "diff" @@ -1237,13 +1260,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1263,9 +1286,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dyn-clone" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ed25519" @@ -1295,9 +1318,9 @@ dependencies = [ [[package]] name = "edit" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c562aa71f7bc691fde4c6bf5f93ae5a5298b617c2eb44c76c87832299a17fbb4" +checksum = "f364860e764787163c8c8f58231003839be31276e821e2ad2092ddf496b1aa09" dependencies = [ "tempfile", "which", @@ -1305,9 +1328,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "emojis" @@ -1341,9 +1364,9 @@ checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1351,13 +1374,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1368,9 +1391,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1412,9 +1435,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1423,21 +1446,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" -dependencies = [ - "event-listener 5.3.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1451,7 +1464,7 @@ dependencies = [ "flume", "half", "lebe", - "miniz_oxide", + "miniz_oxide 0.7.4", "rayon-core", "smallvec", "zune-inflate", @@ -1459,9 +1472,9 @@ dependencies = [ [[package]] name = "eyeball" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42482893d982111055ce4b24234d6250396d3785767c6b04cedd84612a0b80fb" +checksum = "d93bd0ebf93d61d6332d3c09a96e97975968a44e19a64c947bde06e6baff383f" dependencies = [ "futures-core", "readlock", @@ -1470,9 +1483,9 @@ dependencies = [ [[package]] name = "eyeball-im" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021fab29d9670be5867b16d56a95c29a12c3c1bb654e7d589010a028716d625d" +checksum = "9326c8d9f6d59d18935412608b4514cc661e4e068011bb2f523f6c8b1cfa3bd4" dependencies = [ "futures-core", "imbl", @@ -1495,14 +1508,14 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fancy_constructor" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71f317e4af73b2f8f608fac190c52eac4b1879d2145df1db2fe48881ca69435" +checksum = "07b19d0e43eae2bfbafe4931b5e79c73fb1a849ca15cd41a761a7b8587f9a1a2" dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1516,9 +1529,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" @@ -1531,9 +1544,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fixedbitset" @@ -1543,18 +1556,18 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flagset" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb3aa5e95cf9aabc17f060cfa0ced7b83f042390760ca53bf09df9968acaa1" +checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -1599,7 +1612,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1712,7 +1725,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.2", + "fastrand 2.1.1", "futures-core", "futures-io", "parking", @@ -1727,7 +1740,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -1791,9 +1804,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1814,9 +1827,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gloo-timers" @@ -1874,9 +1887,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -1897,12 +1910,24 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1929,11 +1954,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1974,9 +1999,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1995,9 +2020,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -2010,7 +2035,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -2046,10 +2071,10 @@ dependencies = [ [[package]] name = "iamb" -version = "0.0.10" +version = "0.0.11-alpha.1" dependencies = [ "anyhow", - "bitflags 2.5.0", + "bitflags 2.6.0", "chrono", "clap", "comrak", @@ -2061,8 +2086,8 @@ dependencies = [ "gethostname", "html5ever", "humansize", - "image", - "lazy_static 1.4.0", + "image 0.24.9", + "lazy_static 1.5.0", "libc", "markup5ever_rcdom", "matrix-sdk", @@ -2097,16 +2122,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core 0.52.0", ] [[package]] @@ -2120,9 +2145,9 @@ dependencies = [ [[package]] name = "icy_sixel" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dc4d30216c3fc247730a4c6c74db2bd217a5454361ce24d70e504bda0cd345e" +checksum = "86858ae800284d596cfdefcb0ad435c3493c12f35367431bbe9b2b3858c1155b" [[package]] name = "ident_case" @@ -2158,6 +2183,19 @@ dependencies = [ "tiff", ] +[[package]] +name = "image" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "tiff", +] + [[package]] name = "imbl" version = "2.0.3" @@ -2183,18 +2221,18 @@ dependencies = [ [[package]] name = "include_dir" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ "proc-macro2", "quote", @@ -2202,9 +2240,9 @@ dependencies = [ [[package]] name = "indexed_db_futures" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cc2083760572ee02385ab8b7c02c20925d2dd1f97a1a25a8737a238608f1152" +checksum = "0704b71f13f81b5933d791abf2de26b33c40935143985220299a357721166706" dependencies = [ "accessory", "cfg-if", @@ -2219,21 +2257,15 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", "hashbrown", "serde", ] -[[package]] -name = "indoc" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" - [[package]] name = "inout" version = "0.1.3" @@ -2246,9 +2278,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", "js-sys", @@ -2271,7 +2303,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] @@ -2284,11 +2316,11 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] @@ -2311,6 +2343,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -2328,9 +2369,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -2366,9 +2407,9 @@ dependencies = [ [[package]] name = "konst" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d712a8c49d4274f8d8a5cf61368cb5f3c143d149882b1a2918129e53395fdb0" +checksum = "50a0ba6de5f7af397afff922f22c149ff605c766cd3269cf6c1cd5e466dbe3b9" dependencies = [ "const_panic", "konst_kernel", @@ -2377,9 +2418,9 @@ dependencies = [ [[package]] name = "konst_kernel" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac6ea8c376b6e208a81cf39b8e82bebf49652454d98a4829e907dac16ef1790" +checksum = "be0a455a1719220fd6adf756088e1c69a85bf14b6a9e24537a5cc04f503edb2b" dependencies = [ "typewit", ] @@ -2392,9 +2433,9 @@ checksum = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" @@ -2404,18 +2445,18 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2430,7 +2471,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -2453,15 +2494,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2469,15 +2510,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" dependencies = [ "hashbrown", ] @@ -2521,7 +2562,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -2532,7 +2573,7 @@ checksum = "13198c120864097a565ccb3ff947672d969932b7975ebd4085732c9f09435e55" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -2545,7 +2586,7 @@ dependencies = [ "macroific_core", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -2591,9 +2632,9 @@ dependencies = [ [[package]] name = "matrix-pickle" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fd26463ce5d86b8d9bb9c4142d453198ba22fb91bd46d3c9f144ae699d821d" +checksum = "7eb521190328c57a2051f70250beb874dc0fac6bcd22b615f7f9700b7b4fb826" dependencies = [ "matrix-pickle-derive", "thiserror", @@ -2601,15 +2642,15 @@ dependencies = [ [[package]] name = "matrix-pickle-derive" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93779aa78d39c2fe34746287b10a866192cf8af1b81767fff76bd64099acc0f5" +checksum = "c6fb3c7231cbb7fbbc50871615edebf65183b382cdaa1fe21c5e88a12617de8e" dependencies = [ - "proc-macro-crate 2.0.0", + "proc-macro-crate 3.2.0", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -2670,7 +2711,7 @@ checksum = "00891954d0826a94f1d130f46cbca64176003a234c1be5d9d282970d31cf0c87" dependencies = [ "as_variant", "async-trait", - "bitflags 2.5.0", + "bitflags 2.6.0", "eyeball", "eyeball-im", "futures-util", @@ -2711,9 +2752,9 @@ dependencies = [ [[package]] name = "matrix-sdk-crypto" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72aaeca3deb1387a63cd8c689270bd499b9eac3a594c2aaec72d7441ff00cd09" +checksum = "e03a64d12a83ebe33bb55de9b77faef4ce27006f946f8468c3311f311f39ab8b" dependencies = [ "aes", "as_variant", @@ -2755,7 +2796,7 @@ checksum = "ad388005c5d4ed2ff38f405d52aa7fa606f4e1ab51baf5f2504721124ed4a58b" dependencies = [ "anyhow", "async-trait", - "base64", + "base64 0.21.7", "getrandom", "gloo-utils", "indexed_db_futures", @@ -2776,9 +2817,9 @@ dependencies = [ [[package]] name = "matrix-sdk-sqlite" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20bd36bc5fa7ecd93516b242ba27466196d52b4a8743d85dd883a67bd6db11dc" +checksum = "77a98d034dd5aa85b4da6500e60c7d5b9328a37632cf40ba38bbe2c77cea3f14" dependencies = [ "async-trait", "deadpool-sqlite", @@ -2820,9 +2861,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -2850,15 +2891,15 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime2ext" -version = "0.1.52" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a85a5069ebd40e64b1985773cc81addbe9d90d7ecf60e7b5475a57ad584c70" +checksum = "515a63dc9666c865e848b043ab52fe9a5c713ae89cde4b5fbaae67cfd614b93a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -2872,14 +2913,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "0.8.11" @@ -2892,6 +2942,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + [[package]] name = "modalkit" version = "0.0.20" @@ -2900,7 +2962,7 @@ checksum = "24f070af2372cc39349d6415c9a2ae050e1e9dc71dddc9a7a036babe7ad2b192" dependencies = [ "anymap2", "arboard", - "bitflags 2.5.0", + "bitflags 2.6.0", "crossterm", "derive_more", "intervaltree", @@ -2931,11 +2993,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static 1.4.0", "libc", "log", "openssl", @@ -2949,9 +3010,9 @@ dependencies = [ [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nibble_vec" @@ -2980,7 +3041,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "cfg_aliases", "libc", @@ -3027,9 +3088,9 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -3040,7 +3101,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -3073,6 +3134,105 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "objc_id" version = "0.1.1" @@ -3084,9 +3244,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -3115,11 +3275,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3136,7 +3296,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -3147,9 +3307,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -3169,12 +3329,12 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.5" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3202,12 +3362,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] @@ -3226,22 +3386,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -3267,9 +3427,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap", @@ -3345,12 +3505,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.0.2", + "fastrand 2.1.1", "futures-io", ] @@ -3381,12 +3541,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" -[[package]] -name = "platforms" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" - [[package]] name = "png" version = "0.17.13" @@ -3397,7 +3551,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.7.4", ] [[package]] @@ -3418,16 +3572,17 @@ dependencies = [ [[package]] name = "polling" -version = "3.5.0" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.32", + "rustix 0.38.35", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3449,9 +3604,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3488,6 +3646,15 @@ dependencies = [ "toml_edit 0.20.7", ] +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.20", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -3514,18 +3681,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.12.4" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc" dependencies = [ "bytes", "prost-derive", @@ -3533,15 +3700,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.4" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -3564,18 +3731,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.31.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +checksum = "6f24d770aeca0eacb81ac29dfbc55ebcc09312fdd1f8bbecdc7e4a84e000e3b4" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3631,21 +3798,21 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb12f8fbf6c62614b0d56eb352af54f6a22410c3b079eb53ee93c7b97dd31d8" +checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cassowary", "compact_str", "crossterm", - "indoc", "itertools 0.12.1", "lru", "paste", "stability", "strum", "unicode-segmentation", + "unicode-truncate", "unicode-width", ] @@ -3655,13 +3822,13 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2264bdb808c89e8395480cfce32c197e75a3d6171063e913bca12e7919a333da" dependencies = [ - "base64", + "base64 0.21.7", "dyn-clone", "icy_sixel", - "image", + "image 0.24.9", "rand", "ratatui", - "rustix 0.38.32", + "rustix 0.38.35", "serde", ] @@ -3687,9 +3854,9 @@ dependencies = [ [[package]] name = "readlock" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b323e7196daa571c8584de958be19e92941c41f845776fe06babfe8fa280a2" +checksum = "072cfe5b1d2dcd38d20e18f85e9c9978b6cc08f0b373e9f1fff1541335622974" [[package]] name = "redox_syscall" @@ -3702,18 +3869,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -3722,9 +3889,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -3734,9 +3901,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -3745,9 +3912,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -3755,7 +3922,7 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -3812,9 +3979,9 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.13" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddb316f4b9cae1a3e89c02f1926d557d1142d0d2e684b038c11c1b77705229a" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" dependencies = [ "byteorder", "num-traits", @@ -3823,9 +3990,9 @@ dependencies = [ [[package]] name = "rmp-serde" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938a142ab806f18b88a97b0dea523d39e0fd730a064b035726adcfc58a8a5188" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" dependencies = [ "byteorder", "rmp", @@ -3844,23 +4011,23 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.2.0" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", "rtoolbox", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "rtoolbox" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -3904,7 +4071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bca4c33c50e47b4cdceeac71bdef0c04153b0e29aa992d9030ec14a62323e85" dependencies = [ "as_variant", - "base64", + "base64 0.21.7", "bytes", "form_urlencoded", "getrandom", @@ -3986,7 +4153,7 @@ dependencies = [ "quote", "ruma-identifiers-validation", "serde", - "syn 2.0.59", + "syn 2.0.76", "toml", ] @@ -3996,7 +4163,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -4006,15 +4173,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] @@ -4035,22 +4202,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -4064,7 +4231,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] @@ -4079,15 +4246,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" @@ -4122,11 +4289,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -4135,9 +4302,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -4145,15 +4312,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] @@ -4171,22 +4338,22 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -4204,31 +4371,32 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -4273,9 +4441,15 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "lazy_static 1.4.0", + "lazy_static 1.5.0", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook" version = "0.3.17" @@ -4288,20 +4462,20 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", - "mio", + "mio 0.8.11", "signal-hook", ] [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -4354,9 +4528,9 @@ dependencies = [ [[package]] name = "slug" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" +checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724" dependencies = [ "deunicode", "wasm-bindgen", @@ -4386,9 +4560,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4415,12 +4589,12 @@ dependencies = [ [[package]] name = "stability" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd1b177894da2a2d9120208c3386066af06a488255caabc5de8ddca22dbc3ce" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.76", ] [[package]] @@ -4443,7 +4617,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -4469,31 +4643,31 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strum" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -4508,9 +4682,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.59" +version = "2.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" +checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" dependencies = [ "proc-macro2", "quote", @@ -4551,25 +4725,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2" dependencies = [ "quick-xml 0.30.0", - "windows 0.51.1", + "windows", ] [[package]] name = "temp-dir" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd16aa9ffe15fe021c6ee3766772132c6e98dfa395a167e16864f61a9cfb71d6" +checksum = "1f227968ec00f0e5322f9b8173c7a0cbcff6181a0a5b28e9892491c286277231" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", - "fastrand 2.0.2", - "rustix 0.38.32", - "windows-sys 0.52.0", + "fastrand 2.1.1", + "once_cell", + "rustix 0.38.35", + "windows-sys 0.59.0", ] [[package]] @@ -4596,22 +4771,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -4670,9 +4845,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4685,30 +4860,29 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" dependencies = [ "backtrace", "bytes", "libc", - "mio", - "num_cpus", + "mio 1.0.2", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -4745,35 +4919,34 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.8.12" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit 0.22.20", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -4802,15 +4975,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.6", + "winnow 0.6.18", ] [[package]] @@ -4829,15 +5002,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -4871,7 +5044,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] @@ -4911,9 +5084,9 @@ dependencies = [ [[package]] name = "tree_magic_mini" -version = "3.1.4" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ee137597cdb361b55a4746983e4ac1b35ab6024396a419944ad473bb915265" +checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" dependencies = [ "fnv", "home", @@ -4969,9 +5142,9 @@ dependencies = [ [[package]] name = "ulid" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34778c17965aa2a08913b57e1f34db9b4a63f5de31768b55bf20d2795f921259" +checksum = "04f903f293d11f31c0c29e4148f6dc0d033a7f80cebc0282bea147611667d289" dependencies = [ "getrandom", "rand", @@ -5021,10 +5194,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] -name = "unicode-width" -version = "0.1.11" +name = "unicode-truncate" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode_categories" @@ -5050,9 +5234,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -5074,15 +5258,15 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom", "wasm-bindgen", @@ -5102,31 +5286,34 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "8.2.5" +version = "8.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e7dc29b3c54a2ea67ef4f953d5ec0c4085035c0ae2d325be1c0d2144bd9f16" +checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" dependencies = [ "anyhow", + "cfg-if", "rustversion", "time", ] [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vodozemac" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2790dffeecc522299d72d9a855c43adb0c23ba1dc1112d79a651fdf3beb2a356" +checksum = "051d4af70b53b42adf2aac459a305851b8d754f210aaf11ab509e1065beff422" dependencies = [ "aes", "arrayvec", - "base64", + "base64 0.22.1", + "base64ct", "cbc", + "chacha20poly1305", "curve25519-dalek", "ed25519-dalek", "getrandom", @@ -5148,9 +5335,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "want" @@ -5169,34 +5356,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -5206,9 +5394,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5216,22 +5404,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" @@ -5248,13 +5436,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" +checksum = "f90e11ce2ca99c97b940ee83edbae9da2d56a08f9ea8158550fd77fa31722993" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.32", + "rustix 0.38.35", "scoped-tls", "smallvec", "wayland-sys", @@ -5262,12 +5450,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.2" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" +checksum = "7e321577a0a165911bdcfb39cf029302479d7527b517ee58ab0f6ad09edf0943" dependencies = [ - "bitflags 2.5.0", - "rustix 0.38.32", + "bitflags 2.6.0", + "rustix 0.38.35", "wayland-backend", "wayland-scanner", ] @@ -5278,7 +5466,7 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -5290,7 +5478,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5299,20 +5487,20 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.1" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" +checksum = "d7b56f89937f1cf2ee1f1259cf2936a17a1f45d8f0aa1019fae6d470d304cfa6" dependencies = [ "proc-macro2", - "quick-xml 0.31.0", + "quick-xml 0.34.0", "quote", ] [[package]] name = "wayland-sys" -version = "0.31.1" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +checksum = "43676fe2daf68754ecf1d72026e4e6c15483198b5d24e888b74d3f22f887a148" dependencies = [ "dlib", "log", @@ -5321,9 +5509,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -5360,14 +5548,14 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.32", + "rustix 0.38.35", ] [[package]] name = "wildmatch" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "939e59c1bc731542357fdaad98b209ef78c8743d652bb61439d16b16a79eb025" +checksum = "3928939971918220fed093266b809d1ee4ec6c1a2d72692ff6876898f3b16c19" [[package]] name = "winapi" @@ -5391,22 +5579,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows" version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-core", + "windows-core 0.51.1", "windows-targets 0.48.5", ] @@ -5419,6 +5598,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -5449,7 +5637,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -5469,18 +5666,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -5497,9 +5694,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -5515,9 +5712,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -5533,15 +5730,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -5557,9 +5754,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -5575,9 +5772,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -5593,9 +5790,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -5611,9 +5808,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -5626,9 +5823,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.6" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -5665,20 +5862,20 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.32", + "rustix 0.38.35", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "x25519-dalek" @@ -5705,12 +5902,12 @@ dependencies = [ [[package]] name = "xdg-home" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" dependencies = [ "libc", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -5798,29 +5995,30 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -5833,7 +6031,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.76", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index ab77424..70c45fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "iamb" -version = "0.0.10" +version = "0.0.11-alpha.1" edition = "2018" authors = ["Ulyssa "] repository = "https://github.com/ulyssa/iamb" @@ -11,7 +11,7 @@ license = "Apache-2.0" exclude = [".github", "CONTRIBUTING.md"] keywords = ["matrix", "chat", "tui", "vim"] categories = ["command-line-utilities"] -rust-version = "1.70" +rust-version = "1.74" build = "build.rs" [features] @@ -46,7 +46,7 @@ nom = "7.0.0" open = "3.2.0" rand = "0.8.5" ratatui = "0.26" -ratatui-image = { version = "1.0.0", features = ["serde"] } +ratatui-image = { version = "=1.0.0", features = ["serde"] } regex = "^1.5" rpassword = "^7.2" serde = "^1.0" @@ -70,7 +70,7 @@ default-features = false features = ["shortcodes"] [dependencies.notify-rust] -version = "4.10.0" +version = "~4.10.0" default-features = false features = ["zbus", "serde"] optional = true diff --git a/README.md b/README.md index 135f640..a3bcc9d 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ user_id = "@user:example.com" ## Installation (via `crates.io`) -Install Rust (1.70.0 or above) and Cargo, and then run: +Install Rust (1.74.0 or above) and Cargo, and then run: ``` cargo install --locked iamb diff --git a/src/message/mod.rs b/src/message/mod.rs index d266a25..ab813bf 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -9,7 +9,7 @@ use std::fmt::{self, Display}; use std::hash::{Hash, Hasher}; use std::ops::{Deref, DerefMut}; -use chrono::{DateTime, Local as LocalTz, NaiveDateTime, TimeZone}; +use chrono::{DateTime, Local as LocalTz}; use humansize::{format_size, DECIMAL}; use serde_json::json; use unicode_width::UnicodeWidthStr; @@ -180,9 +180,8 @@ fn placeholder_frame( #[inline] fn millis_to_datetime(ms: UInt) -> DateTime { let time = i64::from(ms) / 1000; - let time = NaiveDateTime::from_timestamp_opt(time, 0).unwrap_or_default(); - - LocalTz.from_utc_datetime(&time) + let time = DateTime::from_timestamp(time, 0).unwrap_or_default(); + time.into() } #[derive(thiserror::Error, Debug)] From f4492c9f77c87be490285c54d4672c3590ad9f62 Mon Sep 17 00:00:00 2001 From: Nemo157 Date: Fri, 30 Aug 2024 18:10:15 +0200 Subject: [PATCH 04/56] Fix Clippy warning for unused `format!` in 1.81 (#343) --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index d0b265c..7c0ef64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -847,7 +847,7 @@ async fn check_import_keys( let encrypted = match encrypt_room_key_export(&keys, &passphrase, 500000) { Ok(encrypted) => encrypted, Err(e) => { - format!("* Failed to encrypt room keys during export: {e}"); + println!("* Failed to encrypt room keys during export: {e}"); process::exit(2); }, }; From e40a8a8d2e945e029b18b32da09816174e4fe8ac Mon Sep 17 00:00:00 2001 From: Nemo157 Date: Tue, 17 Sep 2024 07:12:16 +0200 Subject: [PATCH 05/56] Fix `ratatui-image` tmux detection when used with a configured image protocol (#352) --- src/base.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/base.rs b/src/base.rs index 5c6bdb9..e46088d 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1276,10 +1276,12 @@ fn picker_from_termios(protocol_type: Option) -> Option { }, }; + // `guess_protocol` also does tmux detection, + // run it always then overwrite the guessed protocol if needed + picker.guess_protocol(); + if let Some(protocol_type) = protocol_type { picker.protocol_type = protocol_type; - } else { - picker.guess_protocol(); } Some(picker) From 9a9bdb4862646da3b03490ab250feb62df7ea468 Mon Sep 17 00:00:00 2001 From: Nemo157 Date: Tue, 17 Sep 2024 07:15:36 +0200 Subject: [PATCH 06/56] Support enabling multiple notification sinks (#344) --- docs/iamb.5 | 2 + src/config.rs | 88 +++++++++++++++++++++++++++++++++++++++----- src/notifications.rs | 32 ++++++++++++---- src/tests.rs | 2 +- 4 files changed, 106 insertions(+), 18 deletions(-) diff --git a/docs/iamb.5 b/docs/iamb.5 index 90d86de..dc288b3 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -269,6 +269,8 @@ to use the desktop mechanism (default). Setting this field to .Dq Sy bell will use the terminal bell instead. +Both can be used via +.Dq Sy desktop|bell . .It Sy show_message controls whether to show the message in the desktop notification, and defaults to diff --git a/src/config.rs b/src/config.rs index 584ac9c..77e874a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -398,23 +398,70 @@ pub enum UserDisplayStyle { DisplayName, } -#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq)] -#[serde(rename_all = "lowercase")] -pub enum NotifyVia { +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct NotifyVia { /// Deliver notifications via terminal bell. - Bell, + pub bell: bool, /// Deliver notifications via desktop mechanism. #[cfg(feature = "desktop")] - Desktop, + pub desktop: bool, } +pub struct NotifyViaVisitor; impl Default for NotifyVia { fn default() -> Self { - #[cfg(not(feature = "desktop"))] - return NotifyVia::Bell; + Self { + bell: cfg!(not(feature = "desktop")), + #[cfg(feature = "desktop")] + desktop: true, + } + } +} - #[cfg(feature = "desktop")] - return NotifyVia::Desktop; +impl<'de> Visitor<'de> for NotifyViaVisitor { + type Value = NotifyVia; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a valid notify destination (e.g. \"bell\" or \"desktop\")") + } + + fn visit_str(self, value: &str) -> Result + where + E: SerdeError, + { + let mut via = NotifyVia { + bell: false, + #[cfg(feature = "desktop")] + desktop: false, + }; + + for value in value.split('|') { + match value.to_ascii_lowercase().as_str() { + "bell" => { + via.bell = true; + }, + #[cfg(feature = "desktop")] + "desktop" => { + via.desktop = true; + }, + #[cfg(not(feature = "desktop"))] + "desktop" => { + return Err(E::custom("desktop notification support was compiled out")) + }, + _ => return Err(E::custom("could not parse into a notify destination")), + }; + } + + Ok(via) + } +} + +impl<'de> Deserialize<'de> for NotifyVia { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(NotifyViaVisitor) } } @@ -1189,6 +1236,29 @@ mod tests { assert_eq!(run, &exp); } + #[test] + fn test_parse_notify_via() { + assert_eq!(NotifyVia { bell: false, desktop: true }, NotifyVia::default()); + assert_eq!( + NotifyVia { bell: false, desktop: true }, + serde_json::from_str(r#""desktop""#).unwrap() + ); + assert_eq!( + NotifyVia { bell: true, desktop: false }, + serde_json::from_str(r#""bell""#).unwrap() + ); + assert_eq!( + NotifyVia { bell: true, desktop: true }, + serde_json::from_str(r#""bell|desktop""#).unwrap() + ); + assert_eq!( + NotifyVia { bell: true, desktop: true }, + serde_json::from_str(r#""desktop|bell""#).unwrap() + ); + assert!(serde_json::from_str::(r#""other""#).is_err()); + assert!(serde_json::from_str::(r#""""#).is_err()); + } + #[test] fn test_load_example_config_toml() { let path = PathBuf::from("config.example.toml"); diff --git a/src/notifications.rs b/src/notifications.rs index f6cf3e3..32762d4 100644 --- a/src/notifications.rs +++ b/src/notifications.rs @@ -63,11 +63,7 @@ pub async fn register_notifications( return; } - match notify_via { - #[cfg(feature = "desktop")] - NotifyVia::Desktop => send_notification_desktop(summary, body), - NotifyVia::Bell => send_notification_bell(&store).await, - } + send_notification(¬ify_via, &store, &summary, body.as_deref()).await; }, Err(err) => { tracing::error!("Failed to extract notification data: {err}") @@ -78,22 +74,42 @@ pub async fn register_notifications( .await; } +async fn send_notification( + via: &NotifyVia, + store: &AsyncProgramStore, + summary: &str, + body: Option<&str>, +) { + #[cfg(feature = "desktop")] + if via.desktop { + send_notification_desktop(summary, body); + } + #[cfg(not(feature = "desktop"))] + { + let _ = (summary, body, IAMB_XDG_NAME); + } + + if via.bell { + send_notification_bell(store).await; + } +} + async fn send_notification_bell(store: &AsyncProgramStore) { let mut locked = store.lock().await; locked.application.ring_bell = true; } #[cfg(feature = "desktop")] -fn send_notification_desktop(summary: String, body: Option) { +fn send_notification_desktop(summary: &str, body: Option<&str>) { let mut desktop_notification = notify_rust::Notification::new(); desktop_notification - .summary(&summary) + .summary(summary) .appname(IAMB_XDG_NAME) .icon(IAMB_XDG_NAME) .action("default", "default"); if let Some(body) = body { - desktop_notification.body(&body); + desktop_notification.body(body); } if let Err(err) = desktop_notification.show() { diff --git a/src/tests.rs b/src/tests.rs index b385992..fa379de 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -191,7 +191,7 @@ pub fn mock_tunables() -> TunableValues { message_user_color: false, notifications: Notifications { enabled: false, - via: NotifyVia::Desktop, + via: NotifyVia::default(), show_message: true, }, image_preview: None, From e66a8c6716064e15274acaa18f9100f9ca748631 Mon Sep 17 00:00:00 2001 From: Stu Black Date: Mon, 17 Feb 2025 22:22:16 -0500 Subject: [PATCH 07/56] Bump matrix-sdk dependency to 0.8 (#386) --- .github/workflows/ci.yml | 4 +- Cargo.lock | 863 +++++++++++++++++++++++---------------- Cargo.toml | 4 +- README.md | 2 +- flake.lock | 58 +-- src/message/mod.rs | 4 +- src/notifications.rs | 44 +- src/preview.rs | 7 +- src/windows/room/chat.rs | 4 +- src/windows/room/mod.rs | 4 +- src/worker.rs | 28 +- 11 files changed, 586 insertions(+), 436 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 745e198..a47af2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: uses: actions/checkout@v3 with: submodules: true - - name: Install Rust (1.74 w/ clippy) - uses: dtolnay/rust-toolchain@1.74 + - name: Install Rust (1.76 w/ clippy) + uses: dtolnay/rust-toolchain@1.76 with: components: clippy - name: Install Rust (nightly w/ rustfmt) diff --git a/Cargo.lock b/Cargo.lock index 572c39a..cfe0c59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,7 +11,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -161,16 +161,16 @@ checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" [[package]] name = "aquamarine" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" dependencies = [ "include_dir", "itertools 0.10.5", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -350,7 +350,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -390,7 +390,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -407,7 +407,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -422,6 +422,61 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tower 0.5.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "backoff" version = "0.4.0" @@ -486,6 +541,9 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "bitmaps" @@ -636,24 +694,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg-vis" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a2c3bf5fc10fe2ca157564fbe08a4cb2b0a7d2ff3fe2f9683e65d5e7c7859c" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "cfg_aliases" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chacha20" version = "0.9.1" @@ -735,7 +787,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1005,7 +1057,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1044,12 +1096,17 @@ dependencies = [ ] [[package]] -name = "deadpool" -version = "0.10.0" +name = "date_header" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490" +checksum = "0c03c416ed1a30fbb027ef484ba6ab6f80e1eada675e1a2b92fd673c045a1f1d" + +[[package]] +name = "deadpool" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6541a3916932fe57768d4be0b1ffb5ec7cbf74ca8c903fdfd5c0fe8aa958f0ed" dependencies = [ - "async-trait", "deadpool-runtime", "num_cpus", "tokio", @@ -1066,9 +1123,9 @@ dependencies = [ [[package]] name = "deadpool-sqlite" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8010e36e12f3be22543a5e478b4af20aeead9a700dd69581a5e050a070fc22c" +checksum = "2f9cc6210316f8b7ced394e2a5d2833ce7097fb28afb5881299c61bc18e8e0e9" dependencies = [ "deadpool", "deadpool-sync", @@ -1084,6 +1141,17 @@ dependencies = [ "deadpool-runtime", ] +[[package]] +name = "decancer" +version = "3.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a41401dd84c9335e2f5aec7f64057e243585d62622260d41c245919a601ccc9" +dependencies = [ + "lazy_static 1.5.0", + "paste", + "regex", +] + [[package]] name = "delegate-display" version = "2.1.1" @@ -1093,7 +1161,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1103,22 +1171,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", - "der_derive", - "flagset", "zeroize", ] -[[package]] -name = "der_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.76", -] - [[package]] name = "deranged" version = "0.3.11" @@ -1147,7 +1202,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1191,7 +1246,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1258,17 +1313,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.76", -] - [[package]] name = "dlib" version = "0.5.2" @@ -1341,15 +1385,6 @@ dependencies = [ "phf 0.11.2", ] -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "endian-type" version = "0.1.2" @@ -1380,7 +1415,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1422,17 +1457,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "5.3.1" @@ -1483,14 +1507,13 @@ dependencies = [ [[package]] name = "eyeball-im" -version = "0.4.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9326c8d9f6d59d18935412608b4514cc661e4e068011bb2f523f6c8b1cfa3bd4" +checksum = "a1c02432230060cae0621e15803e073976d22974e0f013c9cb28a4ea1b484629" dependencies = [ "futures-core", "imbl", "tokio", - "tokio-util", "tracing", ] @@ -1515,7 +1538,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1554,12 +1577,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" -[[package]] -name = "flagset" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" - [[package]] name = "flate2" version = "1.0.33" @@ -1612,7 +1629,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1740,7 +1757,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1857,22 +1874,15 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.26" +name = "growable-bloom-filter" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "d174ccb4ba660d431329e7f0797870d0a4281e36353ec4b4a3c5eab6c2cfb6f1" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "serde", + "serde_bytes", + "serde_derive", + "xxhash-rust", ] [[package]] @@ -1897,9 +1907,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ "hashbrown", ] @@ -1977,9 +1987,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.12" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1988,12 +1998,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", "pin-project-lite", ] @@ -2020,53 +2042,75 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.30" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "h2", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http", "hyper", + "hyper-util", "rustls", + "rustls-pki-types", "tokio", "tokio-rustls", + "tower-service", + "webpki-roots", ] [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", + "http-body-util", "hyper", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -2108,7 +2152,7 @@ dependencies = [ "serde_json", "sled", "temp-dir", - "thiserror", + "thiserror 1.0.63", "tokio", "toml", "tracing", @@ -2198,9 +2242,9 @@ dependencies = [ [[package]] name = "imbl" -version = "2.0.3" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978d142c8028edf52095703af2fad11d6f611af1246685725d6b850634647085" +checksum = "bc3be8d8cd36f33a46b1849f31f837c44d9fa87223baee3b4bd96b8f11df81eb" dependencies = [ "bitmaps", "imbl-sized-chunks", @@ -2240,9 +2284,9 @@ dependencies = [ [[package]] name = "indexed_db_futures" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0704b71f13f81b5933d791abf2de26b33c40935143985220299a357721166706" +checksum = "43315957678a70eb21fb0d2384fe86dde0d6c859a01e24ce127eb65a0143d28c" dependencies = [ "accessory", "cfg-if", @@ -2283,9 +2327,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", ] [[package]] @@ -2477,9 +2518,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" dependencies = [ "cc", "pkg-config", @@ -2562,7 +2603,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2573,7 +2614,7 @@ checksum = "13198c120864097a565ccb3ff947672d969932b7975ebd4085732c9f09435e55" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2586,7 +2627,7 @@ dependencies = [ "macroific_core", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2631,33 +2672,39 @@ dependencies = [ ] [[package]] -name = "matrix-pickle" -version = "0.2.0" +name = "matchit" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb521190328c57a2051f70250beb874dc0fac6bcd22b615f7f9700b7b4fb826" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "matrix-pickle" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2551de3bba2cc65b52dc6b268df6114011fe118ac24870fbcf1b35537bd721" dependencies = [ "matrix-pickle-derive", - "thiserror", + "thiserror 1.0.63", ] [[package]] name = "matrix-pickle-derive" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fb3c7231cbb7fbbc50871615edebf65183b382cdaa1fe21c5e88a12617de8e" +checksum = "f75de44c3120d78e978adbcf6d453b20ba011f3c46363e52d1dbbc72f545e9fb" dependencies = [ "proc-macro-crate 3.2.0", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "matrix-sdk" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336687e5fc8b33661a31681e988a67e9a3090c7fb1a8323a7f71eeaabad642ec" +checksum = "e5e2b229a3076e8b36ca3508e79efb6892a4ea841699504ff74fb59910c7d2d0" dependencies = [ "anymap2", "aquamarine", @@ -2665,26 +2712,28 @@ dependencies = [ "async-channel", "async-stream", "async-trait", + "axum", "backoff", "bytes", "bytesize", - "cfg-vis", - "event-listener 4.0.3", + "event-listener 5.3.1", "eyeball", "eyeball-im", "futures-core", "futures-util", "gloo-timers", + "growable-bloom-filter", "http", - "hyper", "imbl", "indexmap", + "js_int", "matrix-sdk-base", "matrix-sdk-common", "matrix-sdk-indexeddb", "matrix-sdk-sqlite", "mime", "mime2ext", + "pin-project-lite", "rand", "reqwest", "ruma", @@ -2692,56 +2741,62 @@ dependencies = [ "serde_html_form", "serde_json", "tempfile", - "thiserror", + "thiserror 1.0.63", "tokio", "tokio-stream", "tokio-util", - "tower", + "tower 0.4.13", "tracing", "url", "urlencoding", + "vodozemac", "zeroize", ] [[package]] name = "matrix-sdk-base" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00891954d0826a94f1d130f46cbca64176003a234c1be5d9d282970d31cf0c87" +checksum = "126ede42ff624f934408005d4d3a641a505a101997a359f85029ae9b8a5b3ab2" dependencies = [ "as_variant", "async-trait", "bitflags 2.6.0", + "decancer", "eyeball", "eyeball-im", "futures-util", + "growable-bloom-filter", "matrix-sdk-common", "matrix-sdk-crypto", "matrix-sdk-store-encryption", "once_cell", + "regex", "ruma", "serde", "serde_json", - "thiserror", + "thiserror 1.0.63", "tokio", "tracing", + "unicode-normalization", ] [[package]] name = "matrix-sdk-common" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb365a626ab6f6c6a2422cfe2565522f19accb06706c6d04bca8f0f71df29c9f" +checksum = "1c355b0413586375441d67eb1682445a4bef8ebb127cf12bce0a7ed2741add75" dependencies = [ "async-trait", + "eyeball-im", "futures-core", "futures-util", "gloo-timers", - "instant", + "imbl", "ruma", "serde", "serde_json", - "thiserror", + "thiserror 1.0.63", "tokio", "tracing", "tracing-subscriber", @@ -2752,16 +2807,15 @@ dependencies = [ [[package]] name = "matrix-sdk-crypto" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03a64d12a83ebe33bb55de9b77faef4ce27006f946f8468c3311f311f39ab8b" +checksum = "e45967fe90a6f20e8426178224fff6f731c0737367821d6a39ae40baf91e8e85" dependencies = [ "aes", "as_variant", "async-trait", "bs58", "byteorder", - "cbc", "cfg-if", "ctr", "eyeball", @@ -2770,6 +2824,7 @@ dependencies = [ "hkdf", "hmac", "itertools 0.12.1", + "js_option", "matrix-sdk-common", "pbkdf2", "rand", @@ -2779,47 +2834,51 @@ dependencies = [ "serde_json", "sha2", "subtle", - "thiserror", + "thiserror 1.0.63", + "time", "tokio", "tokio-stream", "tracing", "ulid", + "url", "vodozemac", "zeroize", ] [[package]] name = "matrix-sdk-indexeddb" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad388005c5d4ed2ff38f405d52aa7fa606f4e1ab51baf5f2504721124ed4a58b" +checksum = "aa3c1b0ab6b9c97a675594e4f8b8959d37ac417dbd62bfdb2ab676512ae9a5f0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.22.1", "getrandom", "gloo-utils", + "hkdf", "indexed_db_futures", "js-sys", - "matrix-sdk-base", "matrix-sdk-crypto", "matrix-sdk-store-encryption", "ruma", "serde", "serde-wasm-bindgen", "serde_json", - "thiserror", + "sha2", + "thiserror 1.0.63", "tokio", "tracing", "wasm-bindgen", "web-sys", + "zeroize", ] [[package]] name = "matrix-sdk-sqlite" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a98d034dd5aa85b4da6500e60c7d5b9328a37632cf40ba38bbe2c77cea3f14" +checksum = "45c3c864379aab89141f728fd06a1334bbafd67ff089fa3d74314764db474b97" dependencies = [ "async-trait", "deadpool-sqlite", @@ -2832,7 +2891,7 @@ dependencies = [ "rusqlite", "serde", "serde_json", - "thiserror", + "thiserror 1.0.63", "tokio", "tracing", "vodozemac", @@ -2840,14 +2899,13 @@ dependencies = [ [[package]] name = "matrix-sdk-store-encryption" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a7e3162e9f982a4c57ab46df01a4775f697dec8899738bf62d7e97b63faa61c" +checksum = "9d05c000fdbbf42849ed10422349e1554b477a77b8d7183d28156bd99e124c8d" dependencies = [ + "base64 0.22.1", "blake3", "chacha20poly1305", - "displaydoc", - "getrandom", "hmac", "pbkdf2", "rand", @@ -2855,7 +2913,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror", + "thiserror 1.0.63", "zeroize", ] @@ -2971,7 +3029,7 @@ dependencies = [ "radix_trie", "regex", "ropey", - "thiserror", + "thiserror 1.0.63", "unicode-segmentation", "unicode-width", ] @@ -3043,7 +3101,7 @@ checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ "bitflags 2.6.0", "cfg-if", - "cfg_aliases", + "cfg_aliases 0.1.1", "libc", ] @@ -3296,7 +3354,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -3491,6 +3549,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -3514,17 +3592,6 @@ dependencies = [ "futures-io", ] -[[package]] -name = "pkcs7" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79178be066405e0602bf3035946edef6b11b3f9dde46dfe5f8bfd7dea4b77e7" -dependencies = [ - "der", - "spki", - "x509-cert", -] - [[package]] name = "pkcs8" version = "0.10.2" @@ -3637,15 +3704,6 @@ dependencies = [ "toml_edit 0.19.15", ] -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit 0.20.7", -] - [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -3656,43 +3714,40 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", "prost-derive", @@ -3700,15 +3755,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -3738,6 +3793,58 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.5.7", + "thiserror 2.0.5", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes", + "getrandom", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.5", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +dependencies = [ + "cfg_aliases 0.2.1", + "libc", + "once_cell", + "socket2 0.5.7", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -3884,14 +3991,14 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.63", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -3901,9 +4008,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3912,27 +4019,27 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", + "http-body-util", "hyper", "hyper-rustls", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -3941,13 +4048,14 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "quinn", "rustls", "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", - "system-configuration", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3959,7 +4067,7 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "winreg", + "windows-registry", ] [[package]] @@ -4032,9 +4140,9 @@ dependencies = [ [[package]] name = "ruma" -version = "0.9.4" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2779c38df072964c63476259d9300efb07d0d1a7178c6469893636ce0c547a36" +checksum = "e94984418ae8a5e1160e6c87608141330e9ae26330abf22e3d15416efa96d48a" dependencies = [ "assign", "js_int", @@ -4043,16 +4151,19 @@ dependencies = [ "ruma-common", "ruma-events", "ruma-federation-api", + "web-time", ] [[package]] name = "ruma-client-api" -version = "0.17.4" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "641837258fa214a70823477514954ef0f5d3bc6ae8e1d5d85081856a33103386" +checksum = "325e054db8d5545c00767d9868356d61e63f2c6cb8b54768346d66696ea4ad48" dependencies = [ + "as_variant", "assign", "bytes", + "date_header", "http", "js_int", "js_option", @@ -4062,16 +4173,19 @@ dependencies = [ "serde", "serde_html_form", "serde_json", + "thiserror 1.0.63", + "url", + "web-time", ] [[package]] name = "ruma-common" -version = "0.12.1" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bca4c33c50e47b4cdceeac71bdef0c04153b0e29aa992d9030ec14a62323e85" +checksum = "ad71c7f49abaa047ba228339d34f9aaefa4d8b50ebeb8e859d0340cc2138bda8" dependencies = [ "as_variant", - "base64 0.21.7", + "base64 0.22.1", "bytes", "form_urlencoded", "getrandom", @@ -4088,18 +4202,20 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror", + "thiserror 1.0.63", + "time", "tracing", "url", "uuid", + "web-time", "wildmatch", ] [[package]] name = "ruma-events" -version = "0.27.11" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20a52770e5a9fb30b7a1c14ba8b3dcf76dadc01674e58e40094f78e6bd5e3f1" +checksum = "be86dccf3504588c1f4dc1bda4ce1f8bbd646fc6dda40c77cc7de6e203e62dad" dependencies = [ "as_variant", "indexmap", @@ -4112,19 +4228,22 @@ dependencies = [ "ruma-macros", "serde", "serde_json", - "thiserror", + "thiserror 1.0.63", "tracing", "url", + "web-time", "wildmatch", ] [[package]] name = "ruma-federation-api" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1901c1f27bc327652d58af2a130c73acef3198abeccd24cee97f7267fdf3fe7" +checksum = "1b5a09ac22b3352bf7a350514dc9a87e1b56aba04c326ac9ce142740f7218afa" dependencies = [ + "http", "js_int", + "mime", "ruma-common", "ruma-events", "serde", @@ -4133,35 +4252,36 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8ad1259274f2f57c20901bd1cc5e4a8f23169d1c1d887b6338b02f058e9b41" +checksum = "2e7f9b534a65698d7db3c08d94bf91de0046fe6c7893a7b360502f65e7011ac4" dependencies = [ "js_int", - "thiserror", + "thiserror 1.0.63", ] [[package]] name = "ruma-macros" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0280534a4b3e34416f883285fac4f9c408cd0b737890ae66f3e7a7056d14be80" +checksum = "c8d57d3cb20e8e758e8f7c5e408ce831d46758003b615100099852e468631934" dependencies = [ + "cfg-if", "once_cell", - "proc-macro-crate 2.0.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "ruma-identifiers-validation", "serde", - "syn 2.0.76", + "syn 2.0.90", "toml", ] [[package]] name = "rusqlite" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" dependencies = [ "bitflags 2.6.0", "fallible-iterator", @@ -4177,6 +4297,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "rustc_version" version = "0.4.1" @@ -4215,32 +4341,44 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.12" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ - "log", + "once_cell", "ring", + "rustls-pki-types", "rustls-webpki", - "sct", + "subtle", + "zeroize", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", ] [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] @@ -4277,16 +4415,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "security-framework" version = "2.11.1" @@ -4318,9 +4446,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -4347,13 +4475,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -4371,9 +4499,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -4381,6 +4509,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_repr" version = "0.1.19" @@ -4389,7 +4527,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -4594,7 +4732,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -4660,7 +4798,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -4682,9 +4820,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.76" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -4698,24 +4836,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "system-configuration" -version = "0.5.1" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "futures-core", ] [[package]] @@ -4775,7 +4901,16 @@ version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.63", +] + +[[package]] +name = "thiserror" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643caef17e3128658ff44d85923ef2d28af81bb71e0d67bbfe1d76f19a73e053" +dependencies = [ + "thiserror-impl 2.0.5", ] [[package]] @@ -4786,7 +4921,18 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995d0bbc9995d1f19d28b7215a9352b0fc3cd3a2d2ec95c2cadc485cdedbcdde" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -4882,7 +5028,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -4897,9 +5043,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", "tokio", @@ -4962,17 +5108,6 @@ dependencies = [ "winnow 0.5.40", ] -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.20" @@ -4992,8 +5127,25 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", "futures-util", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -5031,7 +5183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.63", "time", "tracing-subscriber", ] @@ -5044,7 +5196,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -5180,9 +5332,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] @@ -5304,9 +5456,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vodozemac" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d4af70b53b42adf2aac459a305851b8d754f210aaf11ab509e1065beff422" +checksum = "dd4b56780b7827dd72c3c6398c3048752bebf8d1d84ec19b606b15dbc3c850b8" dependencies = [ "aes", "arrayvec", @@ -5320,7 +5472,6 @@ dependencies = [ "hkdf", "hmac", "matrix-pickle", - "pkcs7", "prost", "rand", "serde", @@ -5328,7 +5479,7 @@ dependencies = [ "serde_json", "sha2", "subtle", - "thiserror", + "thiserror 1.0.63", "x25519-dalek", "zeroize", ] @@ -5376,7 +5527,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "wasm-bindgen-shared", ] @@ -5410,7 +5561,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5529,9 +5680,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "weezl" @@ -5607,6 +5761,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -5830,16 +6014,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wl-clipboard-rs" version = "0.8.1" @@ -5852,7 +6026,7 @@ dependencies = [ "nix 0.28.0", "os_pipe", "tempfile", - "thiserror", + "thiserror 1.0.63", "tree_magic_mini", "wayland-backend", "wayland-client", @@ -5889,17 +6063,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "x509-cert" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" -dependencies = [ - "const-oid", - "der", - "spki", -] - [[package]] name = "xdg-home" version = "1.3.0" @@ -5921,6 +6084,12 @@ dependencies = [ "markup5ever", ] +[[package]] +name = "xxhash-rust" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" + [[package]] name = "yansi" version = "0.5.1" @@ -6011,7 +6180,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -6031,7 +6200,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 70c45fd..c78c232 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" exclude = [".github", "CONTRIBUTING.md"] keywords = ["matrix", "chat", "tui", "vim"] categories = ["command-line-utilities"] -rust-version = "1.74" +rust-version = "1.76" build = "build.rs" [features] @@ -87,7 +87,7 @@ version = "0.0.20" #rev = "24f3ec11c7f634005a27b26878d0fbbdcc08f272" [dependencies.matrix-sdk] -version = "0.7.1" +version = "0.8.0" default-features = false features = ["e2e-encryption", "sqlite", "sso-login"] diff --git a/README.md b/README.md index a3bcc9d..08be482 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ user_id = "@user:example.com" ## Installation (via `crates.io`) -Install Rust (1.74.0 or above) and Cargo, and then run: +Install Rust (1.76.0 or above) and Cargo, and then run: ``` cargo install --locked iamb diff --git a/flake.lock b/flake.lock index ff2375f..00e09a9 100644 --- a/flake.lock +++ b/flake.lock @@ -5,29 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1709126324, - "narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "d465f4819400de7c8d874d50b982301f28a84605", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -38,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1709703039, - "narHash": "sha256-6hqgQ8OK6gsMu1VtcGKBxKQInRLHtzulDo9Z5jxHEFY=", + "lastModified": 1736883708, + "narHash": "sha256-uQ+NQ0/xYU0N1CnXsa2zghgNaOPxWpMJXSUJJ9W7140=", "owner": "nixos", "repo": "nixpkgs", - "rev": "9df3e30ce24fd28c7b3e2de0d986769db5d6225d", + "rev": "eb62e6aa39ea67e0b8018ba8ea077efe65807dc8", "type": "github" }, "original": { @@ -54,11 +36,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1706487304, - "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", + "lastModified": 1736320768, + "narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", + "rev": "4bc9c909d9ac828a039f288cf872d16d38185db8", "type": "github" }, "original": { @@ -77,15 +59,14 @@ }, "rust-overlay": { "inputs": { - "flake-utils": "flake-utils_2", "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1709863839, - "narHash": "sha256-QpEL5FmZNi2By3sKZY55wGniFXc4wEn9PQczlE8TG0o=", + "lastModified": 1736994333, + "narHash": "sha256-v4Jrok5yXsZ6dwj2+2uo5cSyUi9fBTurHqHvNHLT1XA=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "e5ab9ee98f479081ad971473d2bc13c59e9fbc0a", + "rev": "848db855cb9e88785996e961951659570fc58814", "type": "github" }, "original": { @@ -108,21 +89,6 @@ "repo": "default", "type": "github" } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root", diff --git a/src/message/mod.rs b/src/message/mod.rs index ab813bf..ab9798e 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -1096,9 +1096,9 @@ impl Message { let padding = user_gutter - 2 - width; let sender = if align_right { - space(padding) + &truncated + " " + format!("{}{} ", space(padding), truncated) } else { - truncated.into_owned() + &space(padding) + " " + format!("{}{} ", truncated, space(padding)) }; Span::styled(sender, style).into() diff --git a/src/notifications.rs b/src/notifications.rs index 32762d4..83038a4 100644 --- a/src/notifications.rs +++ b/src/notifications.rs @@ -1,11 +1,12 @@ use std::time::SystemTime; use matrix_sdk::{ + deserialized_responses::RawAnySyncOrStrippedTimelineEvent, notification_settings::{IsEncrypted, IsOneToOne, NotificationSettings, RoomNotificationMode}, room::Room as MatrixRoom, ruma::{ - api::client::push::get_notifications::v3::Notification, events::{room::message::MessageType, AnyMessageLikeEventContent, AnySyncTimelineEvent}, + serde::Raw, MilliSecondsSinceUnixEpoch, RoomId, }, @@ -53,21 +54,30 @@ pub async fn register_notifications( return; } - match parse_notification(notification, room, show_message).await { - Ok((summary, body, server_ts)) => { - if server_ts < startup_ts { - return; - } + match notification.event { + RawAnySyncOrStrippedTimelineEvent::Sync(e) => { + match parse_full_notification(e, room, show_message).await { + Ok((summary, body, server_ts)) => { + if server_ts < startup_ts { + return; + } - if is_missing_mention(&body, mode, &client) { - return; - } + if is_missing_mention(&body, mode, &client) { + return; + } - send_notification(¬ify_via, &store, &summary, body.as_deref()).await; - }, - Err(err) => { - tracing::error!("Failed to extract notification data: {err}") + send_notification(¬ify_via, &store, &summary, body.as_deref()) + .await; + }, + Err(err) => { + tracing::error!("Failed to extract notification data: {err}") + }, + } }, + // Stripped events may be dropped silently because they're + // only relevant if we're not in a room, and we presumably + // don't want notifications for rooms we're not in. + RawAnySyncOrStrippedTimelineEvent::Stripped(_) => (), } } }) @@ -171,12 +181,12 @@ async fn is_visible_room(store: &AsyncProgramStore, room_id: &RoomId) -> bool { is_focused(&locked) && is_open(&mut locked, room_id) } -pub async fn parse_notification( - notification: Notification, +pub async fn parse_full_notification( + event: Raw, room: MatrixRoom, show_body: bool, ) -> IambResult<(String, Option, MilliSecondsSinceUnixEpoch)> { - let event = notification.event.deserialize().map_err(IambError::from)?; + let event = event.deserialize().map_err(IambError::from)?; let server_ts = event.origin_server_ts(); @@ -188,7 +198,7 @@ pub async fn parse_notification( .and_then(|m| m.display_name()) .unwrap_or_else(|| sender_id.localpart()); - let summary = if let Ok(room_name) = room.display_name().await { + let summary = if let Some(room_name) = room.cached_display_name() { format!("{sender_name} in {room_name}") } else { sender_name.to_string() diff --git a/src/preview.rs b/src/preview.rs index 932eb39..cf69c1c 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -5,7 +5,7 @@ use std::{ }; use matrix_sdk::{ - media::{MediaFormat, MediaRequest}, + media::{MediaFormat, MediaRequestParameters}, ruma::{ events::{ room::{ @@ -157,7 +157,10 @@ async fn download_or_load( }, Err(_) => { media - .get_media_content(&MediaRequest { source, format: MediaFormat::File }, true) + .get_media_content( + &MediaRequestParameters { source, format: MediaFormat::File }, + true, + ) .await .and_then(|buffer| { if let Err(err) = diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index 427a2df..efbe8f1 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -14,7 +14,7 @@ use url::Url; use matrix_sdk::{ attachment::AttachmentConfig, - media::{MediaFormat, MediaRequest}, + media::{MediaFormat, MediaRequestParameters}, room::Room as MatrixRoom, ruma::{ events::reaction::ReactionEventContent, @@ -276,7 +276,7 @@ impl ChatState { } if !filename.exists() || flags.contains(DownloadFlags::FORCE) { - let req = MediaRequest { source, format: MediaFormat::File }; + let req = MediaRequestParameters { source, format: MediaFormat::File }; let bytes = media.get_media_content(&req, true).await.map_err(IambError::from)?; diff --git a/src/windows/room/mod.rs b/src/windows/room/mod.rs index f959172..b6d4d23 100644 --- a/src/windows/room/mod.rs +++ b/src/windows/room/mod.rs @@ -26,7 +26,7 @@ use matrix_sdk::{ OwnedUserId, RoomId, }, - DisplayName, + RoomDisplayName, RoomState as MatrixRoomState, }; @@ -139,7 +139,7 @@ impl RoomState { pub fn new( room: MatrixRoom, thread: Option, - name: DisplayName, + name: RoomDisplayName, tags: Option, store: &mut ProgramStore, ) -> Self { diff --git a/src/worker.rs b/src/worker.rs index 9ca830c..d47cb37 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -13,6 +13,7 @@ use std::time::{Duration, Instant}; use futures::{stream::FuturesUnordered, StreamExt}; use gethostname::gethostname; +use matrix_sdk::ruma::events::AnySyncTimelineEvent; use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}; use tokio::sync::Semaphore; use tokio::task::JoinHandle; @@ -21,6 +22,7 @@ use url::Url; use matrix_sdk::{ config::{RequestConfig, SyncSettings}, + deserialized_responses::DisplayName, encryption::verification::{SasVerification, Verification}, encryption::{BackupDownloadStrategy, EncryptionSettings}, event_handler::Ctx, @@ -58,7 +60,6 @@ use matrix_sdk::{ typing::SyncTypingEvent, AnyInitialStateEvent, AnyMessageLikeEvent, - AnyTimelineEvent, EmptyStateKey, InitialStateEvent, SyncEphemeralRoomEvent, @@ -78,8 +79,8 @@ use matrix_sdk::{ }, Client, ClientBuildError, - DisplayName, Error as MatrixError, + RoomDisplayName, RoomMemberships, }; @@ -293,10 +294,10 @@ async fn load_older_one( let mut msgs = vec![]; for ev in chunk.into_iter() { - let msg = match ev.event.deserialize() { - Ok(AnyTimelineEvent::MessageLike(msg)) => msg, - Ok(AnyTimelineEvent::State(_)) => continue, - Err(_) => continue, + let deserialized = ev.into_raw().deserialize().map_err(IambError::Serde)?; + let msg: AnyMessageLikeEvent = match deserialized { + AnySyncTimelineEvent::MessageLike(e) => e.into_full_event(room_id.to_owned()), + AnySyncTimelineEvent::State(_) => continue, }; let event_id = msg.event_id(); @@ -440,7 +441,7 @@ async fn refresh_rooms(client: &Client, store: &AsyncProgramStore) { let mut dms = vec![]; for room in client.invited_rooms().into_iter() { - let name = room.display_name().await.unwrap_or(DisplayName::Empty).to_string(); + let name = room.cached_display_name().unwrap_or(RoomDisplayName::Empty).to_string(); let tags = room.tags().await.unwrap_or_default(); names.push((room.room_id().to_owned(), name)); @@ -455,7 +456,7 @@ async fn refresh_rooms(client: &Client, store: &AsyncProgramStore) { } for room in client.joined_rooms().into_iter() { - let name = room.display_name().await.unwrap_or(DisplayName::Empty).to_string(); + let name = room.cached_display_name().unwrap_or(RoomDisplayName::Empty).to_string(); let tags = room.tags().await.unwrap_or_default(); names.push((room.room_id().to_owned(), name)); @@ -603,7 +604,7 @@ fn oneshot() -> (ClientReply, ClientResponse) { return (reply, response); } -pub type FetchedRoom = (MatrixRoom, DisplayName, Option); +pub type FetchedRoom = (MatrixRoom, RoomDisplayName, Option); pub enum WorkerTask { Init(AsyncProgramStore, ClientReply<()>), @@ -1076,11 +1077,12 @@ impl ClientWorker { let room_id = room.room_id(); let user_id = ev.state_key; - let ambiguous_name = - ev.content.displayname.as_deref().unwrap_or_else(|| user_id.localpart()); + let ambiguous_name = DisplayName::new( + ev.content.displayname.as_deref().unwrap_or_else(|| user_id.as_str()), + ); let ambiguous = client .store() - .get_users_with_display_name(room_id, ambiguous_name) + .get_users_with_display_name(room_id, &ambiguous_name) .await .map(|users| users.len() > 1) .unwrap_or_default(); @@ -1346,7 +1348,7 @@ impl ClientWorker { async fn get_room(&mut self, room_id: OwnedRoomId) -> IambResult { if let Some(room) = self.client.get_room(&room_id) { - let name = room.display_name().await.map_err(IambError::from)?; + let name = room.cached_display_name().ok_or_else(|| IambError::UnknownRoom(room_id))?; let tags = room.tags().await.map_err(IambError::from)?; Ok((room, name, tags)) From b023e38f772f167f9c3a9e7d6dc105b2bc784a8e Mon Sep 17 00:00:00 2001 From: Odd Eivind Ebbesen Date: Mon, 24 Feb 2025 04:16:46 +0100 Subject: [PATCH 08/56] Updated rust version and added sqlite in flake.nix (#396) --- flake.nix | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 43dfd3b..e12bb5b 100644 --- a/flake.nix +++ b/flake.nix @@ -14,7 +14,7 @@ # We only need the nightly overlay in the devShell because .rs files are formatted with nightly. overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; - rustNightly = pkgs.rust-bin.nightly."2024-03-08".default; + rustNightly = pkgs.rust-bin.nightly."2024-12-12".default; in with pkgs; { @@ -27,7 +27,7 @@ }; nativeBuildInputs = [ pkg-config ]; buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin - (with darwin.apple_sdk.frameworks; [ AppKit Security Cocoa]); + (with darwin.apple_sdk.frameworks; [ AppKit Security Cocoa ]); }; devShell = mkShell { @@ -38,6 +38,7 @@ pkg-config cargo-tarpaulin cargo-watch + sqlite ]; }; }); From 6470e845e075fea0455e14dd2a7b83992499c399 Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Thu, 15 May 2025 01:22:27 +0000 Subject: [PATCH 09/56] Fix warning from `cargo doc` (#413) --- src/base.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base.rs b/src/base.rs index e46088d..b766448 100644 --- a/src/base.rs +++ b/src/base.rs @@ -833,7 +833,7 @@ pub struct RoomInfo { /// A map of the most recent read marker for each user. /// - /// Every receipt in this map should also have an entry in [`event_receipts`], + /// Every receipt in this map should also have an entry in [`event_receipts`](`Self::event_receipts`), /// however not every user has an entry. If a user's most recent receipt is /// older than the oldest loaded event, that user will not be included. pub user_receipts: HashMap, From 2b6363f529e01301c4bbdd04a3a6dede59681cc2 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Wed, 14 May 2025 18:38:22 -0700 Subject: [PATCH 10/56] Update to `mozilla-actions/sccache-action@v0.0.9` (#419) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a47af2c..2324af6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.3 + uses: mozilla-actions/sccache-action@v0.0.9 - name: Check formatting run: cargo +nightly fmt --all -- --check - name: Check Clippy From 591fc0af8367cd327533c7b7600e6299eccd013c Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Thu, 15 May 2025 03:46:13 +0200 Subject: [PATCH 11/56] Address some warnings and typos (#408) --- README.md | 2 +- docs/iamb.5 | 2 +- src/message/mod.rs | 2 +- src/windows/mod.rs | 2 +- src/worker.rs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 08be482..ce9a9e5 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ pkg install iamb ### macOS -On macOS a [package](https://formulae.brew.sh/formula/iamb#default) is availabe in Homebrew's +On macOS a [package](https://formulae.brew.sh/formula/iamb#default) is available in Homebrew's repository. To install it simply run: ``` diff --git a/docs/iamb.5 b/docs/iamb.5 index dc288b3..b615ec6 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -336,7 +336,7 @@ Defaults to .El .El -.Ss Example 1: Group room members by ther server first +.Ss Example 1: Group room members by their server first .Bd -literal -offset indent [settings.sort] members = ["server", "localpart"] diff --git a/src/message/mod.rs b/src/message/mod.rs index ab9798e..a200140 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -961,7 +961,7 @@ impl Message { vwctx: &ViewportContext, info: &'a RoomInfo, settings: &'a ApplicationSettings, - ) -> (Text<'a>, Option<(&dyn Protocol, u16, u16)>) { + ) -> (Text<'a>, Option<(&'a dyn Protocol, u16, u16)>) { let width = vwctx.get_width(); let style = self.get_render_style(selected, settings); diff --git a/src/windows/mod.rs b/src/windows/mod.rs index c7882be..eae10d8 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -5,7 +5,7 @@ //! //! Additionally, some of the iamb commands delegate behaviour to the current UI element. For //! example, [sending messages][crate::base::SendAction] delegate to the [room window][RoomState], -//! where we have the message bar and room ID easily accesible and resetable. +//! where we have the message bar and room ID easily accessible and resettable. use std::cmp::{Ord, Ordering, PartialOrd}; use std::fmt::{self, Display}; use std::ops::Deref; diff --git a/src/worker.rs b/src/worker.rs index d47cb37..81b4865 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -1311,7 +1311,7 @@ impl ClientWorker { // Remove the session.json file. std::fs::remove_file(&self.settings.session_json)?; - Ok(Some(InfoMessage::from("Sucessfully logged out"))) + Ok(Some(InfoMessage::from("Successfully logged out"))) } async fn direct_message(&mut self, user: OwnedUserId) -> IambResult { From 382a72a46878fb4cf4d2930b1ca3f2143bd69bf9 Mon Sep 17 00:00:00 2001 From: Repoman Date: Wed, 14 May 2025 22:51:19 -0300 Subject: [PATCH 12/56] Mention Gentoo's GURU ebuild in the README (#374) --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index ce9a9e5..68d2fda 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,24 @@ On FreeBSD a package is available from the official repositories. To install it pkg install iamb ``` +### Gentoo + +On Gentoo, an ebuild is available from the community-managed +[GURU overlay](https://wiki.gentoo.org/wiki/Project:GURU). + +You can enable the GURU overlay with: + +``` +eselect repository enable guru +emerge --sync guru +``` + +And then install `iamb` with: + +``` +emerge --ask iamb +``` + ### macOS On macOS a [package](https://formulae.brew.sh/formula/iamb#default) is available in Homebrew's From 1dcd658928ec46767577915f8ff1506652c1879c Mon Sep 17 00:00:00 2001 From: daef Date: Wed, 14 May 2025 19:05:28 -0700 Subject: [PATCH 13/56] Support `:room topic show` (#380) --- src/commands.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/commands.rs b/src/commands.rs index 4335eb7..152b41f 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -475,6 +475,10 @@ fn iamb_room(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult { ("topic", "unset", None) => RoomAction::Unset(RoomField::Topic).into(), ("topic", "unset", Some(_)) => return Result::Err(CommandError::InvalidArgument), + // :room topic show + ("topic", "show", None) => RoomAction::Show(RoomField::Topic).into(), + ("topic", "show", Some(_)) => return Result::Err(CommandError::InvalidArgument), + // :room tag set ("tag", "set", Some(s)) => RoomAction::Set(RoomField::Tag(tag_name(s)?), "".into()).into(), ("tag", "set", None) => return Result::Err(CommandError::InvalidArgument), From 7dd09e32a8be67721eb873bfd22d249c508c6b78 Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Thu, 15 May 2025 04:39:22 +0200 Subject: [PATCH 14/56] Support an `"invite"` field in the room sorting settings (#395) Co-authored-by: Felix Van der Jeugt --- docs/iamb.5 | 20 +++++++++++ src/base.rs | 4 +++ src/config.rs | 3 +- src/windows/mod.rs | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 1 deletion(-) diff --git a/docs/iamb.5 b/docs/iamb.5 index b615ec6..26fc1b7 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -334,6 +334,26 @@ window. Defaults to .Sy ["power",\ "id"] . .El + +The available values are: +.Bl -tag -width Ds +.It Sy favorite +Put favorite rooms before other rooms. +.It Sy lowpriority +Put lowpriority rooms after other rooms. +.It Sy name +Sort rooms by alphabetically ascending room name. +.It Sy alias +Sort rooms by alphabetically ascending canonical room alias. +.It Sy id +Sort rooms by alphabetically ascending Matrix room identifier. +.It Sy unread +Put unread rooms before other rooms. +.It Sy recent +Sort rooms by most recent message timestamp. +.It Sy invite +Put invites before other rooms. +.El .El .Ss Example 1: Group room members by their server first diff --git a/src/base.rs b/src/base.rs index b766448..62ba83c 100644 --- a/src/base.rs +++ b/src/base.rs @@ -243,6 +243,9 @@ pub enum SortFieldRoom { /// Sort rooms by the timestamps of their most recent messages. Recent, + + /// Sort rooms by whether they are invites. + Invite, } /// Fields that users can be sorted by. @@ -307,6 +310,7 @@ impl<'de> Visitor<'de> for SortRoomVisitor { "name" => SortFieldRoom::Name, "alias" => SortFieldRoom::Alias, "id" => SortFieldRoom::RoomId, + "invite" => SortFieldRoom::Invite, _ => { let msg = format!("Unknown sort field: {value:?}"); return Err(E::custom(msg)); diff --git a/src/config.rs b/src/config.rs index 77e874a..9c3aa0a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -45,8 +45,9 @@ const DEFAULT_MEMBERS_SORT: [SortColumn; 2] = [ SortColumn(SortFieldUser::UserId, SortOrder::Ascending), ]; -const DEFAULT_ROOM_SORT: [SortColumn; 4] = [ +const DEFAULT_ROOM_SORT: [SortColumn; 5] = [ SortColumn(SortFieldRoom::Favorite, SortOrder::Ascending), + SortColumn(SortFieldRoom::Invite, SortOrder::Ascending), SortColumn(SortFieldRoom::LowPriority, SortOrder::Ascending), SortColumn(SortFieldRoom::Unread, SortOrder::Ascending), SortColumn(SortFieldRoom::Name, SortOrder::Ascending), diff --git a/src/windows/mod.rs b/src/windows/mod.rs index eae10d8..a642c95 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -23,6 +23,7 @@ use matrix_sdk::{ RoomAliasId, RoomId, }, + RoomState as MatrixRoomState, }; use ratatui::{ @@ -195,6 +196,10 @@ fn room_cmp(a: &T, b: &T, field: &SortFieldRoom) -> Ordering { // sort larger timestamps towards the top. some_cmp(a.recent_ts(), b.recent_ts(), |a, b| b.cmp(a)) }, + SortFieldRoom::Invite => { + // sort invites before other rooms. + b.is_invite().cmp(&a.is_invite()) + }, } } @@ -273,6 +278,7 @@ trait RoomLikeItem { fn recent_ts(&self) -> Option<&MessageTimeStamp>; fn alias(&self) -> Option<&RoomAliasId>; fn name(&self) -> &str; + fn is_invite(&self) -> bool; } #[inline] @@ -914,6 +920,10 @@ impl RoomLikeItem for GenericChatItem { fn is_unread(&self) -> bool { self.unread.is_unread() } + + fn is_invite(&self) -> bool { + self.room().state() == MatrixRoomState::Invited + } } impl Display for GenericChatItem { @@ -1024,6 +1034,10 @@ impl RoomLikeItem for RoomItem { fn is_unread(&self) -> bool { self.unread.is_unread() } + + fn is_invite(&self) -> bool { + self.room().state() == MatrixRoomState::Invited + } } impl Display for RoomItem { @@ -1124,6 +1138,10 @@ impl RoomLikeItem for DirectItem { fn is_unread(&self) -> bool { self.unread.is_unread() } + + fn is_invite(&self) -> bool { + self.room().state() == MatrixRoomState::Invited + } } impl Display for DirectItem { @@ -1223,6 +1241,10 @@ impl RoomLikeItem for SpaceItem { // XXX: this needs to check whether the space contains rooms with unread messages false } + + fn is_invite(&self) -> bool { + self.room().state() == MatrixRoomState::Invited + } } impl Display for SpaceItem { @@ -1556,6 +1578,7 @@ mod tests { alias: Option, name: &'static str, unread: UnreadInfo, + invite: bool, } impl RoomLikeItem for &TestRoomItem { @@ -1582,6 +1605,10 @@ mod tests { fn is_unread(&self) -> bool { self.unread.is_unread() } + + fn is_invite(&self) -> bool { + self.invite + } } #[test] @@ -1594,6 +1621,7 @@ mod tests { alias: Some(room_alias_id!("#room1:example.com").to_owned()), name: "Z", unread: UnreadInfo::default(), + invite: false, }; let room2 = TestRoomItem { @@ -1602,6 +1630,7 @@ mod tests { alias: Some(room_alias_id!("#a:example.com").to_owned()), name: "Unnamed Room", unread: UnreadInfo::default(), + invite: false, }; let room3 = TestRoomItem { @@ -1610,6 +1639,7 @@ mod tests { alias: None, name: "Cool Room", unread: UnreadInfo::default(), + invite: false, }; // Sort by Name ascending. @@ -1655,6 +1685,7 @@ mod tests { alias: None, name: "Room 1", unread: UnreadInfo { unread: false, latest: None }, + invite: false, }; let room2 = TestRoomItem { @@ -1666,6 +1697,7 @@ mod tests { unread: false, latest: Some(MessageTimeStamp::OriginServer(40u32.into())), }, + invite: false, }; let room3 = TestRoomItem { @@ -1677,6 +1709,7 @@ mod tests { unread: false, latest: Some(MessageTimeStamp::OriginServer(20u32.into())), }, + invite: false, }; // Sort by Recent ascending. @@ -1691,4 +1724,54 @@ mod tests { rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); assert_eq!(rooms, vec![&room1, &room3, &room2]); } + + #[test] + fn test_sort_room_invites() { + let server = server_name!("example.com"); + + let room1 = TestRoomItem { + room_id: RoomId::new(server).to_owned(), + tags: vec![], + alias: None, + name: "Old room 1", + unread: UnreadInfo::default(), + invite: false, + }; + + let room2 = TestRoomItem { + room_id: RoomId::new(server).to_owned(), + tags: vec![], + alias: None, + name: "Old room 2", + unread: UnreadInfo::default(), + invite: false, + }; + + let room3 = TestRoomItem { + room_id: RoomId::new(server).to_owned(), + tags: vec![], + alias: None, + name: "New Fancy Room", + unread: UnreadInfo::default(), + invite: true, + }; + + // Sort invites first + let mut rooms = vec![&room1, &room2, &room3]; + let fields = &[ + SortColumn(SortFieldRoom::Invite, SortOrder::Ascending), + SortColumn(SortFieldRoom::Name, SortOrder::Ascending), + ]; + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + assert_eq!(rooms, vec![&room3, &room1, &room2]); + + // Sort invites after + let mut rooms = vec![&room1, &room2, &room3]; + let fields = &[ + SortColumn(SortFieldRoom::Invite, SortOrder::Descending), + SortColumn(SortFieldRoom::Name, SortOrder::Ascending), + ]; + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + assert_eq!(rooms, vec![&room1, &room2, &room3]); + } } From 3e45ca3d2cd7127a93647369027a33ea50b8c991 Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Thu, 15 May 2025 03:26:35 +0000 Subject: [PATCH 15/56] Support adding rooms to spaces (#407) --- docs/iamb.1 | 10 ++ src/base.rs | 47 ++++++++++ src/commands.rs | 193 +++++++++++++++++++++++++++++++++++++- src/main.rs | 3 + src/windows/mod.rs | 14 +++ src/windows/room/mod.rs | 23 +++++ src/windows/room/space.rs | 81 +++++++++++++++- 7 files changed, 366 insertions(+), 5 deletions(-) diff --git a/docs/iamb.1 b/docs/iamb.1 index 38070a2..3e31ce2 100644 --- a/docs/iamb.1 +++ b/docs/iamb.1 @@ -159,6 +159,8 @@ Create and point the given alias to the room. Delete the provided alias from the room's alternative alias list. .It Sy ":room alias show" Show alternative aliases to the room, if any are set. +.It Sy ":room id show" +Show the Matrix identifier for the room. .It Sy ":room canon set [alias]" Set the room's canonical alias to the one provided, and make the previous one an alternative alias. .It Sy ":room canon unset [alias]" @@ -173,6 +175,14 @@ Unban a user from this room with an optional reason. Kick a user from this room with an optional reason. .El +.Sh "SPACE COMMANDS" +.Bl -tag -width Ds +.It Sy ":space child set [room_id]" +Add a room to the currently focused space. +.It Sy ":space child remove" +Remove the selected room from the currently focused space. +.El + .Sh "WINDOW COMMANDS" .Bl -tag -width Ds .It Sy ":horizontal [cmd]" diff --git a/src/base.rs b/src/base.rs index 62ba83c..43df297 100644 --- a/src/base.rs +++ b/src/base.rs @@ -177,6 +177,19 @@ pub enum MessageAction { Unreact(Option, bool), } +/// An action taken in the currently selected space. +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum SpaceAction { + /// Add a room or update metadata. + /// + /// The [`Option`] argument is the order parameter. + /// The [`bool`] argument indicates whether the room is suggested. + SetChild(OwnedRoomId, Option, bool), + + /// Remove the selected room. + RemoveChild, +} + /// The type of room being created. #[derive(Clone, Debug, Eq, PartialEq)] pub enum CreateRoomType { @@ -379,6 +392,9 @@ pub enum RoomField { /// The room name. Name, + /// The room id. + Id, + /// A room tag. Tag(TagName), @@ -497,6 +513,9 @@ pub enum IambAction { /// Perform an action on the currently selected message. Message(MessageAction), + /// Perform an action on the current space. + Space(SpaceAction), + /// Open a URL. OpenLink(String), @@ -538,6 +557,12 @@ impl From for IambAction { } } +impl From for IambAction { + fn from(act: SpaceAction) -> Self { + IambAction::Space(act) + } +} + impl From for IambAction { fn from(act: RoomAction) -> Self { IambAction::Room(act) @@ -557,6 +582,7 @@ impl ApplicationAction for IambAction { IambAction::Homeserver(..) => SequenceStatus::Break, IambAction::Keys(..) => SequenceStatus::Break, IambAction::Message(..) => SequenceStatus::Break, + IambAction::Space(..) => SequenceStatus::Break, IambAction::Room(..) => SequenceStatus::Break, IambAction::OpenLink(..) => SequenceStatus::Break, IambAction::Send(..) => SequenceStatus::Break, @@ -572,6 +598,7 @@ impl ApplicationAction for IambAction { IambAction::Homeserver(..) => SequenceStatus::Atom, IambAction::Keys(..) => SequenceStatus::Atom, IambAction::Message(..) => SequenceStatus::Atom, + IambAction::Space(..) => SequenceStatus::Atom, IambAction::OpenLink(..) => SequenceStatus::Atom, IambAction::Room(..) => SequenceStatus::Atom, IambAction::Send(..) => SequenceStatus::Atom, @@ -587,6 +614,7 @@ impl ApplicationAction for IambAction { IambAction::Homeserver(..) => SequenceStatus::Ignore, IambAction::Keys(..) => SequenceStatus::Ignore, IambAction::Message(..) => SequenceStatus::Ignore, + IambAction::Space(..) => SequenceStatus::Ignore, IambAction::Room(..) => SequenceStatus::Ignore, IambAction::OpenLink(..) => SequenceStatus::Ignore, IambAction::Send(..) => SequenceStatus::Ignore, @@ -601,6 +629,7 @@ impl ApplicationAction for IambAction { IambAction::ClearUnreads => false, IambAction::Homeserver(..) => false, IambAction::Message(..) => false, + IambAction::Space(..) => false, IambAction::Room(..) => false, IambAction::Keys(..) => false, IambAction::Send(..) => false, @@ -618,6 +647,12 @@ impl From for ProgramAction { } } +impl From for ProgramAction { + fn from(act: SpaceAction) -> Self { + IambAction::from(act).into() + } +} + impl From for ProgramAction { fn from(act: IambAction) -> Self { Action::Application(act) @@ -713,10 +748,22 @@ pub enum IambError { #[error("Current window is not a room or space")] NoSelectedRoomOrSpace, + /// A failure due to not having a room or space item selected in a list. + #[error("No room or space currently selected in list")] + NoSelectedRoomOrSpaceItem, + /// A failure due to not having a room selected. #[error("Current window is not a room")] NoSelectedRoom, + /// A failure due to not having a space selected. + #[error("Current window is not a space")] + NoSelectedSpace, + + /// A failure due to not having sufficient permission to perform an action in a room. + #[error("You do not have the permission to do that")] + InsufficientPermission, + /// A failure due to not having an outstanding room invitation. #[error("You do not have a current invitation to this room")] NotInvited, diff --git a/src/commands.rs b/src/commands.rs index 152b41f..fc111c8 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -2,9 +2,9 @@ //! //! The command-bar commands are set up here, and iamb-specific commands are defined here. See //! [modalkit::env::vim::command] for additional Vim commands we pull in. -use std::convert::TryFrom; +use std::{convert::TryFrom, str::FromStr as _}; -use matrix_sdk::ruma::{events::tag::TagName, OwnedUserId}; +use matrix_sdk::ruma::{events::tag::TagName, OwnedRoomId, OwnedUserId}; use modalkit::{ commands::{CommandError, CommandResult, CommandStep}, @@ -27,6 +27,7 @@ use crate::base::{ RoomAction, RoomField, SendAction, + SpaceAction, VerifyAction, }; @@ -535,6 +536,90 @@ fn iamb_room(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult { return Result::Err(CommandError::InvalidArgument) }, + // :room id show + ("id", "show", None) => RoomAction::Show(RoomField::Id).into(), + ("id", "show", Some(_)) => return Result::Err(CommandError::InvalidArgument), + + _ => return Result::Err(CommandError::InvalidArgument), + }; + + let step = CommandStep::Continue(act.into(), ctx.context.clone()); + + return Ok(step); +} + +fn iamb_space(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult { + let mut args = desc.arg.options()?; + + if args.len() < 2 { + return Err(CommandError::InvalidArgument); + } + + let OptionType::Positional(field) = args.remove(0) else { + return Err(CommandError::InvalidArgument); + }; + let OptionType::Positional(action) = args.remove(0) else { + return Err(CommandError::InvalidArgument); + }; + + let act: IambAction = match (field.as_str(), action.as_str()) { + ("child", "remove") => { + if !(args.is_empty()) { + return Err(CommandError::InvalidArgument); + } + SpaceAction::RemoveChild.into() + }, + // :space child set + ("child", "set") => { + let mut order = None; + let mut suggested = false; + let mut raw_child = None; + + for arg in args { + match arg { + OptionType::Flag(name, Some(arg)) => { + match name.as_str() { + "order" => { + if order.is_some() { + let msg = "Multiple ++order arguments are not allowed"; + let err = CommandError::Error(msg.into()); + + return Err(err); + } else { + order = Some(arg); + } + }, + _ => return Err(CommandError::InvalidArgument), + } + }, + OptionType::Flag(name, None) => { + match name.as_str() { + "suggested" => suggested = true, + _ => return Err(CommandError::InvalidArgument), + } + }, + OptionType::Positional(arg) => { + if raw_child.is_some() { + let msg = "Multiple room arguments are not allowed"; + let err = CommandError::Error(msg.into()); + + return Err(err); + } + raw_child = Some(arg); + }, + } + } + + let child = if let Some(child) = raw_child { + OwnedRoomId::from_str(&child) + .map_err(|_| CommandError::Error("Invalid room id specified".into()))? + } else { + let msg = "Must specify a room to add"; + return Err(CommandError::Error(msg.into())); + }; + + SpaceAction::SetChild(child, order, suggested).into() + }, _ => return Result::Err(CommandError::InvalidArgument), }; @@ -671,6 +756,11 @@ fn add_iamb_commands(cmds: &mut ProgramCommands) { f: iamb_rooms, }); cmds.add_command(ProgramCommand { name: "room".into(), aliases: vec![], f: iamb_room }); + cmds.add_command(ProgramCommand { + name: "space".into(), + aliases: vec![], + f: iamb_space, + }); cmds.add_command(ProgramCommand { name: "spaces".into(), aliases: vec![], @@ -725,7 +815,7 @@ pub fn setup_commands() -> ProgramCommands { #[cfg(test)] mod tests { use super::*; - use matrix_sdk::ruma::user_id; + use matrix_sdk::ruma::{room_id, user_id}; use modalkit::actions::WindowAction; use modalkit::editing::context::EditContext; @@ -1067,6 +1157,103 @@ mod tests { assert_eq!(res, vec![(act.into(), ctx.clone())]); } + #[test] + fn test_cmd_room_id_show() { + let mut cmds = setup_commands(); + let ctx = EditContext::default(); + + let res = cmds.input_cmd("room id show", ctx.clone()).unwrap(); + let act = RoomAction::Show(RoomField::Id); + assert_eq!(res, vec![(act.into(), ctx.clone())]); + + let res = cmds.input_cmd("room id show foo", ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + } + + #[test] + fn test_cmd_space_child() { + let mut cmds = setup_commands(); + let ctx = EditContext::default(); + + let cmd = "space"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + + let cmd = "space ++foo bar baz"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + + let cmd = "space child foo"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + } + + #[test] + fn test_cmd_space_child_set() { + let mut cmds = setup_commands(); + let ctx = EditContext::default(); + + let cmd = "space child set !roomid:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()).unwrap(); + let act = SpaceAction::SetChild(room_id!("!roomid:example.org").to_owned(), None, false); + assert_eq!(res, vec![(act.into(), ctx.clone())]); + + let cmd = "space child set ++order=abcd ++suggested !roomid:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()).unwrap(); + let act = SpaceAction::SetChild( + room_id!("!roomid:example.org").to_owned(), + Some("abcd".into()), + true, + ); + assert_eq!(res, vec![(act.into(), ctx.clone())]); + + let cmd = "space child set ++order=abcd ++order=1234 !roomid:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!( + res, + Err(CommandError::Error("Multiple ++order arguments are not allowed".into())) + ); + + let cmd = "space child set !roomid:example.org !otherroom:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::Error("Multiple room arguments are not allowed".into()))); + + let cmd = "space child set ++foo=abcd !roomid:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + + let cmd = "space child set ++foo !roomid:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + + let cmd = "space child ++order=abcd ++suggested set !roomid:example.org"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + + let cmd = "space child set foo"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::Error("Invalid room id specified".into()))); + + let cmd = "space child set"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::Error("Must specify a room to add".into()))); + } + + #[test] + fn test_cmd_space_child_remove() { + let mut cmds = setup_commands(); + let ctx = EditContext::default(); + + let cmd = "space child remove"; + let res = cmds.input_cmd(cmd, ctx.clone()).unwrap(); + let act = SpaceAction::RemoveChild; + assert_eq!(res, vec![(act.into(), ctx.clone())]); + + let cmd = "space child remove foo"; + let res = cmds.input_cmd(cmd, ctx.clone()); + assert_eq!(res, Err(CommandError::InvalidArgument)); + } + #[test] fn test_cmd_invite() { let mut cmds = setup_commands(); diff --git a/src/main.rs b/src/main.rs index 7c0ef64..b300048 100644 --- a/src/main.rs +++ b/src/main.rs @@ -557,6 +557,9 @@ impl Application { IambAction::Message(act) => { self.screen.current_window_mut()?.message_command(act, ctx, store).await? }, + IambAction::Space(act) => { + self.screen.current_window_mut()?.space_command(act, ctx, store).await? + }, IambAction::Room(act) => { let acts = self.screen.current_window_mut()?.room_command(act, ctx, store).await?; self.action_prepend(acts); diff --git a/src/windows/mod.rs b/src/windows/mod.rs index a642c95..0169e19 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -76,6 +76,7 @@ use crate::base::{ SortFieldRoom, SortFieldUser, SortOrder, + SpaceAction, UnreadInfo, }; @@ -360,6 +361,19 @@ impl IambWindow { } } + pub async fn space_command( + &mut self, + act: SpaceAction, + ctx: ProgramContext, + store: &mut ProgramStore, + ) -> IambResult { + if let IambWindow::Room(w) = self { + w.space_command(act, ctx, store).await + } else { + return Err(IambError::NoSelectedRoom.into()); + } + } + pub async fn room_command( &mut self, act: RoomAction, diff --git a/src/windows/room/mod.rs b/src/windows/room/mod.rs index b6d4d23..4898d86 100644 --- a/src/windows/room/mod.rs +++ b/src/windows/room/mod.rs @@ -66,6 +66,7 @@ use crate::base::{ RoomAction, RoomField, SendAction, + SpaceAction, }; use self::chat::ChatState; @@ -214,6 +215,18 @@ impl RoomState { } } + pub async fn space_command( + &mut self, + act: SpaceAction, + ctx: ProgramContext, + store: &mut ProgramStore, + ) -> IambResult { + match self { + RoomState::Space(space) => space.space_command(act, ctx, store).await, + RoomState::Chat(_) => Err(IambError::NoSelectedSpace.into()), + } + } + pub async fn send_command( &mut self, act: SendAction, @@ -464,6 +477,9 @@ impl RoomState { RoomField::Aliases => { // This never happens, aliases is only used for showing }, + RoomField::Id => { + // This never happens, id is only used for showing + }, } Ok(vec![]) @@ -559,6 +575,9 @@ impl RoomState { RoomField::Aliases => { // This will not happen, you cannot unset all aliases }, + RoomField::Id => { + // This never happens, id is only used for showing + }, } Ok(vec![]) @@ -574,6 +593,10 @@ impl RoomState { let visibility = room.history_visibility(); format!("Room history visibility: {visibility}") }, + RoomField::Id => { + let id = room.room_id(); + format!("Room identifier: {id}") + }, RoomField::Name => { match room.name() { None => "Room has no name".into(), diff --git a/src/windows/room/space.rs b/src/windows/room/space.rs index 7b6f967..6b3579e 100644 --- a/src/windows/room/space.rs +++ b/src/windows/room/space.rs @@ -2,11 +2,14 @@ use std::ops::{Deref, DerefMut}; use std::time::{Duration, Instant}; +use matrix_sdk::ruma::events::space::child::SpaceChildEventContent; +use matrix_sdk::ruma::events::StateEventType; use matrix_sdk::{ room::Room as MatrixRoom, ruma::{OwnedRoomId, RoomId}, }; +use modalkit::prelude::{EditInfo, InfoMessage}; use ratatui::{ buffer::Buffer, layout::Rect, @@ -22,9 +25,18 @@ use modalkit_ratatui::{ WindowOps, }; -use crate::base::{IambBufferId, IambInfo, ProgramStore, RoomFocus}; +use crate::base::{ + IambBufferId, + IambError, + IambInfo, + IambResult, + ProgramContext, + ProgramStore, + RoomFocus, + SpaceAction, +}; -use crate::windows::{room_fields_cmp, RoomItem}; +use crate::windows::{room_fields_cmp, RoomItem, RoomLikeItem}; const SPACE_HIERARCHY_DEBOUNCE: Duration = Duration::from_secs(5); @@ -68,6 +80,71 @@ impl SpaceState { last_fetch: self.last_fetch, } } + + pub async fn space_command( + &mut self, + act: SpaceAction, + _: ProgramContext, + store: &mut ProgramStore, + ) -> IambResult { + match act { + SpaceAction::SetChild(child_id, order, suggested) => { + if !self + .room + .can_user_send_state( + &store.application.settings.profile.user_id, + StateEventType::SpaceChild, + ) + .await + .map_err(IambError::from)? + { + return Err(IambError::InsufficientPermission.into()); + } + + let via = self.room.route().await.map_err(IambError::from)?; + let mut ev = SpaceChildEventContent::new(via); + ev.order = order; + ev.suggested = suggested; + let _ = self + .room + .send_state_event_for_key(&child_id, ev) + .await + .map_err(IambError::from)?; + + Ok(InfoMessage::from("Space updated").into()) + }, + SpaceAction::RemoveChild => { + let space = self.list.get().ok_or(IambError::NoSelectedRoomOrSpaceItem)?; + if !self + .room + .can_user_send_state( + &store.application.settings.profile.user_id, + StateEventType::SpaceChild, + ) + .await + .map_err(IambError::from)? + { + return Err(IambError::InsufficientPermission.into()); + } + + let ev = SpaceChildEventContent::new(vec![]); + let event_id = self + .room + .send_state_event_for_key(&space.room_id().to_owned(), ev) + .await + .map_err(IambError::from)?; + + // Fix for element (see https://github.com/element-hq/element-web/issues/29606) + let _ = self + .room + .redact(&event_id.event_id, Some("workaround for element bug"), None) + .await + .map_err(IambError::from)?; + + Ok(InfoMessage::from("Room removed").into()) + }, + } + } } impl TerminalCursor for SpaceState { From a9c1e69a8945d74acfce7c6c99bcd7f5db871a5c Mon Sep 17 00:00:00 2001 From: Andrew Collins Date: Thu, 15 May 2025 14:23:39 +1000 Subject: [PATCH 16/56] Fix image preview in replies and threads (#366) --- src/message/mod.rs | 36 +++++++++++++++++++++++----------- src/windows/room/scrollback.rs | 12 +++++++++--- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/message/mod.rs b/src/message/mod.rs index a200140..d9c0716 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -70,6 +70,8 @@ mod printer; pub use self::compose::text_to_message; +type ProtocolPreview<'a> = (&'a dyn Protocol, u16, u16); + pub type MessageKey = (MessageTimeStamp, OwnedEventId); #[derive(Default)] @@ -715,11 +717,12 @@ impl<'a> MessageFormatter<'a> { style: Style, text: &mut Text<'a>, info: &'a RoomInfo, - ) { + settings: &'a ApplicationSettings, + ) -> Option> { let width = self.width(); let w = width.saturating_sub(2); let shortcodes = self.settings.tunables.message_shortcode_display; - let (mut replied, _) = msg.show_msg(w, style, true, shortcodes); + let (mut replied, proto) = msg.show_msg(w, style, true, shortcodes); let mut sender = msg.sender_span(info, self.settings); let sender_width = UnicodeWidthStr::width(sender.content.as_ref()); let trailing = w.saturating_sub(sender_width + 1); @@ -738,12 +741,22 @@ impl<'a> MessageFormatter<'a> { text, ); + // Determine the image offset of the reply header, taking into account the formatting + let proto = proto.map(|p| { + let y_off = text.lines.len() as u16; + // Adjust x_off by 2 to account for the vertical line and indent + let x_off = self.cols.user_gutter_width(settings) + 2; + (p, x_off, y_off) + }); + for line in replied.lines.iter_mut() { line.spans.insert(0, Span::styled(THICK_VERTICAL, style)); line.spans.insert(0, Span::styled(" ", style)); } self.push_text(replied, style, text); + + proto } fn push_reactions(&mut self, counts: Vec<(&'a str, usize)>, style: Style, text: &mut Text<'a>) { @@ -961,7 +974,7 @@ impl Message { vwctx: &ViewportContext, info: &'a RoomInfo, settings: &'a ApplicationSettings, - ) -> (Text<'a>, Option<(&'a dyn Protocol, u16, u16)>) { + ) -> (Text<'a>, [Option>; 2]) { let width = vwctx.get_width(); let style = self.get_render_style(selected, settings); @@ -974,10 +987,10 @@ impl Message { .reply_to() .or_else(|| self.thread_root()) .and_then(|e| info.get_event(&e)); - - if let Some(r) = &reply { - fmt.push_in_reply(r, style, &mut text, info); - } + let proto_reply = reply.as_ref().and_then(|r| { + // Format the reply header, push it into the `Text` buffer, and get any image. + fmt.push_in_reply(r, style, &mut text, info, settings) + }); // Now show the message contents, and the inlined reply if we couldn't find it above. let (msg, proto) = self.show_msg( @@ -988,10 +1001,11 @@ impl Message { ); // Given our text so far, determine the image offset. - let proto = proto.map(|p| { + let proto_main = proto.map(|p| { let y_off = text.lines.len() as u16; let x_off = fmt.cols.user_gutter_width(settings); - // Adjust y_off by 1 if a date was printed before the message to account for the extra line. + // Adjust y_off by 1 if a date was printed before the message to account for + // the extra line we're going to print. let y_off = if fmt.date.is_some() { y_off + 1 } else { y_off }; (p, x_off, y_off) }); @@ -1012,7 +1026,7 @@ impl Message { fmt.push_thread_reply_count(thread.len(), &mut text); } - (text, proto) + (text, [proto_main, proto_reply]) } pub fn show<'a>( @@ -1053,7 +1067,7 @@ impl Message { }, ImageStatus::Loaded(backend) => { proto = Some(backend.as_ref()); - placeholder_frame(None, width, &backend.rect().into()) + placeholder_frame(Some("Loading..."), width, &backend.rect().into()) }, ImageStatus::Error(err) => Some(format!("[Image error: {err}]\n")), }; diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index eeb6c2d..cc0e3bd 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -1340,7 +1340,7 @@ impl<'a> StatefulWidget for Scrollback<'a> { for (key, item) in thread.range(&corner_key..) { let sel = key == cursor_key; - let (txt, mut msg_preview) = + let (txt, [mut msg_preview, mut reply_preview]) = item.show_with_preview(prev, foc && sel, &state.viewctx, info, settings); let incomplete_ok = !full || !sel; @@ -1357,11 +1357,17 @@ impl<'a> StatefulWidget for Scrollback<'a> { continue; } + // Only take the preview into the matching row number. + // `reply` and `msg` previews are on rows, + // so an `or` works to pick the one that matches (if any) let line_preview = match msg_preview { - // Only take the preview into the matching row number. Some((_, _, y)) if y as usize == row => msg_preview.take(), _ => None, - }; + } + .or(match reply_preview { + Some((_, _, y)) if y as usize == row => reply_preview.take(), + _ => None, + }); lines.push((key, row, line, line_preview)); sawit |= sel; From 6529e619633e36ae08ed3834e42630fba1b2b983 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Thu, 15 May 2025 09:26:41 -0700 Subject: [PATCH 17/56] Update binaries workflow to `mozilla-actions/sccache-action@v0.0.9` (#419) --- .github/workflows/binaries.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 4d9668a..3299035 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -60,7 +60,7 @@ jobs: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Run sccache-cache - uses: mozilla-actions/sccache-action@v0.0.3 + uses: mozilla-actions/sccache-action@v0.0.9 - name: 'Build: binary' run: cargo build --release --locked --target ${{ env.TARGET }} - name: 'Upload: binary' From 93502f9993b9696230510f6bc4b31829833ad70b Mon Sep 17 00:00:00 2001 From: Ken Rachynski Date: Thu, 15 May 2025 18:56:35 -0600 Subject: [PATCH 18/56] Bump matrix-sdk dependency to 0.10.0 (#397) --- Cargo.lock | 916 +++++++++++++++++++++++++++------------ Cargo.toml | 4 +- src/config.rs | 4 +- src/windows/room/chat.rs | 2 +- src/windows/room/mod.rs | 10 +- src/worker.rs | 4 +- 6 files changed, 656 insertions(+), 284 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cfe0c59..ffcdddb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" [[package]] name = "anymap2" @@ -241,6 +241,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.13.0" @@ -299,7 +312,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.35", + "rustix 0.38.44", "slab", "tracing", "windows-sys 0.59.0", @@ -320,7 +333,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] @@ -338,7 +351,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.44", "windows-sys 0.48.0", ] @@ -365,7 +378,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.44", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -401,9 +414,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", @@ -424,13 +437,13 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" dependencies = [ - "async-trait", "axum-core", "bytes", + "form_urlencoded", "futures-util", "http", "http-body", @@ -448,9 +461,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", "tracing", @@ -458,11 +471,10 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" dependencies = [ - "async-trait", "bytes", "futures-util", "http", @@ -471,7 +483,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.2", + "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -484,10 +496,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom", + "getrandom 0.2.15", "instant", "pin-project-lite", - "rand", + "rand 0.8.5", "tokio", ] @@ -538,9 +550,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" dependencies = [ "serde", ] @@ -553,15 +565,16 @@ checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" [[package]] name = "blake3" -version = "1.5.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "1230237285e3e10cde447185e8975408ae24deaa67205ce684805c25bc0c7937" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "memmap2", ] [[package]] @@ -645,9 +658,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bytesize" @@ -978,7 +991,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "crossterm_winapi", "libc", "mio 0.8.11", @@ -1010,7 +1023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] @@ -1123,9 +1136,9 @@ dependencies = [ [[package]] name = "deadpool-sqlite" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9cc6210316f8b7ced394e2a5d2833ce7097fb28afb5881299c61bc18e8e0e9" +checksum = "656f14fc1ab819c65f332045ea7cb38841bbe551f3b2bc7e3abefb559af4155c" dependencies = [ "deadpool", "deadpool-sync", @@ -1313,6 +1326,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "dlib" version = "0.5.2" @@ -1353,7 +1377,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", - "rand_core", + "rand_core 0.6.4", "serde", "sha2", "subtle", @@ -1426,12 +1450,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1459,9 +1483,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -1474,7 +1498,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "pin-project-lite", ] @@ -1502,14 +1526,17 @@ checksum = "d93bd0ebf93d61d6332d3c09a96e97975968a44e19a64c947bde06e6baff383f" dependencies = [ "futures-core", "readlock", + "readlock-tokio", + "tokio", + "tokio-util", "tracing", ] [[package]] name = "eyeball-im" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1c02432230060cae0621e15803e073976d22974e0f013c9cb28a4ea1b484629" +checksum = "ad276eb017655257443d34f27455f60e8b02b839c6ebcaa8d6f06cc498784e8f" dependencies = [ "futures-core", "imbl", @@ -1690,9 +1717,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1700,9 +1727,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" @@ -1717,9 +1744,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1751,9 +1778,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -1762,21 +1789,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1828,10 +1855,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gif" version = "0.13.1" @@ -1885,6 +1924,25 @@ dependencies = [ "xxhash-rust", ] +[[package]] +name = "h2" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.4.1" @@ -1905,13 +1963,19 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "hashlink" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -2049,6 +2113,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2", "http", "http-body", "httparse", @@ -2118,7 +2183,7 @@ name = "iamb" version = "0.0.11-alpha.1" dependencies = [ "anyhow", - "bitflags 2.6.0", + "bitflags 2.8.0", "chrono", "clap", "comrak", @@ -2143,7 +2208,7 @@ dependencies = [ "notify-rust", "open", "pretty_assertions", - "rand", + "rand 0.8.5", "ratatui", "ratatui-image", "regex", @@ -2187,6 +2252,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "icy_sixel" version = "0.1.2" @@ -2201,12 +2384,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2242,13 +2436,13 @@ dependencies = [ [[package]] name = "imbl" -version = "3.0.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc3be8d8cd36f33a46b1849f31f837c44d9fa87223baee3b4bd96b8f11df81eb" +checksum = "5ae128b3bc67ed43ec0a7bb1c337a9f026717628b3c4033f07ded1da3e854951" dependencies = [ "bitmaps", "imbl-sized-chunks", - "rand_core", + "rand_core 0.6.4", "rand_xoshiro", "serde", "version_check", @@ -2256,9 +2450,9 @@ dependencies = [ [[package]] name = "imbl-sized-chunks" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144006fb58ed787dcae3f54575ff4349755b00ccc99f4b4873860b654be1ed63" +checksum = "8f4241005618a62f8d57b2febd02510fb96e0137304728543dfc5fd6f052c22d" dependencies = [ "bitmaps", ] @@ -2301,12 +2495,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.4.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", "serde", ] @@ -2393,6 +2587,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -2486,9 +2689,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -2512,15 +2715,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", ] [[package]] name = "libsqlite3-sys" -version = "0.28.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -2539,6 +2742,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -2561,7 +2770,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -2673,9 +2882,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "matrix-pickle" @@ -2702,9 +2911,9 @@ dependencies = [ [[package]] name = "matrix-sdk" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e2b229a3076e8b36ca3508e79efb6892a4ea841699504ff74fb59910c7d2d0" +checksum = "e27119e566a60f5681eb8d05f51ef10862dd9af611ac6c6e0dc9aa9bf3bcc493" dependencies = [ "anymap2", "aquamarine", @@ -2716,7 +2925,7 @@ dependencies = [ "backoff", "bytes", "bytesize", - "event-listener 5.3.1", + "event-listener 5.4.0", "eyeball", "eyeball-im", "futures-core", @@ -2733,19 +2942,21 @@ dependencies = [ "matrix-sdk-sqlite", "mime", "mime2ext", + "once_cell", + "percent-encoding", "pin-project-lite", - "rand", + "rand 0.8.5", "reqwest", "ruma", "serde", "serde_html_form", "serde_json", "tempfile", - "thiserror 1.0.63", + "thiserror 2.0.11", "tokio", "tokio-stream", "tokio-util", - "tower 0.4.13", + "tower", "tracing", "url", "urlencoding", @@ -2755,13 +2966,13 @@ dependencies = [ [[package]] name = "matrix-sdk-base" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126ede42ff624f934408005d4d3a641a505a101997a359f85029ae9b8a5b3ab2" +checksum = "58884b338e0c2eb4aa09d63ba2a5937fb5bd691525884f09935900137fc6b908" dependencies = [ "as_variant", "async-trait", - "bitflags 2.6.0", + "bitflags 2.8.0", "decancer", "eyeball", "eyeball-im", @@ -2775,7 +2986,7 @@ dependencies = [ "ruma", "serde", "serde_json", - "thiserror 1.0.63", + "thiserror 2.0.11", "tokio", "tracing", "unicode-normalization", @@ -2783,9 +2994,9 @@ dependencies = [ [[package]] name = "matrix-sdk-common" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c355b0413586375441d67eb1682445a4bef8ebb127cf12bce0a7ed2741add75" +checksum = "072d77e461933834e12810d63906409f37a039acad31a16dda62b63e1f4c31cf" dependencies = [ "async-trait", "eyeball-im", @@ -2796,7 +3007,7 @@ dependencies = [ "ruma", "serde", "serde_json", - "thiserror 1.0.63", + "thiserror 2.0.11", "tokio", "tracing", "tracing-subscriber", @@ -2807,11 +3018,12 @@ dependencies = [ [[package]] name = "matrix-sdk-crypto" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45967fe90a6f20e8426178224fff6f731c0737367821d6a39ae40baf91e8e85" +checksum = "ed1ec9d645eb86630b2ed71e5890565ca023f569d9d0ebdcb25bfca8a088c2f3" dependencies = [ "aes", + "aquamarine", "as_variant", "async-trait", "bs58", @@ -2823,18 +3035,18 @@ dependencies = [ "futures-util", "hkdf", "hmac", - "itertools 0.12.1", + "itertools 0.14.0", "js_option", "matrix-sdk-common", "pbkdf2", - "rand", + "rand 0.8.5", "rmp-serde", "ruma", "serde", "serde_json", "sha2", "subtle", - "thiserror 1.0.63", + "thiserror 2.0.11", "time", "tokio", "tokio-stream", @@ -2847,14 +3059,14 @@ dependencies = [ [[package]] name = "matrix-sdk-indexeddb" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa3c1b0ab6b9c97a675594e4f8b8959d37ac417dbd62bfdb2ab676512ae9a5f0" +checksum = "da30f51dbfcd03297a04f49f92c365a41cb2b012ad3338c0fc5d4efafcbff88b" dependencies = [ "anyhow", "async-trait", "base64 0.22.1", - "getrandom", + "getrandom 0.2.15", "gloo-utils", "hkdf", "indexed_db_futures", @@ -2866,7 +3078,7 @@ dependencies = [ "serde-wasm-bindgen", "serde_json", "sha2", - "thiserror 1.0.63", + "thiserror 2.0.11", "tokio", "tracing", "wasm-bindgen", @@ -2876,13 +3088,13 @@ dependencies = [ [[package]] name = "matrix-sdk-sqlite" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3c864379aab89141f728fd06a1334bbafd67ff089fa3d74314764db474b97" +checksum = "74d07fb4e87c6ace1d05a87a91404acc3fd0b480ba9de75c08685ed18f1ea79f" dependencies = [ "async-trait", "deadpool-sqlite", - "itertools 0.12.1", + "itertools 0.14.0", "matrix-sdk-base", "matrix-sdk-crypto", "matrix-sdk-store-encryption", @@ -2891,7 +3103,7 @@ dependencies = [ "rusqlite", "serde", "serde_json", - "thiserror 1.0.63", + "thiserror 2.0.11", "tokio", "tracing", "vodozemac", @@ -2899,21 +3111,21 @@ dependencies = [ [[package]] name = "matrix-sdk-store-encryption" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d05c000fdbbf42849ed10422349e1554b477a77b8d7183d28156bd99e124c8d" +checksum = "dcc8b6650757f953664e5f906988690cef05c09d83081946adce446c45810a2d" dependencies = [ "base64 0.22.1", "blake3", "chacha20poly1305", "hmac", "pbkdf2", - "rand", + "rand 0.8.5", "rmp-serde", "serde", "serde_json", "sha2", - "thiserror 1.0.63", + "thiserror 2.0.11", "zeroize", ] @@ -2923,6 +3135,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -2996,7 +3217,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -3008,7 +3229,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3020,7 +3241,7 @@ checksum = "24f070af2372cc39349d6415c9a2ae050e1e9dc71dddc9a7a036babe7ad2b192" dependencies = [ "anymap2", "arboard", - "bitflags 2.6.0", + "bitflags 2.8.0", "crossterm", "derive_more", "intervaltree", @@ -3099,7 +3320,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "cfg_aliases 0.1.1", "libc", @@ -3214,7 +3435,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "libc", "objc2", @@ -3230,7 +3451,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3260,7 +3481,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "libc", "objc2", @@ -3272,7 +3493,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3284,7 +3505,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3311,9 +3532,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "opaque-debug" @@ -3337,7 +3558,7 @@ version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3528,7 +3749,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ "phf_shared 0.10.0", - "rand", + "rand 0.8.5", ] [[package]] @@ -3549,31 +3770,11 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3647,7 +3848,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.35", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] @@ -3675,7 +3876,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -3806,7 +4007,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.7", - "thiserror 2.0.5", + "thiserror 2.0.11", "tokio", "tracing", ] @@ -3818,14 +4019,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", - "getrandom", - "rand", + "getrandom 0.2.15", + "rand 0.8.5", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.5", + "thiserror 2.0.11", "tinyvec", "tracing", "web-time", @@ -3871,8 +4072,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.1", + "zerocopy 0.8.20", ] [[package]] @@ -3882,7 +4094,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.1", ] [[package]] @@ -3891,7 +4113,17 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.20", ] [[package]] @@ -3900,7 +4132,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3909,7 +4141,7 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cassowary", "compact_str", "crossterm", @@ -3933,9 +4165,9 @@ dependencies = [ "dyn-clone", "icy_sixel", "image 0.24.9", - "rand", + "rand 0.8.5", "ratatui", - "rustix 0.38.35", + "rustix 0.38.44", "serde", ] @@ -3965,6 +4197,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "072cfe5b1d2dcd38d20e18f85e9c9978b6cc08f0b373e9f1fff1541335622974" +[[package]] +name = "readlock-tokio" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b1800712c0d75de4b0bda5483d46eaf8df757b81df5ca2bde53d5ac2e2c5b2" +dependencies = [ + "tokio", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -3980,7 +4221,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -3989,7 +4230,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.63", ] @@ -4025,14 +4266,16 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ + "async-compression", "base64 0.22.1", "bytes", "futures-core", "futures-util", + "h2", "http", "http-body", "http-body-util", @@ -4055,11 +4298,12 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-native-tls", "tokio-rustls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -4078,7 +4322,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -4140,9 +4384,9 @@ dependencies = [ [[package]] name = "ruma" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94984418ae8a5e1160e6c87608141330e9ae26330abf22e3d15416efa96d48a" +checksum = "7d6fea33e3d17b9e009fefb3f175ca7fd40b1e7d1e72444478fd1b28611eb50a" dependencies = [ "assign", "js_int", @@ -4156,9 +4400,9 @@ dependencies = [ [[package]] name = "ruma-client-api" -version = "0.19.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325e054db8d5545c00767d9868356d61e63f2c6cb8b54768346d66696ea4ad48" +checksum = "23989b539eceeaad01ba089ad307788f90a29bac2e5f730ff0a523eeae3fa1d7" dependencies = [ "as_variant", "assign", @@ -4173,36 +4417,36 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror 1.0.63", + "thiserror 2.0.11", "url", "web-time", ] [[package]] name = "ruma-common" -version = "0.14.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad71c7f49abaa047ba228339d34f9aaefa4d8b50ebeb8e859d0340cc2138bda8" +checksum = "1058c04b8dd62f4fba71c9f65112fb79bc332438d11aefe1e8edf67b7fb58a98" dependencies = [ "as_variant", "base64 0.22.1", "bytes", "form_urlencoded", - "getrandom", + "getrandom 0.2.15", "http", "indexmap", "js-sys", "js_int", "konst", "percent-encoding", - "rand", + "rand 0.8.5", "regex", "ruma-identifiers-validation", "ruma-macros", "serde", "serde_html_form", "serde_json", - "thiserror 1.0.63", + "thiserror 2.0.11", "time", "tracing", "url", @@ -4213,9 +4457,9 @@ dependencies = [ [[package]] name = "ruma-events" -version = "0.29.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be86dccf3504588c1f4dc1bda4ce1f8bbd646fc6dda40c77cc7de6e203e62dad" +checksum = "ff1b8e15942e35ba56004429bc0845f481281f903e86957973a08ec08f8d06f0" dependencies = [ "as_variant", "indexmap", @@ -4228,7 +4472,7 @@ dependencies = [ "ruma-macros", "serde", "serde_json", - "thiserror 1.0.63", + "thiserror 2.0.11", "tracing", "url", "web-time", @@ -4237,9 +4481,9 @@ dependencies = [ [[package]] name = "ruma-federation-api" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5a09ac22b3352bf7a350514dc9a87e1b56aba04c326ac9ce142740f7218afa" +checksum = "5d70c3d37a8e42992aeaa5786cb406ad302bcd05c0e7e3073d5316b4574340dd" dependencies = [ "http", "js_int", @@ -4252,22 +4496,21 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7f9b534a65698d7db3c08d94bf91de0046fe6c7893a7b360502f65e7011ac4" +checksum = "6ad674b5e5368c53a2c90fde7dac7e30747004aaf7b1827b72874a25fc06d4d8" dependencies = [ "js_int", - "thiserror 1.0.63", + "thiserror 2.0.11", ] [[package]] name = "ruma-macros" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d57d3cb20e8e758e8f7c5e408ce831d46758003b615100099852e468631934" +checksum = "c1182e83ee5cd10121974f163337b16af68a93eedfc7cdbdbd52307ac7e1d743" dependencies = [ "cfg-if", - "once_cell", "proc-macro-crate 3.2.0", "proc-macro2", "quote", @@ -4279,11 +4522,11 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -4328,15 +4571,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4421,7 +4664,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation", "core-foundation-sys", "libc", @@ -4446,9 +4689,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -4475,9 +4718,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -4486,9 +4729,9 @@ dependencies = [ [[package]] name = "serde_html_form" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de514ef58196f1fc96dcaef80fe6170a1ce6215df9687a93fe8300e773fefc5" +checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" dependencies = [ "form_urlencoded", "indexmap", @@ -4499,9 +4742,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -4624,7 +4867,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -4735,6 +4978,12 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -4829,12 +5078,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -4844,6 +5087,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "tauri-winrt-notification" version = "0.1.3" @@ -4862,14 +5116,15 @@ checksum = "1f227968ec00f0e5322f9b8173c7a0cbcff6181a0a5b28e9892491c286277231" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand 2.1.1", + "getrandom 0.3.1", "once_cell", - "rustix 0.38.35", + "rustix 0.38.44", "windows-sys 0.59.0", ] @@ -4906,11 +5161,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.5" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643caef17e3128658ff44d85923ef2d28af81bb71e0d67bbfe1d76f19a73e053" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.5", + "thiserror-impl 2.0.11", ] [[package]] @@ -4926,9 +5181,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.5" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995d0bbc9995d1f19d28b7215a9352b0fc3cd3a2d2ec95c2cadc485cdedbcdde" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", @@ -4958,9 +5213,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -4981,14 +5236,24 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -5006,9 +5271,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -5022,9 +5287,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -5053,9 +5318,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -5065,9 +5330,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -5123,29 +5388,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -5294,12 +5544,11 @@ dependencies = [ [[package]] name = "ulid" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f903f293d11f31c0c29e4148f6dc0d033a7f80cebc0282bea147611667d289" +checksum = "ab82fc73182c29b02e2926a6df32f2241dbadb5cfc111fd595515b3598f46bb3" dependencies = [ - "getrandom", - "rand", + "rand 0.9.0", "web-time", ] @@ -5312,12 +5561,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.12" @@ -5386,9 +5629,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -5408,6 +5651,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -5420,7 +5675,7 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ - "getrandom", + "getrandom 0.2.15", "wasm-bindgen", ] @@ -5456,9 +5711,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vodozemac" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4b56780b7827dd72c3c6398c3048752bebf8d1d84ec19b606b15dbc3c850b8" +checksum = "c022a277687e4e8685d72b95a7ca3ccfec907daa946678e715f8badaa650883d" dependencies = [ "aes", "arrayvec", @@ -5468,18 +5723,18 @@ dependencies = [ "chacha20poly1305", "curve25519-dalek", "ed25519-dalek", - "getrandom", + "getrandom 0.2.15", "hkdf", "hmac", "matrix-pickle", "prost", - "rand", + "rand 0.8.5", "serde", "serde_bytes", "serde_json", "sha2", "subtle", - "thiserror 1.0.63", + "thiserror 2.0.11", "x25519-dalek", "zeroize", ] @@ -5505,6 +5760,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.93" @@ -5593,7 +5857,7 @@ checksum = "f90e11ce2ca99c97b940ee83edbae9da2d56a08f9ea8158550fd77fa31722993" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.35", + "rustix 0.38.44", "scoped-tls", "smallvec", "wayland-sys", @@ -5605,8 +5869,8 @@ version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e321577a0a165911bdcfb39cf029302479d7527b517ee58ab0f6ad09edf0943" dependencies = [ - "bitflags 2.6.0", - "rustix 0.38.35", + "bitflags 2.8.0", + "rustix 0.38.44", "wayland-backend", "wayland-scanner", ] @@ -5617,7 +5881,7 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -5629,7 +5893,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5702,7 +5966,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.35", + "rustix 0.38.44", ] [[package]] @@ -6014,6 +6278,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "wl-clipboard-rs" version = "0.8.1" @@ -6034,6 +6307,18 @@ dependencies = [ "wayland-protocols-wlr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x11rb" version = "0.13.1" @@ -6041,7 +6326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.35", + "rustix 0.38.44", "x11rb-protocol", ] @@ -6058,7 +6343,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", - "rand_core", + "rand_core 0.6.4", "serde", "zeroize", ] @@ -6096,6 +6381,30 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure", +] + [[package]] name = "zbus" version = "3.15.2" @@ -6123,7 +6432,7 @@ dependencies = [ "nix 0.26.4", "once_cell", "ordered-stream", - "rand", + "rand 0.8.5", "serde", "serde_repr", "sha1", @@ -6169,7 +6478,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +dependencies = [ + "zerocopy-derive 0.8.20", ] [[package]] @@ -6183,6 +6501,38 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -6203,6 +6553,28 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/Cargo.toml b/Cargo.toml index c78c232..6e394d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" exclude = [".github", "CONTRIBUTING.md"] keywords = ["matrix", "chat", "tui", "vim"] categories = ["command-line-utilities"] -rust-version = "1.76" +rust-version = "1.82" build = "build.rs" [features] @@ -87,7 +87,7 @@ version = "0.0.20" #rev = "24f3ec11c7f634005a27b26878d0fbbdcc08f272" [dependencies.matrix-sdk] -version = "0.8.0" +version = "0.10.0" default-features = false features = ["e2e-encryption", "sqlite", "sso-login"] diff --git a/src/config.rs b/src/config.rs index 9c3aa0a..2531c66 100644 --- a/src/config.rs +++ b/src/config.rs @@ -10,7 +10,7 @@ use std::path::{Path, PathBuf}; use std::process; use clap::Parser; -use matrix_sdk::matrix_auth::MatrixSession; +use matrix_sdk::authentication::matrix::MatrixSession; use matrix_sdk::ruma::{OwnedDeviceId, OwnedRoomAliasId, OwnedRoomId, OwnedUserId, UserId}; use ratatui::style::{Color, Modifier as StyleModifier, Style}; use ratatui::text::Span; @@ -322,7 +322,7 @@ pub struct Session { impl From for MatrixSession { fn from(session: Session) -> Self { MatrixSession { - tokens: matrix_sdk::matrix_auth::MatrixSessionTokens { + tokens: matrix_sdk::authentication::matrix::MatrixSessionTokens { access_token: session.access_token, refresh_token: session.refresh_token, }, diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index efbe8f1..f4914c3 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -606,7 +606,7 @@ impl ChatState { let config = AttachmentConfig::new(); let resp = room - .send_attachment(name.as_ref(), &mime, bytes, config) + .send_attachment(name, &mime, bytes, config) .await .map_err(IambError::from)?; diff --git a/src/windows/room/mod.rs b/src/windows/room/mod.rs index 4898d86..fe9af49 100644 --- a/src/windows/room/mod.rs +++ b/src/windows/room/mod.rs @@ -419,7 +419,7 @@ impl RoomState { // Try creating the room alias on the server. let alias_create_req = CreateAliasRequest::new(orai.clone(), room.room_id().into()); - if let Err(e) = client.send(alias_create_req, None).await { + if let Err(e) = client.send(alias_create_req).await { if let Some(ClientApiErrorKind::Unknown) = e.client_api_error_kind() { // Ignore when it already exists. } else { @@ -460,7 +460,7 @@ impl RoomState { // If the room alias does not exist on the server, create it let alias_create_req = CreateAliasRequest::new(orai, room.room_id().into()); - if let Err(e) = client.send(alias_create_req, None).await { + if let Err(e) = client.send(alias_create_req).await { if let Some(ClientApiErrorKind::Unknown) = e.client_api_error_kind() { // Ignore when it already exists. } else { @@ -535,7 +535,7 @@ impl RoomState { .application .worker .client - .send(del_req, None) + .send(del_req) .await .map_err(IambError::from)?; }, @@ -568,7 +568,7 @@ impl RoomState { .application .worker .client - .send(del_req, None) + .send(del_req) .await .map_err(IambError::from)?; }, @@ -591,7 +591,7 @@ impl RoomState { let msg = match field { RoomField::History => { let visibility = room.history_visibility(); - format!("Room history visibility: {visibility}") + format!("Room history visibility: {visibility:?}") }, RoomField::Id => { let id = room.room_id(); diff --git a/src/worker.rs b/src/worker.rs index 81b4865..7ccf77a 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -26,7 +26,7 @@ use matrix_sdk::{ encryption::verification::{SasVerification, Verification}, encryption::{BackupDownloadStrategy, EncryptionSettings}, event_handler::Ctx, - matrix_auth::MatrixSession, + authentication::matrix::MatrixSession, reqwest, room::{Messages, MessagesOptions, Room as MatrixRoom, RoomMember}, ruma::{ @@ -1391,7 +1391,7 @@ impl ClientWorker { req.limit = Some(1000u32.into()); req.max_depth = Some(1u32.into()); - let resp = self.client.send(req, None).await.map_err(IambError::from)?; + let resp = self.client.send(req).await.map_err(IambError::from)?; let rooms = resp.rooms.into_iter().map(|chunk| chunk.room_id).collect(); From 9fce71f896911f016e6b0cc46419497b98da7592 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Thu, 15 May 2025 17:47:02 -0700 Subject: [PATCH 19/56] Display `` for unknown room history visibility (#397) --- src/windows/room/mod.rs | 3 ++- src/worker.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/windows/room/mod.rs b/src/windows/room/mod.rs index fe9af49..adb3a9c 100644 --- a/src/windows/room/mod.rs +++ b/src/windows/room/mod.rs @@ -591,7 +591,8 @@ impl RoomState { let msg = match field { RoomField::History => { let visibility = room.history_visibility(); - format!("Room history visibility: {visibility:?}") + let visibility = visibility.as_ref().map(|v| v.as_str()); + format!("Room history visibility: {}", visibility.unwrap_or("")) }, RoomField::Id => { let id = room.room_id(); diff --git a/src/worker.rs b/src/worker.rs index 7ccf77a..c5badf5 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -21,12 +21,12 @@ use tracing::{error, warn}; use url::Url; use matrix_sdk::{ + authentication::matrix::MatrixSession, config::{RequestConfig, SyncSettings}, deserialized_responses::DisplayName, encryption::verification::{SasVerification, Verification}, encryption::{BackupDownloadStrategy, EncryptionSettings}, event_handler::Ctx, - authentication::matrix::MatrixSession, reqwest, room::{Messages, MessagesOptions, Room as MatrixRoom, RoomMember}, ruma::{ From ebd89423e9c0ce46901fc3c2e8985cbcf9cb3289 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Thu, 15 May 2025 18:11:34 -0700 Subject: [PATCH 20/56] Bump minimum supported Rust version to 1.83 (#420) --- .github/workflows/ci.yml | 4 ++-- Cargo.toml | 2 +- README.md | 2 +- rust-toolchain.toml | 3 +++ 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 rust-toolchain.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2324af6..bafe274 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: uses: actions/checkout@v3 with: submodules: true - - name: Install Rust (1.76 w/ clippy) - uses: dtolnay/rust-toolchain@1.76 + - name: Install Rust (1.83 w/ clippy) + uses: dtolnay/rust-toolchain@1.83 with: components: clippy - name: Install Rust (nightly w/ rustfmt) diff --git a/Cargo.toml b/Cargo.toml index 6e394d4..422334f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" exclude = [".github", "CONTRIBUTING.md"] keywords = ["matrix", "chat", "tui", "vim"] categories = ["command-line-utilities"] -rust-version = "1.82" +rust-version = "1.83" build = "build.rs" [features] diff --git a/README.md b/README.md index 68d2fda..ecd68f8 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ user_id = "@user:example.com" ## Installation (via `crates.io`) -Install Rust (1.76.0 or above) and Cargo, and then run: +Install Rust (1.83.0 or above) and Cargo, and then run: ``` cargo install --locked iamb diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..d2c98e1 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.83" +components = [ "clippy" ] From 6e923f3878b82f9755eb1d3eba0aa2e66b63b336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jihyeon=20Kim=20=28=EA=B9=80=EC=A7=80=ED=98=84=29?= Date: Fri, 16 May 2025 12:09:12 +0900 Subject: [PATCH 21/56] Update `modalkit` and `modalkit-ratatui` to SHA `45855daeeb` (#358) --- Cargo.lock | 537 ++++++++++++++++++++++++++++++++------- Cargo.toml | 16 +- src/main.rs | 4 +- src/preview.rs | 2 +- src/windows/room/chat.rs | 2 +- 5 files changed, 455 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ffcdddb..02253d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "accessory" @@ -77,6 +77,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.18" @@ -173,6 +179,12 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + [[package]] name = "arboard" version = "3.4.0" @@ -181,7 +193,7 @@ checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" dependencies = [ "clipboard-win", "core-graphics", - "image 0.25.2", + "image", "log", "objc2", "objc2-app-kit", @@ -192,6 +204,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "arrayref" version = "0.3.8" @@ -435,6 +458,29 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + [[package]] name = "axum" version = "0.8.1" @@ -518,12 +564,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -563,6 +603,12 @@ version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "blake3" version = "1.6.0" @@ -632,6 +678,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -698,9 +750,21 @@ version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -788,7 +852,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.10.0", ] [[package]] @@ -832,13 +896,14 @@ checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "compact_str" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" dependencies = [ "castaway", "cfg-if", "itoa", + "rustversion", "ryu", "static_assertions", ] @@ -987,15 +1052,15 @@ checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crossterm" -version = "0.27.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ "bitflags 2.8.0", "crossterm_winapi", - "libc", - "mio 0.8.11", + "mio", "parking_lot 0.12.3", + "rustix 0.38.44", "signal-hook", "signal-hook-mio", "winapi", @@ -1079,8 +1144,18 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] @@ -1093,21 +1168,46 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.10.0", "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.90", +] + [[package]] name = "darling_macro" version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "darling_core", + "darling_core 0.14.4", "quote", "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core 0.20.10", + "quote", + "syn 2.0.90", +] + [[package]] name = "date_header" version = "1.0.5" @@ -1233,7 +1333,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" dependencies = [ - "darling", + "darling 0.14.4", "proc-macro2", "quote", "syn 1.0.109", @@ -2195,7 +2295,7 @@ dependencies = [ "gethostname", "html5ever", "humansize", - "image 0.24.9", + "image", "lazy_static 1.5.0", "libc", "markup5ever_rcdom", @@ -2224,7 +2324,7 @@ dependencies = [ "tracing-appender", "tracing-subscriber", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.13", "url", "vergen", ] @@ -2403,24 +2503,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder", - "num-traits", - "png", - "qoi", - "tiff", -] - [[package]] name = "image" version = "0.25.2" @@ -2429,9 +2511,29 @@ checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +dependencies = [ + "byteorder-lite", + "quick-error", ] [[package]] @@ -2457,6 +2559,12 @@ dependencies = [ "bitmaps", ] +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + [[package]] name = "include_dir" version = "0.7.4" @@ -2504,6 +2612,12 @@ dependencies = [ "serde", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + [[package]] name = "inout" version = "0.1.3" @@ -2514,6 +2628,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "instability" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +dependencies = [ + "darling 0.20.10", + "indoc", + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "instant" version = "0.1.13" @@ -2523,6 +2650,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "intervaltree" version = "0.2.7" @@ -2602,14 +2740,20 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" @@ -2641,12 +2785,11 @@ dependencies = [ [[package]] name = "keybindings" version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680e4699c91c0622dd70da32c274881aadb1ac86252d738c3641266e90e4ca15" +source = "git+https://github.com/ulyssa/modalkit?rev=45855daeeb7081eec626a8f9cf657f0fc2ff0a7a#45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" dependencies = [ "textwrap", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.13", ] [[package]] @@ -2693,6 +2836,16 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.5" @@ -2764,6 +2917,15 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lru" version = "0.12.4" @@ -3065,7 +3227,7 @@ checksum = "da30f51dbfcd03297a04f49f92c365a41cb2b012ad3338c0fc5d4efafcbff88b" dependencies = [ "anyhow", "async-trait", - "base64 0.22.1", + "base64", "getrandom 0.2.15", "gloo-utils", "hkdf", @@ -3115,7 +3277,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcc8b6650757f953664e5f906988690cef05c09d83081946adce446c45810a2d" dependencies = [ - "base64 0.22.1", + "base64", "blake3", "chacha20poly1305", "hmac", @@ -3129,6 +3291,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", +] + [[package]] name = "memchr" version = "2.7.4" @@ -3211,33 +3382,20 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] name = "modalkit" version = "0.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f070af2372cc39349d6415c9a2ae050e1e9dc71dddc9a7a036babe7ad2b192" +source = "git+https://github.com/ulyssa/modalkit?rev=45855daeeb7081eec626a8f9cf657f0fc2ff0a7a#45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" dependencies = [ "anymap2", "arboard", @@ -3252,14 +3410,13 @@ dependencies = [ "ropey", "thiserror 1.0.63", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.13", ] [[package]] name = "modalkit-ratatui" version = "0.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df272b6822a22154034a9761ea10235746fefec7623dc1a6ed0cfbaad6f5d070" +source = "git+https://github.com/ulyssa/modalkit?rev=45855daeeb7081eec626a8f9cf657f0fc2ff0a7a#45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" dependencies = [ "crossterm", "intervaltree", @@ -3268,6 +3425,7 @@ dependencies = [ "ratatui", "regex", "serde", + "unicode-width 0.2.0", ] [[package]] @@ -3336,6 +3494,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "notify-rust" version = "4.10.0" @@ -3359,12 +3523,53 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3944,6 +4149,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.90", +] + [[package]] name = "prost" version = "0.13.4" @@ -3976,6 +4200,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.30.0" @@ -4137,40 +4367,90 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.26.3" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" +checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" dependencies = [ "bitflags 2.8.0", "cassowary", "compact_str", "crossterm", - "itertools 0.12.1", + "instability", + "itertools 0.13.0", "lru", "paste", - "stability", "strum", + "strum_macros", "unicode-segmentation", "unicode-truncate", - "unicode-width", + "unicode-width 0.1.13", ] [[package]] name = "ratatui-image" -version = "1.0.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2264bdb808c89e8395480cfce32c197e75a3d6171063e913bca12e7919a333da" +checksum = "de94276254cb20fb7431726875bd2ac6391a6ffc26f4b8e3d23f79d1286b491e" dependencies = [ - "base64 0.21.7", + "base64", "dyn-clone", "icy_sixel", - "image 0.24.9", + "image", "rand 0.8.5", "ratatui", "rustix 0.38.44", "serde", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror 1.0.63", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rgb", +] + [[package]] name = "rayon" version = "1.10.0" @@ -4271,7 +4551,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "async-compression", - "base64 0.22.1", + "base64", "bytes", "futures-core", "futures-util", @@ -4314,6 +4594,15 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.17.8" @@ -4429,7 +4718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1058c04b8dd62f4fba71c9f65112fb79bc332438d11aefe1e8edf67b7fb58a98" dependencies = [ "as_variant", - "base64 0.22.1", + "base64", "bytes", "form_urlencoded", "getrandom 0.2.15", @@ -4848,7 +5137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", - "mio 0.8.11", + "mio", "signal-hook", ] @@ -4876,6 +5165,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -4968,16 +5266,6 @@ dependencies = [ "der", ] -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.90", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -5028,6 +5316,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.26.3" @@ -5098,6 +5392,25 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tauri-winrt-notification" version = "0.1.3" @@ -5147,7 +5460,7 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width", + "unicode-width 0.1.13", ] [[package]] @@ -5278,7 +5591,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio", "pin-project-lite", "socket2 0.5.7", "tokio-macros", @@ -5596,7 +5909,7 @@ checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ "itertools 0.13.0", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.13", ] [[package]] @@ -5605,6 +5918,12 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unicode_categories" version = "0.1.1" @@ -5679,6 +5998,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.0" @@ -5703,6 +6033,12 @@ dependencies = [ "time", ] +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -5717,7 +6053,7 @@ checksum = "c022a277687e4e8685d72b95a7ca3ccfec907daa946678e715f8badaa650883d" dependencies = [ "aes", "arrayvec", - "base64 0.22.1", + "base64", "base64ct", "cbc", "chacha20poly1305", @@ -6575,6 +6911,12 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -6584,6 +6926,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "3.15.2" diff --git a/Cargo.toml b/Cargo.toml index 422334f..19f4d1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ emojis = "0.5" futures = "0.3" gethostname = "0.4.1" html5ever = "0.26.0" -image = "0.24.5" +image = "0.25.2" libc = "0.2" markup5ever_rcdom = "0.2.0" mime = "^0.3.16" @@ -45,8 +45,8 @@ mime_guess = "^2.0.4" nom = "7.0.0" open = "3.2.0" rand = "0.8.5" -ratatui = "0.26" -ratatui-image = { version = "=1.0.0", features = ["serde"] } +ratatui = "0.28.1" +ratatui-image = { version = "=1.0.5", features = ["serde"] } regex = "^1.5" rpassword = "^7.2" serde = "^1.0" @@ -76,15 +76,13 @@ features = ["zbus", "serde"] optional = true [dependencies.modalkit] -version = "0.0.20" default-features = false -#git = "https://github.com/ulyssa/modalkit" -#rev = "24f3ec11c7f634005a27b26878d0fbbdcc08f272" +git = "https://github.com/ulyssa/modalkit" +rev = "45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" [dependencies.modalkit-ratatui] -version = "0.0.20" -#git = "https://github.com/ulyssa/modalkit" -#rev = "24f3ec11c7f634005a27b26878d0fbbdcc08f272" +git = "https://github.com/ulyssa/modalkit" +rev = "45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" [dependencies.matrix-sdk] version = "0.10.0" diff --git a/src/main.rs b/src/main.rs index b300048..82b108a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -310,7 +310,7 @@ impl Application { } term.draw(|f| { - let area = f.size(); + let area = f.area(); let modestr = bindings.show_mode(); let cursor = bindings.get_cursor_indicator(); @@ -339,7 +339,7 @@ impl Application { let inner = Rect::new(cx, cy, 1, 1); f.render_widget(para, inner) } - f.set_cursor(cx, cy); + f.set_cursor_position((cx, cy)); } })?; diff --git a/src/preview.rs b/src/preview.rs index cf69c1c..f2c620a 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -63,7 +63,7 @@ pub fn spawn_insert_preview( let img = download_or_load(event_id.to_owned(), source, media, cache_dir) .await .map(std::io::Cursor::new) - .map(image::io::Reader::new) + .map(image::ImageReader::new) .map_err(IambError::Matrix) .and_then(|reader| reader.with_guessed_format().map_err(IambError::IOError)) .and_then(|reader| reader.decode().map_err(IambError::Image)); diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index f4914c3..34859d9 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -596,7 +596,7 @@ impl ChatState { let dynimage = image::DynamicImage::ImageRgba8(imagebuf); let bytes = Vec::::new(); let mut buff = std::io::Cursor::new(bytes); - dynimage.write_to(&mut buff, image::ImageOutputFormat::Png)?; + dynimage.write_to(&mut buff, image::ImageFormat::Png)?; Ok(buff.into_inner()) }) .map_err(IambError::from)?; From 5f927ce9c3a4a353ed85f979168dd7814a776aa3 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Thu, 15 May 2025 21:21:05 -0700 Subject: [PATCH 22/56] Binaries worklog should override `rust-toolchain.yml` (#420) --- .github/workflows/binaries.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 3299035..eba1f53 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -62,7 +62,7 @@ jobs: - name: Run sccache-cache uses: mozilla-actions/sccache-action@v0.0.9 - name: 'Build: binary' - run: cargo build --release --locked --target ${{ env.TARGET }} + run: cargo +stable build --release --locked --target ${{ env.TARGET }} - name: 'Upload: binary' uses: actions/upload-artifact@v4 with: @@ -73,8 +73,8 @@ jobs: - name: 'Package: deb' if: matrix.platform == 'ubuntu-latest' run: | - cargo install --locked cargo-deb - cargo deb --no-strip --target ${{ env.TARGET }} + cargo +stable install --locked cargo-deb + cargo +stable deb --no-strip --target ${{ env.TARGET }} - name: 'Upload: deb' if: matrix.platform == 'ubuntu-latest' uses: actions/upload-artifact@v4 @@ -84,8 +84,8 @@ jobs: - name: 'Package: rpm' if: matrix.platform == 'ubuntu-latest' run: | - cargo install --locked cargo-generate-rpm - cargo generate-rpm --target ${{ env.TARGET }} + cargo +stable install --locked cargo-generate-rpm + cargo +stable generate-rpm --target ${{ env.TARGET }} - name: 'Upload: rpm' if: matrix.platform == 'ubuntu-latest' uses: actions/upload-artifact@v4 From af96bfbb41a8d165776f7e463c8fdc9d3804d4fc Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 16 May 2025 18:02:43 -0700 Subject: [PATCH 23/56] Update to latest `modalkit`, `modalkit-ratatui` and `ratatui-image` (#422) --- Cargo.lock | 112 +++++++++++++++++++++++---------- Cargo.toml | 16 ++--- src/base.rs | 12 ++-- src/message/mod.rs | 10 +-- src/windows/room/scrollback.rs | 2 +- 5 files changed, 99 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 02253d5..5a49d1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -564,6 +564,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -1452,12 +1458,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - [[package]] name = "ed25519" version = "2.2.3" @@ -2505,9 +2505,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.2" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", @@ -2528,9 +2528,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" dependencies = [ "byteorder-lite", "quick-error", @@ -2785,7 +2785,8 @@ dependencies = [ [[package]] name = "keybindings" version = "0.0.1" -source = "git+https://github.com/ulyssa/modalkit?rev=45855daeeb7081eec626a8f9cf657f0fc2ff0a7a#45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680e4699c91c0622dd70da32c274881aadb1ac86252d738c3641266e90e4ca15" dependencies = [ "textwrap", "unicode-segmentation", @@ -3227,7 +3228,7 @@ checksum = "da30f51dbfcd03297a04f49f92c365a41cb2b012ad3338c0fc5d4efafcbff88b" dependencies = [ "anyhow", "async-trait", - "base64", + "base64 0.22.1", "getrandom 0.2.15", "gloo-utils", "hkdf", @@ -3277,7 +3278,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcc8b6650757f953664e5f906988690cef05c09d83081946adce446c45810a2d" dependencies = [ - "base64", + "base64 0.22.1", "blake3", "chacha20poly1305", "hmac", @@ -3298,6 +3299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", + "rayon", ] [[package]] @@ -3394,8 +3396,9 @@ dependencies = [ [[package]] name = "modalkit" -version = "0.0.20" -source = "git+https://github.com/ulyssa/modalkit?rev=45855daeeb7081eec626a8f9cf657f0fc2ff0a7a#45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" +version = "0.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7599fc1bcd2f0a0b4598f23433b45613345a46419ab27d3a9adecb57acd648" dependencies = [ "anymap2", "arboard", @@ -3415,8 +3418,9 @@ dependencies = [ [[package]] name = "modalkit-ratatui" -version = "0.0.20" -source = "git+https://github.com/ulyssa/modalkit?rev=45855daeeb7081eec626a8f9cf657f0fc2ff0a7a#45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" +version = "0.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd3d88c86435d4b1fb22c7c0f978b09cb888338cafc10336715aa5070e92b6f6" dependencies = [ "crossterm", "intervaltree", @@ -4367,39 +4371,40 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" +checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ "bitflags 2.8.0", "cassowary", "compact_str", "crossterm", + "indoc", "instability", "itertools 0.13.0", "lru", "paste", "strum", - "strum_macros", "unicode-segmentation", "unicode-truncate", - "unicode-width 0.1.13", + "unicode-width 0.2.0", ] [[package]] name = "ratatui-image" -version = "1.0.5" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de94276254cb20fb7431726875bd2ac6391a6ffc26f4b8e3d23f79d1286b491e" +checksum = "d6f868820aabfce698e69639620ab9100f2ca29319ba960b9ba218482065489d" dependencies = [ - "base64", - "dyn-clone", + "base64 0.21.7", "icy_sixel", "image", "rand 0.8.5", "ratatui", "rustix 0.38.44", "serde", + "thiserror 1.0.63", + "windows 0.58.0", ] [[package]] @@ -4448,6 +4453,7 @@ dependencies = [ "loop9", "quick-error", "rav1e", + "rayon", "rgb", ] @@ -4551,7 +4557,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "async-compression", - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", @@ -4599,9 +4605,6 @@ name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] [[package]] name = "ring" @@ -4718,7 +4721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1058c04b8dd62f4fba71c9f65112fb79bc332438d11aefe1e8edf67b7fb58a98" dependencies = [ "as_variant", - "base64", + "base64 0.22.1", "bytes", "form_urlencoded", "getrandom 0.2.15", @@ -5418,7 +5421,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2" dependencies = [ "quick-xml 0.30.0", - "windows", + "windows 0.51.1", ] [[package]] @@ -6053,7 +6056,7 @@ checksum = "c022a277687e4e8685d72b95a7ca3ccfec907daa946678e715f8badaa650883d" dependencies = [ "aes", "arrayvec", - "base64", + "base64 0.22.1", "base64ct", "cbc", "chacha20poly1305", @@ -6343,6 +6346,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.51.1" @@ -6361,6 +6374,41 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "windows-registry" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 19f4d1f..4ffc404 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ emojis = "0.5" futures = "0.3" gethostname = "0.4.1" html5ever = "0.26.0" -image = "0.25.2" +image = "^0.25.6" libc = "0.2" markup5ever_rcdom = "0.2.0" mime = "^0.3.16" @@ -45,8 +45,8 @@ mime_guess = "^2.0.4" nom = "7.0.0" open = "3.2.0" rand = "0.8.5" -ratatui = "0.28.1" -ratatui-image = { version = "=1.0.5", features = ["serde"] } +ratatui = "0.29.0" +ratatui-image = { version = "~6.0.0", features = ["serde"] } regex = "^1.5" rpassword = "^7.2" serde = "^1.0" @@ -76,13 +76,15 @@ features = ["zbus", "serde"] optional = true [dependencies.modalkit] +version = "0.0.21" default-features = false -git = "https://github.com/ulyssa/modalkit" -rev = "45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" +#git = "https://github.com/ulyssa/modalkit" +#rev = "e40dbb0bfeabe4cfd08facd2acb446080a330d75" [dependencies.modalkit-ratatui] -git = "https://github.com/ulyssa/modalkit" -rev = "45855daeeb7081eec626a8f9cf657f0fc2ff0a7a" +version = "0.0.21" +#git = "https://github.com/ulyssa/modalkit" +#rev = "e40dbb0bfeabe4cfd08facd2acb446080a330d75" [dependencies.matrix-sdk] version = "0.10.0" diff --git a/src/base.rs b/src/base.rs index 43df297..c8c54d0 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1319,7 +1319,7 @@ fn emoji_map() -> CompletionMap { #[cfg(unix)] fn picker_from_termios(protocol_type: Option) -> Option { - let mut picker = match Picker::from_termios() { + let mut picker = match Picker::from_query_stdio() { Ok(picker) => picker, Err(e) => { tracing::error!("Failed to setup image previews: {e}"); @@ -1327,12 +1327,8 @@ fn picker_from_termios(protocol_type: Option) -> Option { }, }; - // `guess_protocol` also does tmux detection, - // run it always then overwrite the guessed protocol if needed - picker.guess_protocol(); - if let Some(protocol_type) = protocol_type { - picker.protocol_type = protocol_type; + picker.set_protocol_type(protocol_type); } Some(picker) @@ -1355,8 +1351,8 @@ fn picker_from_settings(settings: &ApplicationSettings) -> Option { }) = image_preview_protocol { // User forced type and font_size: use that. - let mut picker = Picker::new(font_size); - picker.protocol_type = protocol_type; + let mut picker = Picker::from_fontsize(font_size); + picker.set_protocol_type(protocol_type); Some(picker) } else { // Guess, but use type if forced. diff --git a/src/message/mod.rs b/src/message/mod.rs index d9c0716..39d6734 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -70,7 +70,7 @@ mod printer; pub use self::compose::text_to_message; -type ProtocolPreview<'a> = (&'a dyn Protocol, u16, u16); +type ProtocolPreview<'a> = (&'a Protocol, u16, u16); pub type MessageKey = (MessageTimeStamp, OwnedEventId); @@ -826,7 +826,7 @@ impl<'a> MessageFormatter<'a> { pub enum ImageStatus { None, Downloading(ImagePreviewSize), - Loaded(Box), + Loaded(Protocol), Error(String), } @@ -1046,7 +1046,7 @@ impl Message { style: Style, hide_reply: bool, emoji_shortcodes: bool, - ) -> (Text, Option<&dyn Protocol>) { + ) -> (Text, Option<&Protocol>) { if let Some(html) = &self.html { (html.to_text(width, style, hide_reply, emoji_shortcodes), None) } else { @@ -1066,8 +1066,8 @@ impl Message { placeholder_frame(Some("Downloading..."), width, image_preview_size) }, ImageStatus::Loaded(backend) => { - proto = Some(backend.as_ref()); - placeholder_frame(Some("Loading..."), width, &backend.rect().into()) + proto = Some(backend); + placeholder_frame(Some("Loading..."), width, &backend.area().into()) }, ImageStatus::Error(err) => Some(format!("[Image error: {err}]\n")), }; diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index cc0e3bd..c083353 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -1402,7 +1402,7 @@ impl<'a> StatefulWidget for Scrollback<'a> { // line. for (x, y, backend) in image_previews { let image_widget = Image::new(backend); - let mut rect = backend.rect(); + let mut rect = backend.area(); rect.x = x; rect.y = y; // Don't render outside of scrollback area From fd3fef5c9e7fea56ed264bc168e3429942facd07 Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Fri, 23 May 2025 16:26:17 +0000 Subject: [PATCH 24/56] Allow spaces to be searched by name (#404) --- src/windows/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/mod.rs b/src/windows/mod.rs index 0169e19..0513bc8 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -1056,7 +1056,7 @@ impl RoomLikeItem for RoomItem { impl Display for RoomItem { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, ":verify request {}", self.name) + write!(f, "{}", self.name) } } @@ -1263,7 +1263,7 @@ impl RoomLikeItem for SpaceItem { impl Display for SpaceItem { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, ":verify request {}", self.room_id()) + write!(f, "{}", self.name) } } From 26802bab55f6f955b21a950ecc119c7d39ab949e Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Thu, 29 May 2025 02:59:42 +0000 Subject: [PATCH 25/56] Fix Clippy warnings for 1.83 (#429) --- src/base.rs | 8 ++++---- src/config.rs | 12 ++++++------ src/windows/room/chat.rs | 2 +- src/windows/room/scrollback.rs | 2 +- src/windows/room/space.rs | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/base.rs b/src/base.rs index c8c54d0..754dec9 100644 --- a/src/base.rs +++ b/src/base.rs @@ -293,7 +293,7 @@ impl<'de> Deserialize<'de> for SortColumn { /// [serde] visitor for deserializing [SortColumn] for rooms and spaces. struct SortRoomVisitor; -impl<'de> Visitor<'de> for SortRoomVisitor { +impl Visitor<'_> for SortRoomVisitor { type Value = SortColumn; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -346,7 +346,7 @@ impl<'de> Deserialize<'de> for SortColumn { /// [serde] visitor for deserializing [SortColumn] for users. struct SortUserVisitor; -impl<'de> Visitor<'de> for SortUserVisitor { +impl Visitor<'_> for SortUserVisitor { type Value = SortColumn; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -1182,7 +1182,7 @@ impl RoomInfo { /// Indicates whether we've recently fetched scrollback for this room. pub fn recently_fetched(&self) -> bool { - self.fetch_last.map_or(false, |i| i.elapsed() < ROOM_FETCH_DEBOUNCE) + self.fetch_last.is_some_and(|i| i.elapsed() < ROOM_FETCH_DEBOUNCE) } fn clear_receipt(&mut self, user_id: &OwnedUserId) -> Option<()> { @@ -1609,7 +1609,7 @@ impl<'de> Deserialize<'de> for IambId { /// [serde] visitor for deserializing [IambId]. struct IambIdVisitor; -impl<'de> Visitor<'de> for IambIdVisitor { +impl Visitor<'_> for IambIdVisitor { type Value = IambId; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/src/config.rs b/src/config.rs index 2531c66..3f4370d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -98,7 +98,7 @@ fn validate_profile_name(name: &str) -> bool { let mut chars = name.chars(); - if !chars.next().map_or(false, |c| c.is_ascii_alphanumeric()) { + if !chars.next().is_some_and(|c| c.is_ascii_alphanumeric()) { return false; } @@ -152,7 +152,7 @@ pub enum ConfigError { pub struct Keys(pub Vec, pub String); pub struct KeysVisitor; -impl<'de> Visitor<'de> for KeysVisitor { +impl Visitor<'_> for KeysVisitor { type Value = Keys; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -183,7 +183,7 @@ impl<'de> Deserialize<'de> for Keys { pub struct VimModes(pub Vec); pub struct VimModesVisitor; -impl<'de> Visitor<'de> for VimModesVisitor { +impl Visitor<'_> for VimModesVisitor { type Value = VimModes; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -233,7 +233,7 @@ impl From for Level { } } -impl<'de> Visitor<'de> for LogLevelVisitor { +impl Visitor<'_> for LogLevelVisitor { type Value = LogLevel; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -268,7 +268,7 @@ impl<'de> Deserialize<'de> for LogLevel { pub struct UserColor(pub Color); pub struct UserColorVisitor; -impl<'de> Visitor<'de> for UserColorVisitor { +impl Visitor<'_> for UserColorVisitor { type Value = UserColor; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -419,7 +419,7 @@ impl Default for NotifyVia { } } -impl<'de> Visitor<'de> for NotifyViaVisitor { +impl Visitor<'_> for NotifyViaVisitor { type Value = NotifyVia; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index 34859d9..45bd17e 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -906,7 +906,7 @@ impl<'a> Chat<'a> { } } -impl<'a> StatefulWidget for Chat<'a> { +impl StatefulWidget for Chat<'_> { type State = ChatState; fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index c083353..08ad84d 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -1284,7 +1284,7 @@ impl<'a> Scrollback<'a> { } } -impl<'a> StatefulWidget for Scrollback<'a> { +impl StatefulWidget for Scrollback<'_> { type State = ScrollbackState; fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { diff --git a/src/windows/room/space.rs b/src/windows/room/space.rs index 6b3579e..5f59a13 100644 --- a/src/windows/room/space.rs +++ b/src/windows/room/space.rs @@ -184,7 +184,7 @@ impl<'a> Space<'a> { } } -impl<'a> StatefulWidget for Space<'a> { +impl StatefulWidget for Space<'_> { type State = SpaceState; fn render(self, area: Rect, buffer: &mut Buffer, state: &mut Self::State) { From 3296f58859ef9673cd3c77d2cc6d01203a6d6072 Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Thu, 29 May 2025 03:23:26 +0000 Subject: [PATCH 26/56] Omit room name on desktop notifications for DMs (#428) --- src/notifications.rs | 44 ++++++++++++-------------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/src/notifications.rs b/src/notifications.rs index 83038a4..a3667f5 100644 --- a/src/notifications.rs +++ b/src/notifications.rs @@ -199,18 +199,18 @@ pub async fn parse_full_notification( .unwrap_or_else(|| sender_id.localpart()); let summary = if let Some(room_name) = room.cached_display_name() { - format!("{sender_name} in {room_name}") + if room.is_direct().await.map_err(IambError::from)? && sender_name == room_name.to_string() + { + sender_name.to_string() + } else { + format!("{sender_name} in {room_name}") + } } else { sender_name.to_string() }; let body = if show_body { - event_notification_body( - &event, - sender_name, - room.is_direct().await.map_err(IambError::from)?, - ) - .map(truncate) + event_notification_body(&event, sender_name).map(truncate) } else { None }; @@ -218,11 +218,7 @@ pub async fn parse_full_notification( return Ok((summary, body, server_ts)); } -pub fn event_notification_body( - event: &AnySyncTimelineEvent, - sender_name: &str, - is_direct: bool, -) -> Option { +pub fn event_notification_body(event: &AnySyncTimelineEvent, sender_name: &str) -> Option { let AnySyncTimelineEvent::MessageLike(event) = event else { return None; }; @@ -233,10 +229,7 @@ pub fn event_notification_body( MessageType::Audio(_) => { format!("{sender_name} sent an audio file.") }, - MessageType::Emote(content) => { - let message = &content.body; - format!("{sender_name}: {message}") - }, + MessageType::Emote(content) => content.body, MessageType::File(_) => { format!("{sender_name} sent a file.") }, @@ -246,22 +239,9 @@ pub fn event_notification_body( MessageType::Location(_) => { format!("{sender_name} sent their location.") }, - MessageType::Notice(content) => { - let message = &content.body; - format!("{sender_name}: {message}") - }, - MessageType::ServerNotice(content) => { - let message = &content.body; - format!("{sender_name}: {message}") - }, - MessageType::Text(content) => { - if is_direct { - content.body - } else { - let message = &content.body; - format!("{sender_name}: {message}") - } - }, + MessageType::Notice(content) => content.body, + MessageType::ServerNotice(content) => content.body, + MessageType::Text(content) => content.body, MessageType::Video(_) => { format!("{sender_name} sent a video.") }, From 82ed796a91605c31c231d9f3c52b8cae837106bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1=20Katona?= Date: Wed, 28 May 2025 21:48:10 -0700 Subject: [PATCH 27/56] Add support for scrolling w/ mouse when explicitly enabled (#389) Co-authored-by: Ulyssa --- src/config.rs | 10 ++++++++++ src/main.rs | 50 ++++++++++++++++++++++++++++++++++++++++++-------- src/tests.rs | 1 + 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/config.rs b/src/config.rs index 3f4370d..f2df8df 100644 --- a/src/config.rs +++ b/src/config.rs @@ -466,6 +466,12 @@ impl<'de> Deserialize<'de> for NotifyVia { } } +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] +pub struct Mouse { + #[serde(default)] + pub enabled: bool, +} + #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] pub struct Notifications { #[serde(default)] @@ -562,6 +568,7 @@ pub struct TunableValues { pub message_user_color: bool, pub default_room: Option, pub open_command: Option>, + pub mouse: Mouse, pub notifications: Notifications, pub image_preview: Option, pub user_gutter_width: usize, @@ -586,6 +593,7 @@ pub struct Tunables { pub message_user_color: Option, pub default_room: Option, pub open_command: Option>, + pub mouse: Option, pub notifications: Option, pub image_preview: Option, pub user_gutter_width: Option, @@ -614,6 +622,7 @@ impl Tunables { message_user_color: self.message_user_color.or(other.message_user_color), default_room: self.default_room.or(other.default_room), open_command: self.open_command.or(other.open_command), + mouse: self.mouse.or(other.mouse), notifications: self.notifications.or(other.notifications), image_preview: self.image_preview.or(other.image_preview), user_gutter_width: self.user_gutter_width.or(other.user_gutter_width), @@ -640,6 +649,7 @@ impl Tunables { message_user_color: self.message_user_color.unwrap_or(false), default_room: self.default_room, open_command: self.open_command, + mouse: self.mouse.unwrap_or_default(), notifications: self.notifications.unwrap_or_default(), image_preview: self.image_preview.map(ImagePreview::values), user_gutter_width: self.user_gutter_width.unwrap_or(30), diff --git a/src/main.rs b/src/main.rs index 82b108a..4ca4f96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,11 +44,14 @@ use modalkit::crossterm::{ read, DisableBracketedPaste, DisableFocusChange, + DisableMouseCapture, EnableBracketedPaste, EnableFocusChange, + EnableMouseCapture, Event, KeyEventKind, KeyboardEnhancementFlags, + MouseEventKind, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags, }, @@ -364,8 +367,30 @@ impl Application { return Ok(ke.into()); }, - Event::Mouse(_) => { - // Do nothing for now. + Event::Mouse(me) => { + let dir = match me.kind { + MouseEventKind::ScrollUp => MoveDir2D::Up, + MouseEventKind::ScrollDown => MoveDir2D::Down, + MouseEventKind::ScrollLeft => MoveDir2D::Left, + MouseEventKind::ScrollRight => MoveDir2D::Right, + _ => continue, + }; + + let size = ScrollSize::Cell; + let style = ScrollStyle::Direction2D(dir, size, 1.into()); + let ctx = ProgramContext::default(); + let mut store = self.store.lock().await; + + match self.screen.scroll(&style, &ctx, store.deref_mut()) { + Ok(None) => {}, + Ok(Some(info)) => { + drop(store); + self.handle_info(info); + }, + Err(e) => { + self.screen.push_error(e); + }, + } }, Event::FocusGained => { let mut store = self.store.lock().await; @@ -932,8 +957,8 @@ async fn login_normal( } /// Set up the terminal for drawing the TUI, and getting additional info. -fn setup_tty(title: &str, enable_enhanced_keys: bool) -> std::io::Result<()> { - let title = format!("iamb ({})", title); +fn setup_tty(settings: &ApplicationSettings, enable_enhanced_keys: bool) -> std::io::Result<()> { + let title = format!("iamb ({})", settings.profile.user_id.as_str()); // Enable raw mode and enter the alternate screen. crossterm::terminal::enable_raw_mode()?; @@ -947,15 +972,23 @@ fn setup_tty(title: &str, enable_enhanced_keys: bool) -> std::io::Result<()> { )?; } + if settings.tunables.mouse.enabled { + crossterm::execute!(stdout(), EnableMouseCapture)?; + } + crossterm::execute!(stdout(), EnableBracketedPaste, EnableFocusChange, SetTitle(title)) } // Do our best to reverse what we did in setup_tty() when we exit or crash. -fn restore_tty(enable_enhanced_keys: bool) { +fn restore_tty(enable_enhanced_keys: bool, enable_mouse: bool) { if enable_enhanced_keys { let _ = crossterm::queue!(stdout(), PopKeyboardEnhancementFlags); } + if enable_mouse { + let _ = crossterm::queue!(stdout(), DisableMouseCapture); + } + let _ = crossterm::execute!( stdout(), DisableBracketedPaste, @@ -1009,11 +1042,12 @@ async fn run(settings: ApplicationSettings) -> IambResult<()> { false }, }; - setup_tty(settings.profile.user_id.as_str(), enable_enhanced_keys)?; + setup_tty(&settings, enable_enhanced_keys)?; let orig_hook = std::panic::take_hook(); + let enable_mouse = settings.tunables.mouse.enabled; std::panic::set_hook(Box::new(move |panic_info| { - restore_tty(enable_enhanced_keys); + restore_tty(enable_enhanced_keys, enable_mouse); orig_hook(panic_info); process::exit(1); })); @@ -1023,7 +1057,7 @@ async fn run(settings: ApplicationSettings) -> IambResult<()> { application.run().await?; // Clean up the terminal on exit. - restore_tty(enable_enhanced_keys); + restore_tty(enable_enhanced_keys, enable_mouse); Ok(()) } diff --git a/src/tests.rs b/src/tests.rs index fa379de..f8a3713 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -189,6 +189,7 @@ pub fn mock_tunables() -> TunableValues { external_edit_file_suffix: String::from(".md"), username_display: UserDisplayStyle::Username, message_user_color: false, + mouse: Default::default(), notifications: Notifications { enabled: false, via: NotifyVia::default(), From e99674b2453761b4ef8536506a332c7e08d0bbf6 Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Fri, 30 May 2025 02:25:07 +0000 Subject: [PATCH 28/56] Query user for profile at startup when none have been specified (#432) --- src/config.rs | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/config.rs b/src/config.rs index f2df8df..fb3d022 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; use std::fmt; use std::fs::File; use std::hash::{Hash, Hasher}; -use std::io::{BufReader, BufWriter}; +use std::io::{BufReader, BufWriter, Write}; use std::path::{Path, PathBuf}; use std::process; @@ -874,11 +874,33 @@ impl ApplicationSettings { } else if profiles.len() == 1 { profiles.into_iter().next().unwrap() } else { - usage!( - "No profile specified. \ - Please use -P or add \"default_profile\" to your configuration.\n\n\ - For more information try '--help'", - ); + loop { + println!("\nNo profile specified. Available profiles:"); + profiles + .keys() + .enumerate() + .for_each(|(i, name)| println!("{}: {}", i, name)); + + print!("Select a number or 'q' to quit: "); + let _ = std::io::stdout().flush(); + + let mut input = String::new(); + let _ = std::io::stdin().read_line(&mut input); + + if input.trim() == "q" { + usage!( + "No profile specified. \ + Please use -P or add \"default_profile\" to your configuration.\n\n\ + For more information try '--help'", + ); + } + if let Ok(i) = input.trim().parse::() { + if i < profiles.len() { + break profiles.into_iter().nth(i).unwrap(); + } + } + println!("\nInvalid index."); + } }; let macros = merge_maps(macros, profile.macros.take()).unwrap_or_default(); From 952374aab05e0a650a6c19e4d2ae29279ca9632b Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Fri, 30 May 2025 02:28:08 +0000 Subject: [PATCH 29/56] Show more text in notifications and use "normal" urgency for dbus notifications (#430) --- src/notifications.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/notifications.rs b/src/notifications.rs index a3667f5..c120222 100644 --- a/src/notifications.rs +++ b/src/notifications.rs @@ -118,6 +118,9 @@ fn send_notification_desktop(summary: &str, body: Option<&str>) { .icon(IAMB_XDG_NAME) .action("default", "default"); + #[cfg(all(unix, not(target_os = "macos")))] + desktop_notification.urgency(notify_rust::Urgency::Normal); + if let Some(body) = body { desktop_notification.body(body); } @@ -260,7 +263,7 @@ pub fn event_notification_body(event: &AnySyncTimelineEvent, sender_name: &str) } fn truncate(s: String) -> String { - static MAX_LENGTH: usize = 100; + static MAX_LENGTH: usize = 5000; if s.graphemes(true).count() > MAX_LENGTH { let truncated: String = s.graphemes(true).take(MAX_LENGTH).collect(); truncated + "..." From 98aa2f871d161b998fe833dd407a9c948b075477 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 30 May 2025 08:39:13 -0700 Subject: [PATCH 30/56] Update to `ratatui-image@8.0.1` (#434) --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/worker.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a49d1b..5c41835 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4392,9 +4392,9 @@ dependencies = [ [[package]] name = "ratatui-image" -version = "6.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f868820aabfce698e69639620ab9100f2ca29319ba960b9ba218482065489d" +checksum = "e8fe71c551c67f34e4fa49797227f614cd064b82855d7b72d424e40d08ec0542" dependencies = [ "base64 0.21.7", "icy_sixel", diff --git a/Cargo.toml b/Cargo.toml index 4ffc404..24bbc6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,7 @@ nom = "7.0.0" open = "3.2.0" rand = "0.8.5" ratatui = "0.29.0" -ratatui-image = { version = "~6.0.0", features = ["serde"] } +ratatui-image = { version = "~8.0.1", features = ["serde"] } regex = "^1.5" rpassword = "^7.2" serde = "^1.0" diff --git a/src/worker.rs b/src/worker.rs index c5badf5..053a5b5 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -350,7 +350,7 @@ fn load_insert( info.insert_with_preview( room_id.clone(), store.clone(), - *picker, + picker.clone(), msg, settings, client.media(), @@ -1002,7 +1002,7 @@ impl ClientWorker { info.insert_with_preview( room_id.to_owned(), store.clone(), - *picker, + picker.clone(), full_ev, settings, client.media(), From f39261ff84678feae1e58a5e050fbe4bd4ae27b5 Mon Sep 17 00:00:00 2001 From: VAWVAW <94846592+VAWVAW@users.noreply.github.com> Date: Fri, 30 May 2025 15:56:46 +0000 Subject: [PATCH 31/56] Fix most incorrect unreads on startup (#433) --- src/worker.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/worker.rs b/src/worker.rs index 053a5b5..1ef633c 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -302,7 +302,7 @@ async fn load_older_one( let event_id = msg.event_id(); let receipts = match room - .load_event_receipts(ReceiptType::Read, ReceiptThread::Main, event_id) + .load_event_receipts(ReceiptType::Read, ReceiptThread::Unthreaded, event_id) .await { Ok(receipts) => receipts.into_iter().map(|(u, _)| u).collect(), @@ -1044,7 +1044,10 @@ impl ClientWorker { let Some(receipts) = receipts.get(&ReceiptType::Read) else { continue; }; - for user_id in receipts.keys() { + for (user_id, _) in receipts + .iter() + .filter(|(_, rcpt)| rcpt.thread == ReceiptThread::Unthreaded) + { info.set_receipt(user_id.to_owned(), event_id.clone()); } } From 998e50f4a543e0d46b667074a9ad86e304a1a298 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 30 May 2025 20:42:38 -0700 Subject: [PATCH 32/56] Update lockfile dependencies (#436) --- Cargo.lock | 1950 ++++++++++++++++++++++++---------------------------- 1 file changed, 902 insertions(+), 1048 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c41835..0c85ac7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,24 +11,18 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -58,14 +52,14 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -85,9 +79,9 @@ checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -121,26 +115,26 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -155,9 +149,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "anymap2" @@ -176,7 +170,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -187,19 +181,21 @@ checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" [[package]] name = "arboard" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" +checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" dependencies = [ "clipboard-win", - "core-graphics", "image", "log", "objc2", "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", "objc2-foundation", - "parking_lot 0.12.3", - "windows-sys 0.48.0", + "parking_lot 0.12.4", + "percent-encoding", + "windows-sys 0.59.0", "wl-clipboard-rs", "x11rb", ] @@ -212,14 +208,14 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -232,9 +228,9 @@ dependencies = [ [[package]] name = "as_variant" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38fa22307249f86fb7fad906fcae77f2564caeb56d7209103c551cd1cf4798f" +checksum = "9dbc3a507a82b17ba0d98f6ce8fd6954ea0c8152e98009d36a40d8dcc8ce078a" [[package]] name = "assign" @@ -266,9 +262,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" dependencies = [ "flate2", "futures-core", @@ -279,14 +275,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.1", - "futures-lite 2.3.0", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "pin-project-lite", "slab", ] @@ -316,7 +313,7 @@ dependencies = [ "log", "parking", "polling 2.8.0", - "rustix 0.37.27", + "rustix 0.37.28", "slab", "socket2 0.4.10", "waker-fn", @@ -324,18 +321,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" dependencies = [ "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.6.0", "parking", - "polling 3.7.3", - "rustix 0.38.44", + "polling 3.8.0", + "rustix 1.0.7", "slab", "tracing", "windows-sys 0.59.0", @@ -386,22 +383,22 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" dependencies = [ - "async-io 2.3.4", + "async-io 2.4.1", "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.0.7", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -409,9 +406,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -420,13 +417,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -437,13 +434,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -454,15 +451,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "av1-grain" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" dependencies = [ "anyhow", "arrayvec", @@ -483,9 +480,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ "axum-core", "bytes", @@ -517,12 +514,12 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "http-body-util", @@ -542,7 +539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom 0.2.15", + "getrandom 0.2.16", "instant", "pin-project-lite", "rand 0.8.5", @@ -551,17 +548,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -578,9 +575,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bit_field" @@ -596,9 +593,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -617,24 +614,17 @@ checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "blake3" -version = "1.6.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1230237285e3e10cde447185e8975408ae24deaa67205ce684805c25bc0c7937" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "memmap2", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -655,9 +645,9 @@ dependencies = [ [[package]] name = "block2" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" dependencies = [ "objc2", ] @@ -671,7 +661,7 @@ dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.6.0", "piper", ] @@ -692,15 +682,15 @@ checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.17.1" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" [[package]] name = "byteorder" @@ -716,15 +706,15 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bytesize" -version = "1.3.0" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" +checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" [[package]] name = "cassowary" @@ -752,9 +742,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", @@ -777,12 +767,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.1" @@ -815,16 +799,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -870,7 +854,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -896,9 +880,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "compact_str" @@ -948,9 +932,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_panic" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7782af8f90fe69a4bb41e460abe1727d493403d8b2cc43201a3a3e906b24379f" +checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" [[package]] name = "constant_time_eq" @@ -980,35 +964,11 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1024,18 +984,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1052,9 +1012,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" @@ -1062,10 +1022,10 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "crossterm_winapi", "mio", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "rustix 0.38.44", "signal-hook", "signal-hook-mio", @@ -1083,9 +1043,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -1141,7 +1101,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1156,12 +1116,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] @@ -1180,16 +1140,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1205,13 +1165,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core 0.20.10", + "darling_core 0.20.11", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1222,9 +1182,9 @@ checksum = "0c03c416ed1a30fbb027ef484ba6ab6f80e1eada675e1a2b92fd673c045a1f1d" [[package]] name = "deadpool" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6541a3916932fe57768d4be0b1ffb5ec7cbf74ca8c903fdfd5c0fe8aa958f0ed" +checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" dependencies = [ "deadpool-runtime", "num_cpus", @@ -1233,9 +1193,9 @@ dependencies = [ [[package]] name = "deadpool-runtime" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" dependencies = [ "tokio", ] @@ -1253,21 +1213,20 @@ dependencies = [ [[package]] name = "deadpool-sync" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8db70494c13cae4ce67b4b4dafdaf828cf0df7237ab5b9e2fcabee4965d0a0a" +checksum = "524bc3df0d57e98ecd022e21ba31166c2625e7d3e5bcc4510efaeeab4abcab04" dependencies = [ "deadpool-runtime", ] [[package]] name = "decancer" -version = "3.2.8" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a41401dd84c9335e2f5aec7f64057e243585d62622260d41c245919a601ccc9" +checksum = "d59c633be7ba6fcf3c153e11d647990e4e4bd463a4d5834ba0a45caa96da6baf" dependencies = [ "lazy_static 1.5.0", - "paste", "regex", ] @@ -1280,14 +1239,14 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -1295,9 +1254,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", ] @@ -1313,17 +1272,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive-new" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "derive_builder" version = "0.12.0" @@ -1357,22 +1305,22 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "deunicode" -version = "1.6.0" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00" +checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" [[package]] name = "diff" @@ -1400,16 +1348,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -1422,14 +1360,13 @@ dependencies = [ ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "dispatch2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "libc", - "redox_users", - "winapi", + "bitflags 2.9.1", + "objc2", ] [[package]] @@ -1440,16 +1377,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", + "syn 2.0.101", ] [[package]] @@ -1496,9 +1424,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "emojis" @@ -1506,7 +1434,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3407bc749191827d456a282321770847daf4b0a1128fde02597a8ed2e987b95d" dependencies = [ - "phf 0.11.2", + "phf 0.11.3", ] [[package]] @@ -1523,9 +1451,9 @@ checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", "serde", @@ -1533,26 +1461,26 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -1560,9 +1488,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.2.0" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "event-listener" @@ -1594,9 +1522,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener 5.4.0", "pin-project-lite", @@ -1604,15 +1532,14 @@ dependencies = [ [[package]] name = "exr" -version = "1.72.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "flume", "half", "lebe", - "miniz_oxide 0.7.4", + "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", @@ -1634,9 +1561,9 @@ dependencies = [ [[package]] name = "eyeball-im" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad276eb017655257443d34f27455f60e8b02b839c6ebcaa8d6f06cc498784e8f" +checksum = "2bce23da1ef2af356501c395426370ef09d778989557a749a874645ec74aba23" dependencies = [ "futures-core", "imbl", @@ -1665,7 +1592,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1679,15 +1606,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1706,21 +1633,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.33" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", + "miniz_oxide", ] [[package]] @@ -1729,34 +1647,19 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", + "foreign-types-shared", ] [[package]] @@ -1765,12 +1668,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1802,9 +1699,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1833,9 +1730,9 @@ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1865,11 +1762,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ - "fastrand 2.1.1", + "fastrand 2.3.0", "futures-core", "futures-io", "parking", @@ -1884,7 +1781,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -1948,9 +1845,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -1961,14 +1858,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -1983,9 +1882,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gloo-timers" @@ -2026,9 +1925,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -2045,9 +1944,9 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -2060,14 +1959,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "hashlink" @@ -2098,9 +2001,9 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -2128,11 +2031,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2151,9 +2054,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -2172,12 +2075,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -2185,9 +2088,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2206,9 +2109,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2227,11 +2130,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -2261,18 +2163,23 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2283,7 +2190,7 @@ name = "iamb" version = "0.0.11-alpha.1" dependencies = [ "anyhow", - "bitflags 2.8.0", + "bitflags 2.9.1", "chrono", "clap", "comrak", @@ -2317,30 +2224,31 @@ dependencies = [ "serde_json", "sled", "temp-dir", - "thiserror 1.0.63", + "thiserror 1.0.69", "tokio", "toml", "tracing", "tracing-appender", "tracing-subscriber", "unicode-segmentation", - "unicode-width 0.1.13", + "unicode-width 0.1.14", "url", "vergen", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.61.2", ] [[package]] @@ -2354,21 +2262,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -2377,31 +2286,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -2409,72 +2298,59 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "icy_sixel" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86858ae800284d596cfdefcb0ad435c3493c12f35367431bbe9b2b3858c1155b" +checksum = "ccc0a9c4770bc47b0a933256a496cfb8b6531f753ea9bccb19c6dff0ff7273fc" [[package]] name = "ident_case" @@ -2495,9 +2371,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -2603,12 +2479,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -2620,9 +2496,9 @@ checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array", @@ -2634,11 +2510,11 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" dependencies = [ - "darling 0.20.10", + "darling 0.20.11", "indoc", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -2658,7 +2534,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -2683,19 +2559,29 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi 0.5.1", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2736,16 +2622,17 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] @@ -2757,10 +2644,11 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2790,14 +2678,14 @@ checksum = "680e4699c91c0622dd70da32c274881aadb1ac86252d738c3641266e90e4ca15" dependencies = [ "textwrap", "unicode-segmentation", - "unicode-width 0.1.13", + "unicode-width 0.1.14", ] [[package]] name = "konst" -version = "0.3.9" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50a0ba6de5f7af397afff922f22c149ff605c766cd3269cf6c1cd5e466dbe3b9" +checksum = "4381b9b00c55f251f2ebe9473aef7c117e96828def1a7cb3bd3f0f903c6894e9" dependencies = [ "const_panic", "konst_kernel", @@ -2806,9 +2694,9 @@ dependencies = [ [[package]] name = "konst_kernel" -version = "0.3.9" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0a455a1719220fd6adf756088e1c69a85bf14b6a9e24537a5cc04f503edb2b" +checksum = "e4b1eb7788f3824c629b1116a7a9060d6e898c358ebff59070093d51103dcc3c" dependencies = [ "typewit", ] @@ -2833,9 +2721,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libfuzzer-sys" @@ -2847,21 +2735,11 @@ dependencies = [ "cc", ] -[[package]] -name = "libloading" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" @@ -2869,7 +2747,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "libc", ] @@ -2892,21 +2770,27 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -2914,9 +2798,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "loop9" @@ -2929,13 +2813,19 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.3", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" @@ -2944,14 +2834,13 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fca4d74ff9dbaac16a01b924bc3693fa2bba0862c2c633abc73f9a8ea21f64" +checksum = "0b95dfb34071d1592b45622bf93e315e3a72d414b6782aca9a015c12bec367ef" dependencies = [ "cc", - "dirs-next", - "objc-foundation", - "objc_id", + "objc2", + "objc2-foundation", "time", ] @@ -2975,7 +2864,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -2986,7 +2875,7 @@ checksum = "13198c120864097a565ccb3ff947672d969932b7975ebd4085732c9f09435e55" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -2999,16 +2888,7 @@ dependencies = [ "macroific_core", "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", + "syn 2.0.101", ] [[package]] @@ -3056,7 +2936,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e2551de3bba2cc65b52dc6b268df6114011fe118ac24870fbcf1b35537bd721" dependencies = [ "matrix-pickle-derive", - "thiserror 1.0.63", + "thiserror 1.0.69", ] [[package]] @@ -3065,11 +2945,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f75de44c3120d78e978adbcf6d453b20ba011f3c46363e52d1dbbc72f545e9fb" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3115,7 +2995,7 @@ dependencies = [ "serde_html_form", "serde_json", "tempfile", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-stream", "tokio-util", @@ -3135,7 +3015,7 @@ checksum = "58884b338e0c2eb4aa09d63ba2a5937fb5bd691525884f09935900137fc6b908" dependencies = [ "as_variant", "async-trait", - "bitflags 2.8.0", + "bitflags 2.9.1", "decancer", "eyeball", "eyeball-im", @@ -3149,7 +3029,7 @@ dependencies = [ "ruma", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "unicode-normalization", @@ -3170,7 +3050,7 @@ dependencies = [ "ruma", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "tracing-subscriber", @@ -3209,7 +3089,7 @@ dependencies = [ "serde_json", "sha2", "subtle", - "thiserror 2.0.11", + "thiserror 2.0.12", "time", "tokio", "tokio-stream", @@ -3229,7 +3109,7 @@ dependencies = [ "anyhow", "async-trait", "base64 0.22.1", - "getrandom 0.2.15", + "getrandom 0.2.16", "gloo-utils", "hkdf", "indexed_db_futures", @@ -3241,7 +3121,7 @@ dependencies = [ "serde-wasm-bindgen", "serde_json", "sha2", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "wasm-bindgen", @@ -3266,7 +3146,7 @@ dependencies = [ "rusqlite", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "vodozemac", @@ -3288,7 +3168,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.11", + "thiserror 2.0.12", "zeroize", ] @@ -3308,15 +3188,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - [[package]] name = "memoffset" version = "0.7.1" @@ -3343,9 +3214,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime2ext" -version = "0.1.53" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "515a63dc9666c865e848b043ab52fe9a5c713ae89cde4b5fbaae67cfd614b93a" +checksum = "cbf6f36070878c42c5233846cd3de24cf9016828fd47bc22957a687298bb21fc" [[package]] name = "mime_guess" @@ -3365,33 +3236,24 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ - "adler", + "adler2", "simd-adler32", ] -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3402,7 +3264,7 @@ checksum = "dc7599fc1bcd2f0a0b4598f23433b45613345a46419ab27d3a9adecb57acd648" dependencies = [ "anymap2", "arboard", - "bitflags 2.8.0", + "bitflags 2.9.1", "crossterm", "derive_more", "intervaltree", @@ -3411,9 +3273,9 @@ dependencies = [ "radix_trie", "regex", "ropey", - "thiserror 1.0.63", + "thiserror 1.0.69", "unicode-segmentation", - "unicode-width 0.1.13", + "unicode-width 0.1.14", ] [[package]] @@ -3434,9 +3296,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -3476,18 +3338,6 @@ dependencies = [ "memoffset 0.7.1", ] -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "cfg_aliases 0.1.1", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -3551,7 +3401,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -3602,148 +3452,95 @@ dependencies = [ "libc", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - [[package]] name = "objc2" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" dependencies = [ - "objc-sys", "objc2-encode", ] [[package]] name = "objc2-app-kit" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ - "bitflags 2.8.0", - "block2", - "libc", - "objc2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.8.0", - "block2", + "bitflags 2.9.1", "objc2", + "objc2-core-graphics", "objc2-foundation", ] [[package]] -name = "objc2-core-image" -version = "0.2.2" +name = "objc2-core-foundation" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "block2", + "bitflags 2.9.1", + "dispatch2", "objc2", - "objc2-foundation", - "objc2-metal", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", ] [[package]] name = "objc2-encode" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "block2", "libc", "objc2", + "objc2-core-foundation", ] [[package]] -name = "objc2-metal" -version = "0.2.2" +name = "objc2-io-surface" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" dependencies = [ - "bitflags 2.8.0", - "block2", + "bitflags 2.9.1", "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", + "objc2-core-foundation", ] [[package]] name = "object" -version = "0.36.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -3763,13 +3560,13 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "cfg-if", - "foreign-types 0.3.2", + "foreign-types", "libc", "once_cell", "openssl-macros", @@ -3784,20 +3581,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -3817,9 +3614,9 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" dependencies = [ "libc", "windows-sys 0.59.0", @@ -3833,9 +3630,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -3850,12 +3647,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.11", ] [[package]] @@ -3874,13 +3671,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall 0.5.12", "smallvec", "windows-targets 0.52.6", ] @@ -3893,9 +3690,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pbkdf2" @@ -3934,11 +3731,11 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", ] [[package]] @@ -3947,7 +3744,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" dependencies = [ - "phf_generator", + "phf_generator 0.10.0", "phf_shared 0.10.0", ] @@ -3961,22 +3758,32 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + [[package]] name = "phf_shared" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] [[package]] @@ -3998,7 +3805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand 2.3.0", "futures-io", ] @@ -4014,21 +3821,21 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" -version = "0.17.13" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.4", + "miniz_oxide", ] [[package]] @@ -4049,15 +3856,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi 0.5.1", "pin-project-lite", - "rustix 0.38.44", + "rustix 1.0.7", "tracing", "windows-sys 0.59.0", ] @@ -4073,6 +3880,15 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -4081,11 +3897,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -4096,9 +3912,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -4116,11 +3932,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.20", + "toml_edit 0.22.26", ] [[package]] @@ -4146,9 +3962,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -4169,14 +3985,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "prost" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", "prost-derive", @@ -4184,15 +4000,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -4221,46 +4037,49 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.34.0" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f24d770aeca0eacb81ac29dfbc55ebcc09312fdd1f8bbecdc7e4a84e000e3b4" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", ] [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.7", - "thiserror 2.0.11", + "socket2 0.5.10", + "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.1", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.11", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -4268,27 +4087,33 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" dependencies = [ - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", "once_cell", - "socket2 0.5.7", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radix_trie" version = "0.2.1" @@ -4312,13 +4137,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.1", - "zerocopy 0.8.20", + "rand_core 0.9.3", ] [[package]] @@ -4338,7 +4162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.1", + "rand_core 0.9.3", ] [[package]] @@ -4347,17 +4171,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] name = "rand_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", - "zerocopy 0.8.20", + "getrandom 0.3.3", ] [[package]] @@ -4375,7 +4198,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "cassowary", "compact_str", "crossterm", @@ -4403,7 +4226,7 @@ dependencies = [ "ratatui", "rustix 0.38.44", "serde", - "thiserror 1.0.63", + "thiserror 1.0.69", "windows 0.58.0", ] @@ -4437,16 +4260,16 @@ dependencies = [ "rand_chacha 0.3.1", "simd_helpers", "system-deps", - "thiserror 1.0.63", + "thiserror 1.0.69", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" dependencies = [ "avif-serialize", "imgref", @@ -4479,9 +4302,9 @@ dependencies = [ [[package]] name = "readlock" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "072cfe5b1d2dcd38d20e18f85e9c9978b6cc08f0b373e9f1fff1541335622974" +checksum = "188bbae3aa4739bd264e9204da5919b2c91dd87dcce5049cf04bdf6aa17c5012" [[package]] name = "readlock-tokio" @@ -4503,11 +4326,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", ] [[package]] @@ -4516,9 +4339,9 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 1.0.63", + "thiserror 1.0.69", ] [[package]] @@ -4552,9 +4375,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "async-compression", "base64 0.22.1", @@ -4579,7 +4402,6 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", @@ -4590,6 +4412,7 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -4597,7 +4420,6 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry", ] [[package]] @@ -4608,15 +4430,14 @@ checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -4655,30 +4476,30 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.3.1" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "rtoolbox" -version = "0.0.2" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "ruma" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d6fea33e3d17b9e009fefb3f175ca7fd40b1e7d1e72444478fd1b28611eb50a" +checksum = "c64fdaae631940eda62844a8a3026aba2ba84c22588c888ebec44861ba4d0c18" dependencies = [ "assign", "js_int", @@ -4692,9 +4513,9 @@ dependencies = [ [[package]] name = "ruma-client-api" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23989b539eceeaad01ba089ad307788f90a29bac2e5f730ff0a523eeae3fa1d7" +checksum = "b9a89ac03a0f4451f946ed9aed6fdd16ef5a78a3a2849e87af4b2474a176b2fb" dependencies = [ "as_variant", "assign", @@ -4709,22 +4530,22 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "url", "web-time", ] [[package]] name = "ruma-common" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1058c04b8dd62f4fba71c9f65112fb79bc332438d11aefe1e8edf67b7fb58a98" +checksum = "6b75da013b362664c3e161662902e5da3f77e990525681b59c6035bac27e87b4" dependencies = [ "as_variant", "base64 0.22.1", "bytes", "form_urlencoded", - "getrandom 0.2.15", + "getrandom 0.2.16", "http", "indexmap", "js-sys", @@ -4738,7 +4559,7 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "time", "tracing", "url", @@ -4749,9 +4570,9 @@ dependencies = [ [[package]] name = "ruma-events" -version = "0.30.1" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1b8e15942e35ba56004429bc0845f481281f903e86957973a08ec08f8d06f0" +checksum = "6c100eb6c7691ef010f18d9af315f486fc4da621b7203c431e88352148e84551" dependencies = [ "as_variant", "indexmap", @@ -4764,7 +4585,7 @@ dependencies = [ "ruma-macros", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", "url", "web-time", @@ -4773,9 +4594,9 @@ dependencies = [ [[package]] name = "ruma-federation-api" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d70c3d37a8e42992aeaa5786cb406ad302bcd05c0e7e3073d5316b4574340dd" +checksum = "373bc5a30b84574dfce3e75c33d79d6ba9843bf0eee1bf351f904eef9bea001a" dependencies = [ "http", "js_int", @@ -4793,7 +4614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ad674b5e5368c53a2c90fde7dac7e30747004aaf7b1827b72874a25fc06d4d8" dependencies = [ "js_int", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4803,12 +4624,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1182e83ee5cd10121974f163337b16af68a93eedfc7cdbdbd52307ac7e1d743" dependencies = [ "cfg-if", - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", "ruma-identifiers-validation", "serde", - "syn 2.0.90", + "syn 2.0.101", "toml", ] @@ -4818,7 +4639,7 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -4834,9 +4655,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -4849,9 +4670,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.27" +version = "0.37.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" dependencies = [ "bitflags 1.3.2", "errno", @@ -4867,18 +4688,31 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "errno", "libc", - "linux-raw-sys 0.4.14", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "once_cell", "ring", @@ -4888,29 +4722,21 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", + "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -4919,31 +4745,25 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -4956,7 +4776,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -4965,9 +4785,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -4975,15 +4795,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -5001,22 +4821,22 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -5034,9 +4854,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -5046,9 +4866,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", @@ -5056,20 +4876,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -5099,9 +4919,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -5125,9 +4945,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", @@ -5146,9 +4966,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -5183,6 +5003,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -5220,9 +5046,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smawk" @@ -5242,23 +5068,14 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spki" version = "0.7.3" @@ -5283,32 +5100,31 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "str_indices" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9557cb6521e8d009c51a8666f09356f4b817ba9ba0981a305bd86aee47bd35c" +checksum = "d08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6" [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "once_cell", - "parking_lot 0.12.3", - "phf_shared 0.10.0", + "parking_lot 0.12.4", + "phf_shared 0.11.3", "precomputed-hash", "serde", ] [[package]] name = "string_cache_codegen" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ - "phf_generator", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", ] @@ -5344,7 +5160,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -5366,9 +5182,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -5386,13 +5202,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -5426,21 +5242,20 @@ dependencies = [ [[package]] name = "temp-dir" -version = "0.1.13" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f227968ec00f0e5322f9b8173c7a0cbcff6181a0a5b28e9892491c286277231" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "tempfile" -version = "3.17.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", - "fastrand 2.1.1", - "getrandom 0.3.1", + "fastrand 2.3.0", + "getrandom 0.3.3", "once_cell", - "rustix 0.38.44", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -5457,53 +5272,53 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.1.13", + "unicode-width 0.2.0", ] [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.63", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -5529,9 +5344,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -5546,15 +5361,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -5562,9 +5377,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -5572,9 +5387,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -5587,16 +5402,16 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", "libc", "mio", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.10", "tokio-macros", "windows-sys 0.52.0", ] @@ -5609,7 +5424,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] @@ -5624,9 +5439,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", @@ -5646,9 +5461,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -5659,21 +5474,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit 0.22.26", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] @@ -5691,17 +5506,24 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "toml_write", + "winnow 0.7.10", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "tower" version = "0.5.2" @@ -5718,6 +5540,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -5732,9 +5572,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -5749,27 +5589,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror 1.0.63", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -5788,9 +5628,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -5802,12 +5642,11 @@ dependencies = [ [[package]] name = "tree_magic_mini" -version = "3.1.5" +version = "3.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" +checksum = "aac5e8971f245c3389a5a76e648bfc80803ae066a1243a75db0064d7c1129d63" dependencies = [ "fnv", - "home", "memchr", "nom", "once_cell", @@ -5828,15 +5667,15 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "typewit" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fb9ae6a3cafaf0a5d14c2302ca525f9ae8e07a0f0e6949de88d882c37a6e24" +checksum = "cb77c29baba9e4d3a6182d51fa75e3215c7fd1dab8f4ea9d107c716878e55fc0" dependencies = [ "typewit_proc_macros", ] @@ -5860,28 +5699,25 @@ dependencies = [ [[package]] name = "ulid" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab82fc73182c29b02e2926a6df32f2241dbadb5cfc111fd595515b3598f46bb3" +checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ - "rand 0.9.0", + "rand 0.9.1", "web-time", ] [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-linebreak" @@ -5900,9 +5736,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" @@ -5912,14 +5748,14 @@ checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ "itertools 0.13.0", "unicode-segmentation", - "unicode-width 0.1.13", + "unicode-width 0.1.14", ] [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" @@ -5973,12 +5809,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -5993,11 +5823,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.3", + "js-sys", "wasm-bindgen", ] @@ -6014,9 +5845,9 @@ dependencies = [ [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -6062,7 +5893,7 @@ dependencies = [ "chacha20poly1305", "curve25519-dalek", "ed25519-dalek", - "getrandom 0.2.15", + "getrandom 0.2.16", "hkdf", "hmac", "matrix-pickle", @@ -6073,7 +5904,7 @@ dependencies = [ "serde_json", "sha2", "subtle", - "thiserror 2.0.11", + "thiserror 2.0.12", "x25519-dalek", "zeroize", ] @@ -6101,56 +5932,57 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6158,28 +5990,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -6190,25 +6025,24 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.6" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90e11ce2ca99c97b940ee83edbae9da2d56a08f9ea8158550fd77fa31722993" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" dependencies = [ "cc", "downcast-rs", "rustix 0.38.44", - "scoped-tls", "smallvec", "wayland-sys", ] [[package]] name = "wayland-client" -version = "0.31.5" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e321577a0a165911bdcfb39cf029302479d7527b517ee58ab0f6ad09edf0943" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "rustix 0.38.44", "wayland-backend", "wayland-scanner", @@ -6216,11 +6050,11 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.31.2" +version = "0.32.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6228,11 +6062,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.2.0" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6241,31 +6075,29 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.4" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b56f89937f1cf2ee1f1259cf2936a17a1f45d8f0aa1019fae6d470d304cfa6" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", - "quick-xml 0.34.0", + "quick-xml 0.37.5", "quote", ] [[package]] name = "wayland-sys" -version = "0.31.4" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43676fe2daf68754ecf1d72026e4e6c15483198b5d24e888b74d3f22f887a148" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ - "dlib", - "log", "pkg-config", ] [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -6283,18 +6115,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "which" @@ -6310,9 +6142,9 @@ dependencies = [ [[package]] name = "wildmatch" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3928939971918220fed093266b809d1ee4ec6c1a2d72692ff6876898f3b16c19" +checksum = "68ce1ab1f8c62655ebe1350f589c61e505cf94d385bc6a12899442d9081e71fd" [[package]] name = "winapi" @@ -6367,24 +6199,28 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.58.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -6395,7 +6231,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -6406,20 +6253,26 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] -name = "windows-registry" -version = "0.2.0" +name = "windows-interface" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "proc-macro2", + "quote", + "syn 2.0.101", ] +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + [[package]] name = "windows-result" version = "0.2.0" @@ -6429,16 +6282,34 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -6655,35 +6526,34 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.1", ] [[package]] name = "wl-clipboard-rs" -version = "0.8.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b41773911497b18ca8553c3daaf8ec9fe9819caf93d451d3055f69de028adb" +checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" dependencies = [ - "derive-new", "libc", "log", - "nix 0.28.0", "os_pipe", + "rustix 0.38.44", "tempfile", - "thiserror 1.0.63", + "thiserror 2.0.12", "tree_magic_mini", "wayland-backend", "wayland-client", @@ -6691,17 +6561,11 @@ dependencies = [ "wayland-protocols-wlr", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "x11rb" @@ -6755,21 +6619,21 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -6779,13 +6643,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "synstructure", ] @@ -6813,7 +6677,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix 0.26.4", + "nix", "once_cell", "ordered-stream", "rand 0.8.5", @@ -6857,63 +6721,42 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "byteorder", - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" -dependencies = [ - "zerocopy-derive 0.8.20", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", "synstructure", ] @@ -6934,14 +6777,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -6950,13 +6804,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.101", ] [[package]] From 84eaadc09a739ad486ed0e645b00737eadf179d9 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 30 May 2025 23:06:19 -0700 Subject: [PATCH 33/56] Show state events in the timeline (#437) --- src/base.rs | 20 + src/message/html.rs | 135 ++++-- src/message/mod.rs | 47 +- src/message/printer.rs | 37 +- src/message/state.rs | 944 +++++++++++++++++++++++++++++++++++++++ src/windows/room/chat.rs | 3 + src/worker.rs | 38 +- 7 files changed, 1145 insertions(+), 79 deletions(-) create mode 100644 src/message/state.rs diff --git a/src/base.rs b/src/base.rs index 754dec9..b8b0978 100644 --- a/src/base.rs +++ b/src/base.rs @@ -47,6 +47,7 @@ use matrix_sdk::{ }, room::redaction::{OriginalSyncRoomRedactionEvent, SyncRoomRedactionEvent}, tag::{TagName, Tags}, + AnySyncStateEvent, MessageLikeEvent, }, presence::PresenceState, @@ -836,6 +837,9 @@ pub enum EventLocation { /// The [EventId] belongs to a reaction to the given event. Reaction(OwnedEventId), + + /// The [EventId] belongs to a state event in the main timeline of the room. + State(MessageKey), } impl EventLocation { @@ -1003,6 +1007,12 @@ impl RoomInfo { match self.keys.get(redacts) { None => return, + Some(EventLocation::State(key)) => { + if let Some(msg) = self.messages.get_mut(key) { + let ev = SyncRoomRedactionEvent::Original(ev); + msg.redact(ev, room_version); + } + }, Some(EventLocation::Message(None, key)) => { if let Some(msg) = self.messages.get_mut(key) { let ev = SyncRoomRedactionEvent::Original(ev); @@ -1076,6 +1086,7 @@ impl RoomInfo { content.apply_replacement(new_msgtype); }, MessageEvent::Redacted(_) | + MessageEvent::State(_) | MessageEvent::EncryptedOriginal(_) | MessageEvent::EncryptedRedacted(_) => { return; @@ -1085,6 +1096,15 @@ impl RoomInfo { msg.html = msg.event.html(); } + pub fn insert_any_state(&mut self, msg: AnySyncStateEvent) { + let event_id = msg.event_id().to_owned(); + let key = (msg.origin_server_ts().into(), event_id.clone()); + + let loc = EventLocation::State(key.clone()); + self.keys.insert(event_id, loc); + self.messages.insert_message(key, msg); + } + /// Indicates whether this room has unread messages. pub fn unreads(&self, settings: &ApplicationSettings) -> UnreadInfo { let last_message = self.messages.last_key_value(); diff --git a/src/message/html.rs b/src/message/html.rs index ff62aae..5ba9830 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -10,10 +10,12 @@ //! //! This isn't as important for iamb, since it isn't a browser environment, but we do still map //! input onto an enum of the safe list of tags to keep it easy to understand and process. +use std::borrow::Cow; use std::ops::Deref; use css_color_parser::Color as CssColor; use markup5ever_rcdom::{Handle, NodeData, RcDom}; +use matrix_sdk::ruma::{OwnedRoomAliasId, OwnedRoomId, OwnedUserId}; use unicode_segmentation::UnicodeSegmentation; use url::Url; @@ -34,6 +36,7 @@ use ratatui::{ }; use crate::{ + config::ApplicationSettings, message::printer::TextPrinter, util::{join_cell_text, space_text}, }; @@ -148,7 +151,12 @@ impl Table { } } - fn to_text(&self, width: usize, style: Style, emoji_shortcodes: bool) -> Text { + fn to_text<'a>( + &'a self, + width: usize, + style: Style, + settings: &'a ApplicationSettings, + ) -> Text<'a> { let mut text = Text::default(); let columns = self.columns(); let cell_total = width.saturating_sub(columns).saturating_sub(1); @@ -167,7 +175,7 @@ impl Table { if let Some(caption) = &self.caption { let subw = width.saturating_sub(6); let mut printer = - TextPrinter::new(subw, style, true, emoji_shortcodes).align(Alignment::Center); + TextPrinter::new(subw, style, true, settings).align(Alignment::Center); caption.print(&mut printer, style); for mut line in printer.finish().lines { @@ -214,7 +222,7 @@ impl Table { CellType::Data => style, }; - cell.to_text(*w, style, emoji_shortcodes) + cell.to_text(*w, style, settings) } else { space_text(*w, style) }; @@ -271,13 +279,21 @@ pub enum StyleTreeNode { Ruler, Style(Box, Style), Table(Table), - Text(String), + Text(Cow<'static, str>), Sequence(StyleTreeChildren), + RoomAlias(OwnedRoomAliasId), + RoomId(OwnedRoomId), + UserId(OwnedUserId), } impl StyleTreeNode { - pub fn to_text(&self, width: usize, style: Style, emoji_shortcodes: bool) -> Text { - let mut printer = TextPrinter::new(width, style, true, emoji_shortcodes); + pub fn to_text<'a>( + &'a self, + width: usize, + style: Style, + settings: &'a ApplicationSettings, + ) -> Text<'a> { + let mut printer = TextPrinter::new(width, style, true, settings); self.print(&mut printer, style); printer.finish() } @@ -312,6 +328,11 @@ impl StyleTreeNode { StyleTreeNode::Ruler => {}, StyleTreeNode::Text(_) => {}, StyleTreeNode::Break => {}, + + // TODO: eventually these should turn into internal links: + StyleTreeNode::UserId(_) => {}, + StyleTreeNode::RoomId(_) => {}, + StyleTreeNode::RoomAlias(_) => {}, } } @@ -430,14 +451,14 @@ impl StyleTreeNode { } }, StyleTreeNode::Table(table) => { - let text = table.to_text(width, style, printer.emoji_shortcodes()); + let text = table.to_text(width, style, printer.settings); printer.push_text(text); }, StyleTreeNode::Break => { printer.push_break(); }, StyleTreeNode::Text(s) => { - printer.push_str(s.as_str(), style); + printer.push_str(s.as_ref(), style); }, StyleTreeNode::Style(child, patch) => child.print(printer, style.patch(*patch)), @@ -446,13 +467,26 @@ impl StyleTreeNode { child.print(printer, style); } }, + + StyleTreeNode::UserId(user_id) => { + let style = printer.settings().get_user_style(user_id); + printer.push_str(user_id.as_str(), style); + }, + StyleTreeNode::RoomId(room_id) => { + let bold = style.add_modifier(StyleModifier::BOLD); + printer.push_str(room_id.as_str(), bold); + }, + StyleTreeNode::RoomAlias(alias) => { + let bold = style.add_modifier(StyleModifier::BOLD); + printer.push_str(alias.as_str(), bold); + }, } } } /// A processed HTML document. pub struct StyleTree { - children: StyleTreeChildren, + pub(super) children: StyleTreeChildren, } impl StyleTree { @@ -466,14 +500,14 @@ impl StyleTree { return links; } - pub fn to_text( - &self, + pub fn to_text<'a>( + &'a self, width: usize, style: Style, hide_reply: bool, - emoji_shortcodes: bool, - ) -> Text<'_> { - let mut printer = TextPrinter::new(width, style, hide_reply, emoji_shortcodes); + settings: &'a ApplicationSettings, + ) -> Text<'a> { + let mut printer = TextPrinter::new(width, style, hide_reply, settings); for child in self.children.iter() { child.print(&mut printer, style); @@ -661,7 +695,7 @@ fn h2t(hdl: &Handle, state: &mut TreeGenState) -> StyleTreeChildren { let tree = match &node.data { NodeData::Document => *c2t(node.children.borrow().as_slice(), state), - NodeData::Text { contents } => StyleTreeNode::Text(contents.borrow().to_string()), + NodeData::Text { contents } => StyleTreeNode::Text(contents.borrow().to_string().into()), NodeData::Element { name, attrs, .. } => { match name.local.as_ref() { // Message that this one replies to. @@ -811,17 +845,19 @@ pub fn parse_matrix_html(s: &str) -> StyleTree { #[cfg(test)] pub mod tests { use super::*; + use crate::tests::mock_settings; use crate::util::space_span; use pretty_assertions::assert_eq; use unicode_width::UnicodeWidthStr; #[test] fn test_header() { + let settings = mock_settings(); let bold = Style::default().add_modifier(StyleModifier::BOLD); let s = "

Header 1

"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("#", bold), Span::styled(" ", bold), @@ -833,7 +869,7 @@ pub mod tests { let s = "

Header 2

"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("#", bold), Span::styled("#", bold), @@ -846,7 +882,7 @@ pub mod tests { let s = "

Header 3

"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("#", bold), Span::styled("#", bold), @@ -860,7 +896,7 @@ pub mod tests { let s = "

Header 4

"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("#", bold), Span::styled("#", bold), @@ -875,7 +911,7 @@ pub mod tests { let s = "
Header 5
"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("#", bold), Span::styled("#", bold), @@ -891,7 +927,7 @@ pub mod tests { let s = "
Header 6
"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("#", bold), Span::styled("#", bold), @@ -909,6 +945,7 @@ pub mod tests { #[test] fn test_style() { + let settings = mock_settings(); let def = Style::default(); let bold = def.add_modifier(StyleModifier::BOLD); let italic = def.add_modifier(StyleModifier::ITALIC); @@ -918,7 +955,7 @@ pub mod tests { let s = "Bold!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Bold", bold), Span::styled("!", bold), @@ -927,7 +964,7 @@ pub mod tests { let s = "Bold!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Bold", bold), Span::styled("!", bold), @@ -936,7 +973,7 @@ pub mod tests { let s = "Italic!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Italic", italic), Span::styled("!", italic), @@ -945,7 +982,7 @@ pub mod tests { let s = "Italic!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Italic", italic), Span::styled("!", italic), @@ -954,7 +991,7 @@ pub mod tests { let s = "Strikethrough!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Strikethrough", strike), Span::styled("!", strike), @@ -963,7 +1000,7 @@ pub mod tests { let s = "Strikethrough!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Strikethrough", strike), Span::styled("!", strike), @@ -972,7 +1009,7 @@ pub mod tests { let s = "Underline!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Underline", underl), Span::styled("!", underl), @@ -981,7 +1018,7 @@ pub mod tests { let s = "Red!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Red", red), Span::styled("!", red), @@ -990,7 +1027,7 @@ pub mod tests { let s = "Red!"; let tree = parse_matrix_html(s); - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &settings); assert_eq!(text.lines, vec![Line::from(vec![ Span::styled("Red", red), Span::styled("!", red), @@ -1000,9 +1037,10 @@ pub mod tests { #[test] fn test_paragraph() { + let settings = mock_settings(); let s = "

Hello world!

Content

Goodbye world!

"; let tree = parse_matrix_html(s); - let text = tree.to_text(10, Style::default(), false, false); + let text = tree.to_text(10, Style::default(), false, &settings); assert_eq!(text.lines.len(), 7); assert_eq!( text.lines[0], @@ -1027,9 +1065,10 @@ pub mod tests { #[test] fn test_blockquote() { + let settings = mock_settings(); let s = "
Hello world!
"; let tree = parse_matrix_html(s); - let text = tree.to_text(10, Style::default(), false, false); + let text = tree.to_text(10, Style::default(), false, &settings); assert_eq!(text.lines.len(), 2); assert_eq!( text.lines[0], @@ -1043,9 +1082,10 @@ pub mod tests { #[test] fn test_list_unordered() { + let settings = mock_settings(); let s = "
  • List Item 1
  • List Item 2
  • List Item 3
"; let tree = parse_matrix_html(s); - let text = tree.to_text(8, Style::default(), false, false); + let text = tree.to_text(8, Style::default(), false, &settings); assert_eq!(text.lines.len(), 6); assert_eq!( text.lines[0], @@ -1105,9 +1145,10 @@ pub mod tests { #[test] fn test_list_ordered() { + let settings = mock_settings(); let s = "
  1. List Item 1
  2. List Item 2
  3. List Item 3
"; let tree = parse_matrix_html(s); - let text = tree.to_text(9, Style::default(), false, false); + let text = tree.to_text(9, Style::default(), false, &settings); assert_eq!(text.lines.len(), 6); assert_eq!( text.lines[0], @@ -1167,6 +1208,7 @@ pub mod tests { #[test] fn test_table() { + let settings = mock_settings(); let s = "\ \ @@ -1177,7 +1219,7 @@ pub mod tests { \
Column 1Column 2Column 3
abc
"; let tree = parse_matrix_html(s); - let text = tree.to_text(15, Style::default(), false, false); + let text = tree.to_text(15, Style::default(), false, &settings); let bold = Style::default().add_modifier(StyleModifier::BOLD); assert_eq!(text.lines.len(), 11); @@ -1267,10 +1309,11 @@ pub mod tests { #[test] fn test_matrix_reply() { + let settings = mock_settings(); let s = "This was replied toThis is the reply"; let tree = parse_matrix_html(s); - let text = tree.to_text(10, Style::default(), false, false); + let text = tree.to_text(10, Style::default(), false, &settings); assert_eq!(text.lines.len(), 4); assert_eq!( text.lines[0], @@ -1307,7 +1350,7 @@ pub mod tests { ); let tree = parse_matrix_html(s); - let text = tree.to_text(10, Style::default(), true, false); + let text = tree.to_text(10, Style::default(), true, &settings); assert_eq!(text.lines.len(), 2); assert_eq!( text.lines[0], @@ -1332,9 +1375,10 @@ pub mod tests { #[test] fn test_self_closing() { + let settings = mock_settings(); let s = "Hello
World
Goodbye"; let tree = parse_matrix_html(s); - let text = tree.to_text(7, Style::default(), true, false); + let text = tree.to_text(7, Style::default(), true, &settings); assert_eq!(text.lines.len(), 3); assert_eq!(text.lines[0], Line::from(vec![Span::raw("Hello"), Span::raw(" "),])); assert_eq!(text.lines[1], Line::from(vec![Span::raw("World"), Span::raw(" "),])); @@ -1343,9 +1387,10 @@ pub mod tests { #[test] fn test_embedded_newline() { + let settings = mock_settings(); let s = "

Hello\nWorld

"; let tree = parse_matrix_html(s); - let text = tree.to_text(15, Style::default(), true, false); + let text = tree.to_text(15, Style::default(), true, &settings); assert_eq!(text.lines.len(), 1); assert_eq!( text.lines[0], @@ -1360,6 +1405,7 @@ pub mod tests { #[test] fn test_pre_tag() { + let settings = mock_settings(); let s = concat!( "
",
             "fn hello() -> usize {\n",
@@ -1368,7 +1414,7 @@ pub mod tests {
             "
\n" ); let tree = parse_matrix_html(s); - let text = tree.to_text(25, Style::default(), true, false); + let text = tree.to_text(25, Style::default(), true, &settings); assert_eq!(text.lines.len(), 5); assert_eq!( text.lines[0], @@ -1432,6 +1478,11 @@ pub mod tests { #[test] fn test_emoji_shortcodes() { + let mut enabled = mock_settings(); + enabled.tunables.message_shortcode_display = true; + let mut disabled = mock_settings(); + disabled.tunables.message_shortcode_display = false; + for shortcode in ["exploding_head", "polar_bear", "canada"] { let emoji = emojis::get_by_shortcode(shortcode).unwrap().as_str(); let emoji_width = UnicodeWidthStr::width(emoji); @@ -1440,13 +1491,13 @@ pub mod tests { let s = format!("

{emoji}

"); let tree = parse_matrix_html(s.as_str()); // Test with emojis_shortcodes set to false - let text = tree.to_text(20, Style::default(), false, false); + let text = tree.to_text(20, Style::default(), false, &disabled); assert_eq!(text.lines, vec![Line::from(vec![ Span::raw(emoji), space_span(20 - emoji_width, Style::default()), ]),]); // Test with emojis_shortcodes set to true - let text = tree.to_text(20, Style::default(), false, true); + let text = tree.to_text(20, Style::default(), false, &enabled); assert_eq!(text.lines, vec![Line::from(vec![ Span::raw(replacement.as_str()), space_span(20 - replacement_width, Style::default()), diff --git a/src/message/mod.rs b/src/message/mod.rs index 39d6734..3e6ae73 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -35,6 +35,7 @@ use matrix_sdk::ruma::{ }, redaction::SyncRoomRedactionEvent, }, + AnySyncStateEvent, RedactContent, RedactedUnsigned, }, @@ -67,8 +68,10 @@ use crate::{ mod compose; mod html; mod printer; +mod state; pub use self::compose::text_to_message; +use self::state::{body_cow_state, html_state}; type ProtocolPreview<'a> = (&'a Protocol, u16, u16); @@ -427,6 +430,7 @@ pub enum MessageEvent { EncryptedRedacted(Box), Original(Box), Redacted(Box), + State(Box), Local(OwnedEventId, Box), } @@ -437,6 +441,7 @@ impl MessageEvent { MessageEvent::EncryptedRedacted(ev) => ev.event_id.as_ref(), MessageEvent::Original(ev) => ev.event_id.as_ref(), MessageEvent::Redacted(ev) => ev.event_id.as_ref(), + MessageEvent::State(ev) => ev.event_id(), MessageEvent::Local(event_id, _) => event_id.as_ref(), } } @@ -447,6 +452,7 @@ impl MessageEvent { MessageEvent::Original(ev) => Some(&ev.content), MessageEvent::EncryptedRedacted(_) => None, MessageEvent::Redacted(_) => None, + MessageEvent::State(_) => None, MessageEvent::Local(_, content) => Some(content), } } @@ -464,6 +470,7 @@ impl MessageEvent { MessageEvent::Original(ev) => body_cow_content(&ev.content), MessageEvent::EncryptedRedacted(ev) => body_cow_reason(&ev.unsigned), MessageEvent::Redacted(ev) => body_cow_reason(&ev.unsigned), + MessageEvent::State(ev) => body_cow_state(ev), MessageEvent::Local(_, content) => body_cow_content(content), } } @@ -474,6 +481,7 @@ impl MessageEvent { MessageEvent::EncryptedRedacted(_) => return None, MessageEvent::Original(ev) => &ev.content, MessageEvent::Redacted(_) => return None, + MessageEvent::State(ev) => return Some(html_state(ev)), MessageEvent::Local(_, content) => content, }; @@ -493,6 +501,7 @@ impl MessageEvent { MessageEvent::EncryptedOriginal(_) => return, MessageEvent::EncryptedRedacted(_) => return, MessageEvent::Redacted(_) => return, + MessageEvent::State(_) => return, MessageEvent::Local(_, _) => return, MessageEvent::Original(ev) => { let redacted = RedactedRoomMessageEvent { @@ -721,8 +730,7 @@ impl<'a> MessageFormatter<'a> { ) -> Option> { let width = self.width(); let w = width.saturating_sub(2); - let shortcodes = self.settings.tunables.message_shortcode_display; - let (mut replied, proto) = msg.show_msg(w, style, true, shortcodes); + let (mut replied, proto) = msg.show_msg(w, style, true, settings); let mut sender = msg.sender_span(info, self.settings); let sender_width = UnicodeWidthStr::width(sender.content.as_ref()); let trailing = w.saturating_sub(sender_width + 1); @@ -760,7 +768,7 @@ impl<'a> MessageFormatter<'a> { } fn push_reactions(&mut self, counts: Vec<(&'a str, usize)>, style: Style, text: &mut Text<'a>) { - let mut emojis = printer::TextPrinter::new(self.width(), style, false, false); + let mut emojis = printer::TextPrinter::new(self.width(), style, false, self.settings); let mut reactions = 0; for (key, count) in counts { @@ -809,7 +817,7 @@ impl<'a> MessageFormatter<'a> { let plural = len != 1; let style = Style::default(); let mut threaded = - printer::TextPrinter::new(self.width(), style, false, false).literal(true); + printer::TextPrinter::new(self.width(), style, false, self.settings).literal(true); let len = Span::styled(len.to_string(), style.add_modifier(StyleModifier::BOLD)); threaded.push_str(" \u{2937} ", style); threaded.push_span_nobreak(len); @@ -861,6 +869,7 @@ impl Message { MessageEvent::Local(_, content) => content, MessageEvent::Original(ev) => &ev.content, MessageEvent::Redacted(_) => return None, + MessageEvent::State(_) => return None, }; match &content.relates_to { @@ -881,6 +890,7 @@ impl Message { MessageEvent::Local(_, content) => content, MessageEvent::Original(ev) => &ev.content, MessageEvent::Redacted(_) => return None, + MessageEvent::State(_) => return None, }; match &content.relates_to { @@ -993,12 +1003,7 @@ impl Message { }); // Now show the message contents, and the inlined reply if we couldn't find it above. - let (msg, proto) = self.show_msg( - width, - style, - reply.is_some(), - settings.tunables.message_shortcode_display, - ); + let (msg, proto) = self.show_msg(width, style, reply.is_some(), settings); // Given our text so far, determine the image offset. let proto_main = proto.map(|p| { @@ -1040,18 +1045,18 @@ impl Message { self.show_with_preview(prev, selected, vwctx, info, settings).0 } - fn show_msg( - &self, + fn show_msg<'a>( + &'a self, width: usize, style: Style, hide_reply: bool, - emoji_shortcodes: bool, - ) -> (Text, Option<&Protocol>) { + settings: &'a ApplicationSettings, + ) -> (Text<'a>, Option<&'a Protocol>) { if let Some(html) = &self.html { - (html.to_text(width, style, hide_reply, emoji_shortcodes), None) + (html.to_text(width, style, hide_reply, settings), None) } else { let mut msg = self.event.body(); - if emoji_shortcodes { + if settings.tunables.message_shortcode_display { msg = Cow::Owned(replace_emojis_in_str(msg.as_ref())); } @@ -1166,6 +1171,16 @@ impl From for Message { } } +impl From for Message { + fn from(event: AnySyncStateEvent) -> Self { + let timestamp = event.origin_server_ts().into(); + let user_id = event.sender().to_owned(); + let event = MessageEvent::State(event.into()); + + Message::new(event, user_id, timestamp) + } +} + impl Display for Message { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.event.body()) diff --git a/src/message/printer.rs b/src/message/printer.rs index 12d03be..d2a2dd0 100644 --- a/src/message/printer.rs +++ b/src/message/printer.rs @@ -11,6 +11,7 @@ use ratatui::text::{Line, Span, Text}; use unicode_segmentation::UnicodeSegmentation; use unicode_width::UnicodeWidthStr; +use crate::config::{ApplicationSettings, TunableValues}; use crate::util::{ replace_emojis_in_line, replace_emojis_in_span, @@ -25,28 +26,34 @@ pub struct TextPrinter<'a> { width: usize, base_style: Style, hide_reply: bool, - emoji_shortcodes: bool, alignment: Alignment, curr_spans: Vec>, curr_width: usize, literal: bool, + + pub(super) settings: &'a ApplicationSettings, } impl<'a> TextPrinter<'a> { /// Create a new printer. - pub fn new(width: usize, base_style: Style, hide_reply: bool, emoji_shortcodes: bool) -> Self { + pub fn new( + width: usize, + base_style: Style, + hide_reply: bool, + settings: &'a ApplicationSettings, + ) -> Self { TextPrinter { text: Text::default(), width, base_style, hide_reply, - emoji_shortcodes, alignment: Alignment::Left, curr_spans: vec![], curr_width: 0, literal: false, + settings, } } @@ -69,7 +76,15 @@ impl<'a> TextPrinter<'a> { /// Indicates whether emojis should be replaced by shortcodes pub fn emoji_shortcodes(&self) -> bool { - self.emoji_shortcodes + self.tunables().message_shortcode_display + } + + pub fn settings(&self) -> &ApplicationSettings { + self.settings + } + + pub fn tunables(&self) -> &TunableValues { + &self.settings.tunables } /// Indicates the current printer's width. @@ -84,12 +99,12 @@ impl<'a> TextPrinter<'a> { width: self.width.saturating_sub(indent), base_style: self.base_style, hide_reply: self.hide_reply, - emoji_shortcodes: self.emoji_shortcodes, alignment: self.alignment, curr_spans: vec![], curr_width: 0, literal: self.literal, + settings: self.settings, } } @@ -179,7 +194,7 @@ impl<'a> TextPrinter<'a> { /// Push a [Span] that isn't allowed to break across lines. pub fn push_span_nobreak(&mut self, mut span: Span<'a>) { - if self.emoji_shortcodes { + if self.emoji_shortcodes() { replace_emojis_in_span(&mut span); } let sw = UnicodeWidthStr::width(span.content.as_ref()); @@ -217,7 +232,7 @@ impl<'a> TextPrinter<'a> { continue; } - let cow = if self.emoji_shortcodes { + let cow = if self.emoji_shortcodes() { Cow::Owned(replace_emojis_in_str(word)) } else { Cow::Borrowed(word) @@ -253,7 +268,7 @@ impl<'a> TextPrinter<'a> { /// Push a [Line] into the printer. pub fn push_line(&mut self, mut line: Line<'a>) { self.commit(); - if self.emoji_shortcodes { + if self.emoji_shortcodes() { replace_emojis_in_line(&mut line); } self.text.lines.push(line); @@ -262,7 +277,7 @@ impl<'a> TextPrinter<'a> { /// Push multiline [Text] into the printer. pub fn push_text(&mut self, mut text: Text<'a>) { self.commit(); - if self.emoji_shortcodes { + if self.emoji_shortcodes() { for line in &mut text.lines { replace_emojis_in_line(line); } @@ -280,10 +295,12 @@ impl<'a> TextPrinter<'a> { #[cfg(test)] pub mod tests { use super::*; + use crate::tests::mock_settings; #[test] fn test_push_nobreak() { - let mut printer = TextPrinter::new(5, Style::default(), false, false); + let settings = mock_settings(); + let mut printer = TextPrinter::new(5, Style::default(), false, &settings); printer.push_span_nobreak("hello world".into()); let text = printer.finish(); assert_eq!(text.lines.len(), 1); diff --git a/src/message/state.rs b/src/message/state.rs new file mode 100644 index 0000000..8f19f0c --- /dev/null +++ b/src/message/state.rs @@ -0,0 +1,944 @@ +//! Code for displaying state events. +use std::borrow::Cow; +use std::str::FromStr; + +use matrix_sdk::ruma::{ + events::{ + room::member::MembershipChange, + AnyFullStateEventContent, + AnySyncStateEvent, + FullStateEventContent, + }, + OwnedRoomId, + UserId, +}; + +use super::html::{StyleTree, StyleTreeNode}; +use ratatui::style::{Modifier as StyleModifier, Style}; + +fn bold(s: impl Into>) -> StyleTreeNode { + let bold = Style::default().add_modifier(StyleModifier::BOLD); + let text = StyleTreeNode::Text(s.into()); + StyleTreeNode::Style(Box::new(text), bold) +} + +pub fn body_cow_state(ev: &AnySyncStateEvent) -> Cow<'static, str> { + let event = match ev.content() { + AnyFullStateEventContent::PolicyRuleRoom(FullStateEventContent::Original { + content, + .. + }) => { + let mut m = format!( + "* updated the room policy rule for {:?} to {:?}", + content.0.entity, + content.0.recommendation.as_str() + ); + + if !content.0.reason.is_empty() { + m.push_str(" (reason: "); + m.push_str(&content.0.reason); + m.push(')'); + } + + m + }, + AnyFullStateEventContent::PolicyRuleServer(FullStateEventContent::Original { + content, + .. + }) => { + let mut m = format!( + "* updated the server policy rule for {:?} to {:?}", + content.0.entity, + content.0.recommendation.as_str() + ); + + if !content.0.reason.is_empty() { + m.push_str(" (reason: "); + m.push_str(&content.0.reason); + m.push(')'); + } + + m + }, + AnyFullStateEventContent::PolicyRuleUser(FullStateEventContent::Original { + content, + .. + }) => { + let mut m = format!( + "* updated the user policy rule for {:?} to {:?}", + content.0.entity, + content.0.recommendation.as_str() + ); + + if !content.0.reason.is_empty() { + m.push_str(" (reason: "); + m.push_str(&content.0.reason); + m.push(')'); + } + + m + }, + AnyFullStateEventContent::RoomAliases(FullStateEventContent::Original { + content, .. + }) => { + let mut m = String::from("* set the room aliases to: "); + + for (i, alias) in content.aliases.iter().enumerate() { + if i != 0 { + m.push_str(", "); + } + + m.push_str(alias.as_str()); + } + + m + }, + AnyFullStateEventContent::RoomAvatar(FullStateEventContent::Original { + content, + prev_content, + }) => { + let prev_url = prev_content.as_ref().and_then(|p| p.url.as_ref()); + + match (prev_url, content.url) { + (None, Some(_)) => return Cow::Borrowed("* added a room avatar"), + (Some(old), Some(new)) => { + if old != &new { + return Cow::Borrowed("* replaced the room avatar"); + } + + return Cow::Borrowed("* updated the room avatar state"); + }, + (Some(_), None) => return Cow::Borrowed("* removed the room avatar"), + (None, None) => return Cow::Borrowed("* updated the room avatar state"), + } + }, + AnyFullStateEventContent::RoomCanonicalAlias(FullStateEventContent::Original { + content, + prev_content, + }) => { + let old_canon = prev_content.as_ref().and_then(|p| p.alias.as_ref()); + let new_canon = content.alias.as_ref(); + + match (old_canon, new_canon) { + (None, Some(canon)) => { + format!("* updated the canonical alias for the room to: {}", canon) + }, + (Some(old), Some(new)) => { + if old != new { + format!("* updated the canonical alias for the room to: {}", new) + } else { + return Cow::Borrowed("* removed the canonical alias for the room"); + } + }, + (Some(_), None) => { + return Cow::Borrowed("* removed the canonical alias for the room"); + }, + (None, None) => { + return Cow::Borrowed("* did not change the canonical alias"); + }, + } + }, + AnyFullStateEventContent::RoomCreate(FullStateEventContent::Original { + content, .. + }) => { + if content.federate { + return Cow::Borrowed("* created a federated room"); + } else { + return Cow::Borrowed("* created a non-federated room"); + } + }, + AnyFullStateEventContent::RoomEncryption(FullStateEventContent::Original { .. }) => { + return Cow::Borrowed("* updated the encryption settings for the room"); + }, + AnyFullStateEventContent::RoomGuestAccess(FullStateEventContent::Original { + content, + .. + }) => { + format!("* set guest access for the room to {:?}", content.guest_access.as_str()) + }, + AnyFullStateEventContent::RoomHistoryVisibility(FullStateEventContent::Original { + content, + .. + }) => { + format!( + "* updated history visibility for the room to {:?}", + content.history_visibility.as_str() + ) + }, + AnyFullStateEventContent::RoomJoinRules(FullStateEventContent::Original { + content, + .. + }) => { + format!("* update the join rules for the room to {:?}", content.join_rule.as_str()) + }, + AnyFullStateEventContent::RoomMember(FullStateEventContent::Original { + content, + prev_content, + }) => { + let Ok(state_key) = UserId::parse(ev.state_key()) else { + return Cow::Owned(format!( + "* failed to calculate membership change for {:?}", + ev.state_key() + )); + }; + + let prev_details = prev_content.as_ref().map(|p| p.details()); + let change = content.membership_change(prev_details, ev.sender(), &state_key); + + match change { + MembershipChange::None => { + format!("* did nothing to {}", state_key) + }, + MembershipChange::Error => { + format!("* failed to calculate membership change to {}", state_key) + }, + MembershipChange::Joined => { + return Cow::Borrowed("* joined the room"); + }, + MembershipChange::Left => { + return Cow::Borrowed("* left the room"); + }, + MembershipChange::Banned => { + format!("* banned {} from the room", state_key) + }, + MembershipChange::Unbanned => { + format!("* unbanned {} from the room", state_key) + }, + MembershipChange::Kicked => { + format!("* kicked {} from the room", state_key) + }, + MembershipChange::Invited => { + format!("* invited {} to the room", state_key) + }, + MembershipChange::KickedAndBanned => { + format!("* kicked and banned {} from the room", state_key) + }, + MembershipChange::InvitationAccepted => { + return Cow::Borrowed("* accepted an invitation to join the room"); + }, + MembershipChange::InvitationRejected => { + return Cow::Borrowed("* rejected an invitation to join the room"); + }, + MembershipChange::InvitationRevoked => { + format!("* revoked an invitation for {} to join the room", state_key) + }, + MembershipChange::Knocked => { + return Cow::Borrowed("* would like to join the room"); + }, + MembershipChange::KnockAccepted => { + format!("* accepted the room knock from {}", state_key) + }, + MembershipChange::KnockRetracted => { + return Cow::Borrowed("* retracted their room knock"); + }, + MembershipChange::KnockDenied => { + format!("* rejected the room knock from {}", state_key) + }, + MembershipChange::ProfileChanged { displayname_change, avatar_url_change } => { + match (displayname_change, avatar_url_change) { + (Some(change), avatar_change) => { + let mut m = match (change.old, change.new) { + (None, Some(new)) => { + format!("* set their display name to {:?}", new) + }, + (Some(old), Some(new)) => { + format!( + "* changed their display name from {:?} to {:?}", + old, new + ) + }, + (Some(_), None) => "* unset their display name".to_string(), + (None, None) => { + "* made an unknown change to their display name".to_string() + }, + }; + + if avatar_change.is_some() { + m.push_str(" and changed their user avatar"); + } + + m + }, + (None, Some(change)) => { + match (change.old, change.new) { + (None, Some(_)) => { + return Cow::Borrowed("* added a user avatar"); + }, + (Some(_), Some(_)) => { + return Cow::Borrowed("* changed their user avatar"); + }, + (Some(_), None) => { + return Cow::Borrowed("* removed their user avatar"); + }, + (None, None) => { + return Cow::Borrowed( + "* made an unknown change to their user avatar", + ); + }, + } + }, + (None, None) => { + return Cow::Borrowed("* changed their user profile"); + }, + } + }, + ev => { + format!("* made an unknown membership change to {}: {:?}", state_key, ev) + }, + } + }, + AnyFullStateEventContent::RoomName(FullStateEventContent::Original { content, .. }) => { + format!("* updated the room name to {:?}", content.name) + }, + AnyFullStateEventContent::RoomPinnedEvents(FullStateEventContent::Original { .. }) => { + return Cow::Borrowed("* updated the pinned events for the room"); + }, + AnyFullStateEventContent::RoomPowerLevels(FullStateEventContent::Original { .. }) => { + return Cow::Borrowed("* updated the power levels for the room"); + }, + AnyFullStateEventContent::RoomServerAcl(FullStateEventContent::Original { .. }) => { + return Cow::Borrowed("* updated the room's server ACLs"); + }, + AnyFullStateEventContent::RoomThirdPartyInvite(FullStateEventContent::Original { + content, + .. + }) => { + format!("* sent a third-party invite to {:?}", content.display_name) + }, + AnyFullStateEventContent::RoomTombstone(FullStateEventContent::Original { + content, + .. + }) => { + format!( + "* upgraded the room; replacement room is {}", + content.replacement_room.as_str() + ) + }, + AnyFullStateEventContent::RoomTopic(FullStateEventContent::Original { + content, .. + }) => { + format!("* set the room topic to {:?}", content.topic) + }, + AnyFullStateEventContent::SpaceChild(FullStateEventContent::Original { .. }) => { + format!("* added a space child: {}", ev.state_key()) + }, + AnyFullStateEventContent::SpaceParent(FullStateEventContent::Original { + content, .. + }) => { + if content.canonical { + format!("* added a canonical parent space: {}", ev.state_key()) + } else { + format!("* added a parent space: {}", ev.state_key()) + } + }, + AnyFullStateEventContent::BeaconInfo(FullStateEventContent::Original { .. }) => { + return Cow::Borrowed("* shared beacon information"); + }, + AnyFullStateEventContent::CallMember(FullStateEventContent::Original { .. }) => { + return Cow::Borrowed("* updated membership for room call"); + }, + AnyFullStateEventContent::MemberHints(FullStateEventContent::Original { + content, .. + }) => { + let mut m = String::from("* updated the list of service members in the room hints: "); + + for (i, member) in content.service_members.iter().enumerate() { + if i != 0 { + m.push_str(", "); + } + + m.push_str(member.as_str()); + } + + m + }, + + // Redacted variants of state events: + AnyFullStateEventContent::PolicyRuleRoom(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated a room policy rule (redacted)"); + }, + AnyFullStateEventContent::PolicyRuleServer(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated a server policy rule (redacted)"); + }, + AnyFullStateEventContent::PolicyRuleUser(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated a user policy rule (redacted)"); + }, + AnyFullStateEventContent::RoomAliases(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the room aliases for the room (redacted)"); + }, + AnyFullStateEventContent::RoomAvatar(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the room avatar (redacted)"); + }, + AnyFullStateEventContent::RoomCanonicalAlias(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the canonical alias for the room (redacted)"); + }, + AnyFullStateEventContent::RoomCreate(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* created the room (redacted)"); + }, + AnyFullStateEventContent::RoomEncryption(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the encryption settings for the room (redacted)"); + }, + AnyFullStateEventContent::RoomGuestAccess(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed( + "* updated the guest access configuration for the room (redacted)", + ); + }, + AnyFullStateEventContent::RoomHistoryVisibility(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated history visilibity for the room (redacted)"); + }, + AnyFullStateEventContent::RoomJoinRules(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the join rules for the room (redacted)"); + }, + AnyFullStateEventContent::RoomMember(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the room membership (redacted)"); + }, + AnyFullStateEventContent::RoomName(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the room name (redacted)"); + }, + AnyFullStateEventContent::RoomPinnedEvents(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the pinned events for the room (redacted)"); + }, + AnyFullStateEventContent::RoomPowerLevels(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the power levels for the room (redacted)"); + }, + AnyFullStateEventContent::RoomServerAcl(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the room's server ACLs (redacted)"); + }, + AnyFullStateEventContent::RoomThirdPartyInvite(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* sent a third-party invite (redacted)"); + }, + AnyFullStateEventContent::RoomTombstone(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* upgraded the room (redacted)"); + }, + AnyFullStateEventContent::RoomTopic(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* updated the room topic (redacted)"); + }, + AnyFullStateEventContent::SpaceChild(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* added a space child (redacted)"); + }, + AnyFullStateEventContent::SpaceParent(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* added a parent space (redacted)"); + }, + AnyFullStateEventContent::BeaconInfo(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("* shared beacon information (redacted)"); + }, + AnyFullStateEventContent::CallMember(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("Call membership changed"); + }, + AnyFullStateEventContent::MemberHints(FullStateEventContent::Redacted(_)) => { + return Cow::Borrowed("Member hints changed"); + }, + + // Handle unknown events: + e => { + format!("* sent an unknown state event: {:?}", e.event_type()) + }, + }; + + return Cow::Owned(event); +} + +pub fn html_state(ev: &AnySyncStateEvent) -> StyleTree { + let children = match ev.content() { + AnyFullStateEventContent::PolicyRuleRoom(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = StyleTreeNode::Text("* updated the room policy rule for ".into()); + let entity = bold(format!("{:?}", content.0.entity)); + let middle = StyleTreeNode::Text(" to ".into()); + let rec = + StyleTreeNode::Text(format!("{:?}", content.0.recommendation.as_str()).into()); + let mut cs = vec![prefix, entity, middle, rec]; + + if !content.0.reason.is_empty() { + let reason = format!(" (reason: {})", content.0.reason); + cs.push(StyleTreeNode::Text(reason.into())); + } + + cs + }, + AnyFullStateEventContent::PolicyRuleServer(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = StyleTreeNode::Text("* updated the server policy rule for ".into()); + let entity = bold(format!("{:?}", content.0.entity)); + let middle = StyleTreeNode::Text(" to ".into()); + let rec = + StyleTreeNode::Text(format!("{:?}", content.0.recommendation.as_str()).into()); + let mut cs = vec![prefix, entity, middle, rec]; + + if !content.0.reason.is_empty() { + let reason = format!(" (reason: {})", content.0.reason); + cs.push(StyleTreeNode::Text(reason.into())); + } + + cs + }, + AnyFullStateEventContent::PolicyRuleUser(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = StyleTreeNode::Text("* updated the user policy rule for ".into()); + let entity = bold(format!("{:?}", content.0.entity)); + let middle = StyleTreeNode::Text(" to ".into()); + let rec = + StyleTreeNode::Text(format!("{:?}", content.0.recommendation.as_str()).into()); + let mut cs = vec![prefix, entity, middle, rec]; + + if !content.0.reason.is_empty() { + let reason = format!(" (reason: {})", content.0.reason); + cs.push(StyleTreeNode::Text(reason.into())); + } + + cs + }, + AnyFullStateEventContent::RoomAliases(FullStateEventContent::Original { + content, .. + }) => { + let prefix = StyleTreeNode::Text("* set the room aliases to: ".into()); + let mut cs = vec![prefix]; + + for (i, alias) in content.aliases.iter().enumerate() { + if i != 0 { + cs.push(StyleTreeNode::Text(", ".into())); + } + + cs.push(StyleTreeNode::RoomAlias(alias.clone())); + } + + cs + }, + AnyFullStateEventContent::RoomAvatar(FullStateEventContent::Original { + content, + prev_content, + }) => { + let prev_url = prev_content.as_ref().and_then(|p| p.url.as_ref()); + + let node = match (prev_url, content.url) { + (None, Some(_)) => StyleTreeNode::Text("* added a room avatar".into()), + (Some(old), Some(new)) => { + if old != &new { + StyleTreeNode::Text("* replaced the room avatar".into()) + } else { + StyleTreeNode::Text("* updated the room avatar state".into()) + } + }, + (Some(_), None) => StyleTreeNode::Text("* removed the room avatar".into()), + (None, None) => StyleTreeNode::Text("* updated the room avatar state".into()), + }; + + vec![node] + }, + AnyFullStateEventContent::RoomCanonicalAlias(FullStateEventContent::Original { + content, + .. + }) => { + if let Some(canon) = content.alias.as_ref() { + let canon = bold(canon.to_string()); + let prefix = + StyleTreeNode::Text("* updated the canonical alias for the room to: ".into()); + vec![prefix, canon] + } else { + vec![StyleTreeNode::Text( + "* removed the canonical alias for the room".into(), + )] + } + }, + AnyFullStateEventContent::RoomCreate(FullStateEventContent::Original { + content, .. + }) => { + if content.federate { + vec![StyleTreeNode::Text("* created a federated room".into())] + } else { + vec![StyleTreeNode::Text("* created a non-federated room".into())] + } + }, + AnyFullStateEventContent::RoomEncryption(FullStateEventContent::Original { .. }) => { + vec![StyleTreeNode::Text( + "* updated the encryption settings for the room".into(), + )] + }, + AnyFullStateEventContent::RoomGuestAccess(FullStateEventContent::Original { + content, + .. + }) => { + let access = bold(format!("{:?}", content.guest_access.as_str())); + let prefix = StyleTreeNode::Text("* set guest access for the room to ".into()); + vec![prefix, access] + }, + AnyFullStateEventContent::RoomHistoryVisibility(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = + StyleTreeNode::Text("* updated history visibility for the room to ".into()); + let vis = bold(format!("{:?}", content.history_visibility.as_str())); + vec![prefix, vis] + }, + AnyFullStateEventContent::RoomJoinRules(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = StyleTreeNode::Text("* update the join rules for the room to ".into()); + let rule = bold(format!("{:?}", content.join_rule.as_str())); + vec![prefix, rule] + }, + AnyFullStateEventContent::RoomMember(FullStateEventContent::Original { + content, + prev_content, + }) => { + let Ok(state_key) = UserId::parse(ev.state_key()) else { + let prefix = + StyleTreeNode::Text("* failed to calculate membership change for ".into()); + let user_id = bold(format!("{:?}", ev.state_key())); + let children = vec![prefix, user_id]; + + return StyleTree { children }; + }; + + let prev_details = prev_content.as_ref().map(|p| p.details()); + let change = content.membership_change(prev_details, ev.sender(), &state_key); + let user_id = StyleTreeNode::UserId(state_key); + + match change { + MembershipChange::None => { + let prefix = StyleTreeNode::Text("* did nothing to ".into()); + vec![prefix, user_id] + }, + MembershipChange::Error => { + let prefix = + StyleTreeNode::Text("* failed to calculate membership change to ".into()); + vec![prefix, user_id] + }, + MembershipChange::Joined => { + vec![StyleTreeNode::Text("* joined the room".into())] + }, + MembershipChange::Left => { + vec![StyleTreeNode::Text("* left the room".into())] + }, + MembershipChange::Banned => { + let prefix = StyleTreeNode::Text("* banned ".into()); + let suffix = StyleTreeNode::Text(" from the room".into()); + vec![prefix, user_id, suffix] + }, + MembershipChange::Unbanned => { + let prefix = StyleTreeNode::Text("* unbanned ".into()); + let suffix = StyleTreeNode::Text(" from the room".into()); + vec![prefix, user_id, suffix] + }, + MembershipChange::Kicked => { + let prefix = StyleTreeNode::Text("* kicked ".into()); + let suffix = StyleTreeNode::Text(" from the room".into()); + vec![prefix, user_id, suffix] + }, + MembershipChange::Invited => { + let prefix = StyleTreeNode::Text("* invited ".into()); + let suffix = StyleTreeNode::Text(" to the room".into()); + vec![prefix, user_id, suffix] + }, + MembershipChange::KickedAndBanned => { + let prefix = StyleTreeNode::Text("* kicked and banned ".into()); + let suffix = StyleTreeNode::Text(" from the room".into()); + vec![prefix, user_id, suffix] + }, + MembershipChange::InvitationAccepted => { + vec![StyleTreeNode::Text( + "* accepted an invitation to join the room".into(), + )] + }, + MembershipChange::InvitationRejected => { + vec![StyleTreeNode::Text( + "* rejected an invitation to join the room".into(), + )] + }, + MembershipChange::InvitationRevoked => { + let prefix = StyleTreeNode::Text("* revoked an invitation for ".into()); + let suffix = StyleTreeNode::Text(" to join the room".into()); + vec![prefix, user_id, suffix] + }, + MembershipChange::Knocked => { + vec![StyleTreeNode::Text("* would like to join the room".into())] + }, + MembershipChange::KnockAccepted => { + let prefix = StyleTreeNode::Text("* accepted the room knock from ".into()); + vec![prefix, user_id] + }, + MembershipChange::KnockRetracted => { + vec![StyleTreeNode::Text("* retracted their room knock".into())] + }, + MembershipChange::KnockDenied => { + let prefix = StyleTreeNode::Text("* rejected the room knock from ".into()); + vec![prefix, user_id] + }, + MembershipChange::ProfileChanged { displayname_change, avatar_url_change } => { + let m = match (displayname_change, avatar_url_change) { + (Some(change), avatar_change) => { + let mut m = match (change.old, change.new) { + (None, Some(new)) => { + format!("* set their display name to {:?}", new) + }, + (Some(old), Some(new)) => { + format!( + "* changed their display name from {:?} to {:?}", + old, new + ) + }, + (Some(_), None) => "* unset their display name".to_string(), + (None, None) => { + "* made an unknown change to their display name".to_string() + }, + }; + + if avatar_change.is_some() { + m.push_str(" and changed their user avatar"); + } + + Cow::Owned(m) + }, + (None, Some(change)) => { + match (change.old, change.new) { + (None, Some(_)) => Cow::Borrowed("* added a user avatar"), + (Some(_), Some(_)) => Cow::Borrowed("* changed their user avatar"), + (Some(_), None) => Cow::Borrowed("* removed their user avatar"), + (None, None) => { + Cow::Borrowed("* made an unknown change to their user avatar") + }, + } + }, + (None, None) => Cow::Borrowed("* changed their user profile"), + }; + + vec![StyleTreeNode::Text(m)] + }, + ev => { + let prefix = + StyleTreeNode::Text("* made an unknown membership change to ".into()); + let suffix = StyleTreeNode::Text(format!(": {:?}", ev).into()); + vec![prefix, user_id, suffix] + }, + } + }, + AnyFullStateEventContent::RoomName(FullStateEventContent::Original { content, .. }) => { + let prefix = StyleTreeNode::Text("* updated the room name to ".into()); + let name = bold(format!("{:?}", content.name)); + vec![prefix, name] + }, + AnyFullStateEventContent::RoomPinnedEvents(FullStateEventContent::Original { .. }) => { + vec![StyleTreeNode::Text( + "* updated the pinned events for the room".into(), + )] + }, + AnyFullStateEventContent::RoomPowerLevels(FullStateEventContent::Original { .. }) => { + vec![StyleTreeNode::Text( + "* updated the power levels for the room".into(), + )] + }, + AnyFullStateEventContent::RoomServerAcl(FullStateEventContent::Original { .. }) => { + vec![StyleTreeNode::Text( + "* updated the room's server ACLs".into(), + )] + }, + AnyFullStateEventContent::RoomThirdPartyInvite(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = StyleTreeNode::Text("* sent a third-party invite to ".into()); + let name = bold(format!("{:?}", content.display_name)); + vec![prefix, name] + }, + AnyFullStateEventContent::RoomTombstone(FullStateEventContent::Original { + content, + .. + }) => { + let prefix = StyleTreeNode::Text("* upgraded the room; replacement room is ".into()); + let room = StyleTreeNode::RoomId(content.replacement_room.clone()); + vec![prefix, room] + }, + AnyFullStateEventContent::RoomTopic(FullStateEventContent::Original { + content, .. + }) => { + let prefix = StyleTreeNode::Text("* set the room topic to ".into()); + let topic = bold(format!("{:?}", content.topic)); + vec![prefix, topic] + }, + AnyFullStateEventContent::SpaceChild(FullStateEventContent::Original { .. }) => { + let prefix = StyleTreeNode::Text("* added a space child: ".into()); + + let room_id = if let Ok(room_id) = OwnedRoomId::from_str(ev.state_key()) { + StyleTreeNode::RoomId(room_id) + } else { + bold(ev.state_key().to_string()) + }; + + vec![prefix, room_id] + }, + AnyFullStateEventContent::SpaceParent(FullStateEventContent::Original { + content, .. + }) => { + let prefix = if content.canonical { + StyleTreeNode::Text("* added a canonical parent space: ".into()) + } else { + StyleTreeNode::Text("* added a parent space: ".into()) + }; + + let room_id = if let Ok(room_id) = OwnedRoomId::from_str(ev.state_key()) { + StyleTreeNode::RoomId(room_id) + } else { + bold(ev.state_key().to_string()) + }; + + vec![prefix, room_id] + }, + AnyFullStateEventContent::BeaconInfo(FullStateEventContent::Original { .. }) => { + vec![StyleTreeNode::Text("* shared beacon information".into())] + }, + AnyFullStateEventContent::CallMember(FullStateEventContent::Original { .. }) => { + vec![StyleTreeNode::Text( + "* updated membership for room call".into(), + )] + }, + AnyFullStateEventContent::MemberHints(FullStateEventContent::Original { + content, .. + }) => { + let prefix = StyleTreeNode::Text( + "* updated the list of service members in the room hints: ".into(), + ); + let mut cs = vec![prefix]; + + for (i, member) in content.service_members.iter().enumerate() { + if i != 0 { + cs.push(StyleTreeNode::Text(", ".into())); + } + + cs.push(StyleTreeNode::UserId(member.clone())); + } + + cs + }, + + // Redacted variants of state events: + AnyFullStateEventContent::PolicyRuleRoom(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated a room policy rule (redacted)".into(), + )] + }, + AnyFullStateEventContent::PolicyRuleServer(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated a server policy rule (redacted)".into(), + )] + }, + AnyFullStateEventContent::PolicyRuleUser(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated a user policy rule (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomAliases(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the room aliases for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomAvatar(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the room avatar (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomCanonicalAlias(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the canonical alias for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomCreate(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text("* created the room (redacted)".into())] + }, + AnyFullStateEventContent::RoomEncryption(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the encryption settings for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomGuestAccess(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the guest access configuration for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomHistoryVisibility(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated history visilibity for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomJoinRules(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the join rules for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomMember(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the room membership (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomName(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the room name (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomPinnedEvents(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the pinned events for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomPowerLevels(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the power levels for the room (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomServerAcl(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the room's server ACLs (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomThirdPartyInvite(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* sent a third-party invite (redacted)".into(), + )] + }, + AnyFullStateEventContent::RoomTombstone(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text("* upgraded the room (redacted)".into())] + }, + AnyFullStateEventContent::RoomTopic(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* updated the room topic (redacted)".into(), + )] + }, + AnyFullStateEventContent::SpaceChild(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* added a space child (redacted)".into(), + )] + }, + AnyFullStateEventContent::SpaceParent(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* added a parent space (redacted)".into(), + )] + }, + AnyFullStateEventContent::BeaconInfo(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text( + "* shared beacon information (redacted)".into(), + )] + }, + AnyFullStateEventContent::CallMember(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text("Call membership changed".into())] + }, + AnyFullStateEventContent::MemberHints(FullStateEventContent::Redacted(_)) => { + vec![StyleTreeNode::Text("Member hints changed".into())] + }, + + // Handle unknown events: + e => { + let prefix = StyleTreeNode::Text("* sent an unknown state event: ".into()); + let event = bold(format!("{:?}", e.event_type())); + vec![prefix, event] + }, + }; + + StyleTree { children } +} diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index 45bd17e..0b83df6 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -380,6 +380,7 @@ impl ChatState { MessageEvent::EncryptedRedacted(ev) => ev.event_id.clone(), MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(), + MessageEvent::State(ev) => ev.event_id().to_owned(), MessageEvent::Redacted(_) => { let msg = "Cannot react to a redacted message"; let err = UIError::Failure(msg.into()); @@ -417,6 +418,7 @@ impl ChatState { MessageEvent::EncryptedRedacted(ev) => ev.event_id.clone(), MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(), + MessageEvent::State(ev) => ev.event_id().to_owned(), MessageEvent::Redacted(_) => { let msg = "Cannot redact already redacted message"; let err = UIError::Failure(msg.into()); @@ -464,6 +466,7 @@ impl ChatState { MessageEvent::EncryptedRedacted(ev) => ev.event_id.clone(), MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(), + MessageEvent::State(ev) => ev.event_id().to_owned(), MessageEvent::Redacted(_) => { let msg = "Cannot unreact to a redacted message"; let err = UIError::Failure(msg.into()); diff --git a/src/worker.rs b/src/worker.rs index 1ef633c..3e136cc 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -13,7 +13,6 @@ use std::time::{Duration, Instant}; use futures::{stream::FuturesUnordered, StreamExt}; use gethostname::gethostname; -use matrix_sdk::ruma::events::AnySyncTimelineEvent; use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}; use tokio::sync::Semaphore; use tokio::task::JoinHandle; @@ -60,6 +59,8 @@ use matrix_sdk::{ typing::SyncTypingEvent, AnyInitialStateEvent, AnyMessageLikeEvent, + AnySyncStateEvent, + AnyTimelineEvent, EmptyStateKey, InitialStateEvent, SyncEphemeralRoomEvent, @@ -115,8 +116,7 @@ const IAMB_DEVICE_NAME: &str = "iamb"; const IAMB_USER_AGENT: &str = "iamb"; const MIN_MSG_LOAD: u32 = 50; -type MessageFetchResult = - IambResult<(Option, Vec<(AnyMessageLikeEvent, Vec)>)>; +type MessageFetchResult = IambResult<(Option, Vec<(AnyTimelineEvent, Vec)>)>; fn initial_devname() -> String { format!("{} on {}", IAMB_DEVICE_NAME, gethostname().to_string_lossy()) @@ -294,10 +294,8 @@ async fn load_older_one( let mut msgs = vec![]; for ev in chunk.into_iter() { - let deserialized = ev.into_raw().deserialize().map_err(IambError::Serde)?; - let msg: AnyMessageLikeEvent = match deserialized { - AnySyncTimelineEvent::MessageLike(e) => e.into_full_event(room_id.to_owned()), - AnySyncTimelineEvent::State(_) => continue, + let Ok(msg) = ev.into_raw().deserialize() else { + continue; }; let event_id = msg.event_id(); @@ -312,6 +310,7 @@ async fn load_older_one( }, }; + let msg = msg.into_full_event(room_id.to_owned()); msgs.push((msg, receipts)); } @@ -343,10 +342,10 @@ fn load_insert( } match msg { - AnyMessageLikeEvent::RoomEncrypted(msg) => { + AnyTimelineEvent::MessageLike(AnyMessageLikeEvent::RoomEncrypted(msg)) => { info.insert_encrypted(msg); }, - AnyMessageLikeEvent::RoomMessage(msg) => { + AnyTimelineEvent::MessageLike(AnyMessageLikeEvent::RoomMessage(msg)) => { info.insert_with_preview( room_id.clone(), store.clone(), @@ -356,10 +355,15 @@ fn load_insert( client.media(), ); }, - AnyMessageLikeEvent::Reaction(ev) => { + AnyTimelineEvent::MessageLike(AnyMessageLikeEvent::Reaction(ev)) => { info.insert_reaction(ev); }, - _ => continue, + AnyTimelineEvent::MessageLike(_) => { + continue; + }, + AnyTimelineEvent::State(msg) => { + info.insert_any_state(msg.into()); + }, } } @@ -1055,6 +1059,18 @@ impl ClientWorker { }, ); + let _ = self.client.add_event_handler( + |ev: AnySyncStateEvent, room: MatrixRoom, store: Ctx| { + async move { + let room_id = room.room_id(); + let mut locked = store.lock().await; + + let info = locked.application.get_room_info(room_id.to_owned()); + info.insert_any_state(ev); + } + }, + ); + let _ = self.client.add_event_handler( |ev: OriginalSyncRoomRedactionEvent, room: MatrixRoom, From 9ed9400b67ffee3191c342b817781cbb679e0d8d Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Sat, 31 May 2025 09:29:49 -0700 Subject: [PATCH 34/56] Support automatically toggling room focus (#337) --- src/base.rs | 7 ++ src/commands.rs | 12 +-- src/windows/room/chat.rs | 175 ++++++++++++++++++++++++++++++++- src/windows/room/scrollback.rs | 26 +++-- 4 files changed, 203 insertions(+), 17 deletions(-) diff --git a/src/base.rs b/src/base.rs index b8b0978..2660948 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1766,6 +1766,13 @@ impl RoomFocus { pub fn is_msgbar(&self) -> bool { matches!(self, RoomFocus::MessageBar) } + + pub fn toggle(&mut self) { + *self = match self { + RoomFocus::MessageBar => RoomFocus::Scrollback, + RoomFocus::Scrollback => RoomFocus::MessageBar, + }; + } } /// Identifiers used to track where a mark was placed. diff --git a/src/commands.rs b/src/commands.rs index fc111c8..2577bf4 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1141,18 +1141,18 @@ mod tests { let mut cmds = setup_commands(); let ctx = EditContext::default(); - let cmd = format!("room notify set mute"); - let res = cmds.input_cmd(&cmd, ctx.clone()).unwrap(); + let cmd = "room notify set mute"; + let res = cmds.input_cmd(cmd, ctx.clone()).unwrap(); let act = RoomAction::Set(RoomField::NotificationMode, "mute".into()); assert_eq!(res, vec![(act.into(), ctx.clone())]); - let cmd = format!("room notify unset"); - let res = cmds.input_cmd(&cmd, ctx.clone()).unwrap(); + let cmd = "room notify unset"; + let res = cmds.input_cmd(cmd, ctx.clone()).unwrap(); let act = RoomAction::Unset(RoomField::NotificationMode); assert_eq!(res, vec![(act.into(), ctx.clone())]); - let cmd = format!("room notify show"); - let res = cmds.input_cmd(&cmd, ctx.clone()).unwrap(); + let cmd = "room notify show"; + let res = cmds.input_cmd(cmd, ctx.clone()).unwrap(); let act = RoomAction::Show(RoomField::NotificationMode); assert_eq!(res, vec![(act.into(), ctx.clone())]); } diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index 0b83df6..cb584f4 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -638,10 +638,7 @@ impl ChatState { } pub fn focus_toggle(&mut self) { - self.focus = match self.focus { - RoomFocus::Scrollback => RoomFocus::MessageBar, - RoomFocus::MessageBar => RoomFocus::Scrollback, - }; + self.focus.toggle(); } pub fn room(&self) -> &MatrixRoom { @@ -652,6 +649,14 @@ impl ChatState { &self.room_id } + pub fn auto_toggle_focus( + &mut self, + act: &EditorAction, + ctx: &ProgramContext, + ) -> Option { + auto_toggle_focus(&mut self.focus, act, ctx, &self.scrollback, &mut self.tbox) + } + pub fn typing_notice( &self, act: &EditorAction, @@ -754,8 +759,15 @@ impl Editable for ChatState { ctx: &ProgramContext, store: &mut ProgramStore, ) -> EditResult { + // Check whether we should automatically switch between the message bar + // or message scrollback, and use an adjusted action if we do so. + let adjusted = self.auto_toggle_focus(act, ctx); + let act = adjusted.as_ref().unwrap_or(act); + + // Send typing notice if needed. self.typing_notice(act, ctx, store); + // And now we can finally run the editor command. match delegate!(self, w => w.editor_command(act, ctx, store)) { res @ Ok(_) => res, Err(EditError::WrongBuffer(IambBufferId::Room(room_id, thread, focus))) @@ -993,3 +1005,158 @@ fn cmd(open_command: &Vec) -> Option { } None } + +pub fn auto_toggle_focus( + focus: &mut RoomFocus, + act: &EditorAction, + ctx: &ProgramContext, + scrollback: &ScrollbackState, + tbox: &mut TextBoxState, +) -> Option { + let is_insert = ctx.get_insert_style().is_some(); + + match (focus, act) { + (f @ RoomFocus::Scrollback, _) if is_insert => { + // Insert mode commands should switch focus. + f.toggle(); + None + }, + (f @ RoomFocus::Scrollback, EditorAction::InsertText(_)) => { + // Pasting or otherwise inserting text should switch. + f.toggle(); + None + }, + ( + f @ RoomFocus::Scrollback, + EditorAction::Edit( + op, + EditTarget::Motion(mov @ MoveType::Line(MoveDir1D::Next), count), + ), + ) if ctx.resolve(op).is_motion() => { + let count = ctx.resolve(count); + + if count > 0 && scrollback.is_latest() { + // Trying to move down a line when already at the end of room history should + // switch. + f.toggle(); + + // And decrement the count for the action. + let count = count.saturating_sub(1).into(); + let target = EditTarget::Motion(mov.clone(), count); + let dec = EditorAction::Edit(op.clone(), target); + + Some(dec) + } else { + None + } + }, + ( + f @ RoomFocus::MessageBar, + EditorAction::Edit( + op, + EditTarget::Motion(mov @ MoveType::Line(MoveDir1D::Previous), count), + ), + ) if !is_insert && ctx.resolve(op).is_motion() => { + let count = ctx.resolve(count); + + if count > 0 && tbox.get_cursor().y == 0 { + // Trying to move up a line when already at the top of the msgbar should + // switch as long as we're not in Insert mode. + f.toggle(); + + // And decrement the count for the action. + let count = count.saturating_sub(1).into(); + let target = EditTarget::Motion(mov.clone(), count); + let dec = EditorAction::Edit(op.clone(), target); + + Some(dec) + } else { + None + } + }, + (RoomFocus::Scrollback, _) | (RoomFocus::MessageBar, _) => { + // Do not switch. + None + }, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use modalkit::actions::{EditAction, InsertTextAction}; + + use crate::tests::{mock_store, TEST_ROOM1_ID}; + + macro_rules! move_line { + ($dir: expr, $count: expr) => { + EditorAction::Edit( + EditAction::Motion.into(), + EditTarget::Motion(MoveType::Line($dir), $count.into()), + ) + }; + } + + #[tokio::test] + async fn test_auto_focus() { + let mut store = mock_store().await; + let ctx = ProgramContext::default(); + + let room_id = TEST_ROOM1_ID.clone(); + let scrollback = ScrollbackState::new(room_id.clone(), None); + + let id = IambBufferId::Room(room_id, None, RoomFocus::MessageBar); + let ebuf = store.load_buffer(id); + let mut tbox = TextBoxState::new(ebuf); + + // Start out focused on the scrollback. + let mut focused = RoomFocus::Scrollback; + + // Inserting text toggles: + let act = EditorAction::InsertText(InsertTextAction::Type( + Char::from('a').into(), + MoveDir1D::Next, + 1.into(), + )); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::MessageBar); + assert!(res.is_none()); + + // Going down in message bar doesn't toggle: + let act = move_line!(MoveDir1D::Next, 1); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::MessageBar); + assert!(res.is_none()); + + // But going up will: + let act = move_line!(MoveDir1D::Previous, 1); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::Scrollback); + assert_eq!(res, Some(move_line!(MoveDir1D::Previous, 0))); + + // Going up in scrollback doesn't toggle: + let act = move_line!(MoveDir1D::Previous, 1); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::Scrollback); + assert_eq!(res, None); + + // And then go back down: + let act = move_line!(MoveDir1D::Next, 1); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::MessageBar); + assert_eq!(res, Some(move_line!(MoveDir1D::Next, 0))); + + // Go up 2 will go up 1 in scrollback: + let act = move_line!(MoveDir1D::Previous, 2); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::Scrollback); + assert_eq!(res, Some(move_line!(MoveDir1D::Previous, 1))); + + // Go down 3 will go down 2 in messagebar: + let act = move_line!(MoveDir1D::Next, 3); + let res = auto_toggle_focus(&mut focused, &act, &ctx, &scrollback, &mut tbox); + assert_eq!(focused, RoomFocus::MessageBar); + assert_eq!(res, Some(move_line!(MoveDir1D::Next, 2))); + } +} diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index 08ad84d..1566931 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -79,14 +79,20 @@ fn nth_key_before(pos: MessageKey, n: usize, thread: &Messages) -> MessageKey { } fn nth_before(pos: MessageKey, n: usize, thread: &Messages) -> MessageCursor { - nth_key_before(pos, n, thread).into() + let key = nth_key_before(pos, n, thread); + + if matches!(thread.last_key_value(), Some((last, _)) if &key == last) { + MessageCursor::latest() + } else { + MessageCursor::from(key) + } } -fn nth_key_after(pos: MessageKey, n: usize, thread: &Messages) -> MessageKey { +fn nth_key_after(pos: MessageKey, n: usize, thread: &Messages) -> Option { let mut end = &pos; - let iter = thread.range(&pos..).enumerate(); + let mut iter = thread.range(&pos..).enumerate(); - for (i, (key, _)) in iter { + for (i, (key, _)) in iter.by_ref() { end = key; if i >= n { @@ -94,11 +100,12 @@ fn nth_key_after(pos: MessageKey, n: usize, thread: &Messages) -> MessageKey { } } - end.clone() + // Avoid returning the key if it's at the end. + iter.next().map(|_| end.clone()) } fn nth_after(pos: MessageKey, n: usize, thread: &Messages) -> MessageCursor { - nth_key_after(pos, n, thread).into() + nth_key_after(pos, n, thread).map(MessageCursor::from).unwrap_or_default() } fn prevmsg<'a>(key: &MessageKey, thread: &'a Messages) -> Option<&'a Message> { @@ -150,6 +157,10 @@ impl ScrollbackState { } } + pub fn is_latest(&self) -> bool { + self.cursor.timestamp.is_none() + } + pub fn goto_latest(&mut self) { self.cursor = MessageCursor::latest(); } @@ -1524,8 +1535,9 @@ mod tests { scrollback.edit(&EditAction::Motion, &next(1), &ctx, &mut store).unwrap(); assert_eq!(scrollback.cursor, MSG5_KEY.clone().into()); + // And one more becomes "latest" cursor: scrollback.edit(&EditAction::Motion, &next(1), &ctx, &mut store).unwrap(); - assert_eq!(scrollback.cursor, MSG1_KEY.clone().into()); + assert_eq!(scrollback.cursor, MessageCursor::latest()); } #[tokio::test] From ba7d0392d8df2b029c5def6ae63319bb2e5d88fe Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Sat, 31 May 2025 12:52:15 -0700 Subject: [PATCH 35/56] Do proper Unicode collation on room names (#440) --- Cargo.lock | 40 ++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/base.rs | 4 +++ src/config.rs | 6 ++--- src/windows/mod.rs | 52 ++++++++++++++++++++++++++------------- src/windows/room/space.rs | 3 ++- 6 files changed, 85 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c85ac7..3fed98d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -579,6 +579,15 @@ version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit_field" version = "0.10.2" @@ -674,6 +683,17 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "built" version = "0.7.7" @@ -1619,6 +1639,19 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "feruca" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06eccaab9dc53ad4bffb4ed748baf5c1f9475d5e9cac35e1b8eac69dac56899e" +dependencies = [ + "bincode", + "bstr", + "once_cell", + "rustc-hash", + "unicode-canonical-combining-class", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -2198,6 +2231,7 @@ dependencies = [ "dirs", "edit", "emojis", + "feruca", "futures", "gethostname", "html5ever", @@ -5713,6 +5747,12 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +[[package]] +name = "unicode-canonical-combining-class" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41c99d5174052d02ce765418e826597a1be18f32c114e35d9e22f92390239561" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index 24bbc6f..1ac3bf1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,6 +34,7 @@ clap = {version = "~4.3", features = ["derive"]} css-color-parser = "0.1.2" dirs = "4.0.0" emojis = "0.5" +feruca = "0.10.1" futures = "0.3" gethostname = "0.4.1" html5ever = "0.26.0" diff --git a/src/base.rs b/src/base.rs index 2660948..362a7c0 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1486,6 +1486,9 @@ pub struct ChatStore { /// Whether the application is currently focused pub focused: bool, + + /// Collator for locale-aware text sorting. + pub collator: feruca::Collator, } impl ChatStore { @@ -1500,6 +1503,7 @@ impl ChatStore { cmds: crate::commands::setup_commands(), emojis: emoji_map(), + collator: Default::default(), names: Default::default(), rooms: Default::default(), presences: Default::default(), diff --git a/src/config.rs b/src/config.rs index fb3d022..b1352cb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,7 @@ //! # Logic for loading and validating application configuration use std::borrow::Cow; use std::collections::hash_map::DefaultHasher; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use std::fmt; use std::fs::File; use std::hash::{Hash, Hasher}; @@ -105,7 +105,7 @@ fn validate_profile_name(name: &str) -> bool { name.chars().all(is_profile_char) } -fn validate_profile_names(names: &HashMap) { +fn validate_profile_names(names: &BTreeMap) { for name in names.keys() { if validate_profile_name(name.as_str()) { continue; @@ -787,7 +787,7 @@ pub struct ProfileConfig { #[derive(Clone, Deserialize)] pub struct IambConfig { - pub profiles: HashMap, + pub profiles: BTreeMap, pub default_profile: Option, pub settings: Option, pub dirs: Option, diff --git a/src/windows/mod.rs b/src/windows/mod.rs index 0513bc8..1228781 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -82,6 +82,7 @@ use crate::base::{ use self::{room::RoomState, welcome::WelcomeState}; use crate::message::MessageTimeStamp; +use feruca::Collator; pub mod room; pub mod welcome; @@ -170,7 +171,12 @@ fn user_cmp(a: &MemberItem, b: &MemberItem, field: &SortFieldUser) -> Ordering { } } -fn room_cmp(a: &T, b: &T, field: &SortFieldRoom) -> Ordering { +fn room_cmp( + a: &T, + b: &T, + field: &SortFieldRoom, + collator: &mut Collator, +) -> Ordering { match field { SortFieldRoom::Favorite => { let fava = a.has_tag(TagName::Favorite); @@ -186,7 +192,7 @@ fn room_cmp(a: &T, b: &T, field: &SortFieldRoom) -> Ordering { // If a has LowPriority and b doesn't, it should sort later in room list. lowa.cmp(&lowb) }, - SortFieldRoom::Name => a.name().cmp(b.name()), + SortFieldRoom::Name => collator.collate(a.name(), b.name()), SortFieldRoom::Alias => some_cmp(a.alias(), b.alias(), Ord::cmp), SortFieldRoom::RoomId => a.room_id().cmp(b.room_id()), SortFieldRoom::Unread => { @@ -209,9 +215,10 @@ fn room_fields_cmp( a: &T, b: &T, fields: &[SortColumn], + collator: &mut Collator, ) -> Ordering { for SortColumn(field, order) in fields { - match (room_cmp(a, b, field), order) { + match (room_cmp(a, b, field, collator), order) { (Ordering::Equal, _) => continue, (o, SortOrder::Ascending) => return o, (o, SortOrder::Descending) => return o.reverse(), @@ -219,7 +226,7 @@ fn room_fields_cmp( } // Break ties on ascending room id. - room_cmp(a, b, &SortFieldRoom::RoomId) + room_cmp(a, b, &SortFieldRoom::RoomId, collator) } fn user_fields_cmp( @@ -516,7 +523,8 @@ impl WindowOps for IambWindow { .map(|room_info| DirectItem::new(room_info, store)) .collect::>(); let fields = &store.application.settings.tunables.sort.dms; - items.sort_by(|a, b| room_fields_cmp(a, b, fields)); + let collator = &mut store.application.collator; + items.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); state.set(items); @@ -561,7 +569,8 @@ impl WindowOps for IambWindow { .map(|room_info| RoomItem::new(room_info, store)) .collect::>(); let fields = &store.application.settings.tunables.sort.rooms; - items.sort_by(|a, b| room_fields_cmp(a, b, fields)); + let collator = &mut store.application.collator; + items.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); state.set(items); @@ -592,7 +601,8 @@ impl WindowOps for IambWindow { items.extend(dms); let fields = &store.application.settings.tunables.sort.chats; - items.sort_by(|a, b| room_fields_cmp(a, b, fields)); + let collator = &mut store.application.collator; + items.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); state.set(items); @@ -625,7 +635,8 @@ impl WindowOps for IambWindow { items.extend(dms); let fields = &store.application.settings.tunables.sort.chats; - items.sort_by(|a, b| room_fields_cmp(a, b, fields)); + let collator = &mut store.application.collator; + items.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); state.set(items); @@ -645,7 +656,8 @@ impl WindowOps for IambWindow { .map(|room| SpaceItem::new(room, store)) .collect::>(); let fields = &store.application.settings.tunables.sort.spaces; - items.sort_by(|a, b| room_fields_cmp(a, b, fields)); + let collator = &mut store.application.collator; + items.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); state.set(items); @@ -1627,6 +1639,8 @@ mod tests { #[test] fn test_sort_rooms() { + let mut collator = Collator::default(); + let collator = &mut collator; let server = server_name!("example.com"); let room1 = TestRoomItem { @@ -1659,13 +1673,13 @@ mod tests { // Sort by Name ascending. let mut rooms = vec![&room1, &room2, &room3]; let fields = &[SortColumn(SortFieldRoom::Name, SortOrder::Ascending)]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room3, &room2, &room1]); // Sort by Name descending. let mut rooms = vec![&room1, &room2, &room3]; let fields = &[SortColumn(SortFieldRoom::Name, SortOrder::Descending)]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room1, &room2, &room3]); // Sort by Favorite and Alias before Name to show order matters. @@ -1675,7 +1689,7 @@ mod tests { SortColumn(SortFieldRoom::Alias, SortOrder::Ascending), SortColumn(SortFieldRoom::Name, SortOrder::Ascending), ]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room1, &room2, &room3]); // Now flip order of Favorite with Descending @@ -1685,12 +1699,14 @@ mod tests { SortColumn(SortFieldRoom::Alias, SortOrder::Ascending), SortColumn(SortFieldRoom::Name, SortOrder::Ascending), ]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room2, &room3, &room1]); } #[test] fn test_sort_room_recents() { + let mut collator = Collator::default(); + let collator = &mut collator; let server = server_name!("example.com"); let room1 = TestRoomItem { @@ -1729,18 +1745,20 @@ mod tests { // Sort by Recent ascending. let mut rooms = vec![&room1, &room2, &room3]; let fields = &[SortColumn(SortFieldRoom::Recent, SortOrder::Ascending)]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room2, &room3, &room1]); // Sort by Recent descending. let mut rooms = vec![&room1, &room2, &room3]; let fields = &[SortColumn(SortFieldRoom::Recent, SortOrder::Descending)]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room1, &room3, &room2]); } #[test] fn test_sort_room_invites() { + let mut collator = Collator::default(); + let collator = &mut collator; let server = server_name!("example.com"); let room1 = TestRoomItem { @@ -1776,7 +1794,7 @@ mod tests { SortColumn(SortFieldRoom::Invite, SortOrder::Ascending), SortColumn(SortFieldRoom::Name, SortOrder::Ascending), ]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room3, &room1, &room2]); // Sort invites after @@ -1785,7 +1803,7 @@ mod tests { SortColumn(SortFieldRoom::Invite, SortOrder::Descending), SortColumn(SortFieldRoom::Name, SortOrder::Ascending), ]; - rooms.sort_by(|a, b| room_fields_cmp(a, b, fields)); + rooms.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); assert_eq!(rooms, vec![&room1, &room2, &room3]); } } diff --git a/src/windows/room/space.rs b/src/windows/room/space.rs index 5f59a13..912d313 100644 --- a/src/windows/room/space.rs +++ b/src/windows/room/space.rs @@ -214,7 +214,8 @@ impl StatefulWidget for Space<'_> { }) .collect::>(); let fields = &self.store.application.settings.tunables.sort.rooms; - items.sort_by(|a, b| room_fields_cmp(a, b, fields)); + let collator = &mut self.store.application.collator; + items.sort_by(|a, b| room_fields_cmp(a, b, fields, collator)); state.list.set(items); state.last_fetch = Some(Instant::now()); From c420c9dd65b9e95dd9163ffe1fc214c95fb04762 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Wed, 4 Jun 2025 19:36:21 -0700 Subject: [PATCH 36/56] Add configuration option for hiding state events (#447) --- src/config.rs | 4 ++++ src/tests.rs | 1 + src/worker.rs | 26 +++++++++++++++----------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/config.rs b/src/config.rs index b1352cb..4a11252 100644 --- a/src/config.rs +++ b/src/config.rs @@ -561,6 +561,7 @@ pub struct TunableValues { pub read_receipt_display: bool, pub request_timeout: u64, pub sort: SortValues, + pub state_event_display: bool, pub typing_notice_send: bool, pub typing_notice_display: bool, pub users: UserOverrides, @@ -586,6 +587,7 @@ pub struct Tunables { pub request_timeout: Option, #[serde(default)] pub sort: SortOverrides, + pub state_event_display: Option, pub typing_notice_send: Option, pub typing_notice_display: Option, pub users: Option, @@ -615,6 +617,7 @@ impl Tunables { read_receipt_display: self.read_receipt_display.or(other.read_receipt_display), request_timeout: self.request_timeout.or(other.request_timeout), sort: merge_sorts(self.sort, other.sort), + state_event_display: self.state_event_display.or(other.state_event_display), typing_notice_send: self.typing_notice_send.or(other.typing_notice_send), typing_notice_display: self.typing_notice_display.or(other.typing_notice_display), users: merge_maps(self.users, other.users), @@ -642,6 +645,7 @@ impl Tunables { read_receipt_display: self.read_receipt_display.unwrap_or(true), request_timeout: self.request_timeout.unwrap_or(DEFAULT_REQ_TIMEOUT), sort: self.sort.values(), + state_event_display: self.state_event_display.unwrap_or(true), typing_notice_send: self.typing_notice_send.unwrap_or(true), typing_notice_display: self.typing_notice_display.unwrap_or(true), users: self.users.unwrap_or_default(), diff --git a/src/tests.rs b/src/tests.rs index f8a3713..38a745c 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -177,6 +177,7 @@ pub fn mock_tunables() -> TunableValues { read_receipt_display: true, request_timeout: 120, sort: SortOverrides::default().values(), + state_event_display: true, typing_notice_send: true, typing_notice_display: true, users: vec![(TEST_USER5.clone(), UserDisplayTunables { diff --git a/src/worker.rs b/src/worker.rs index 3e136cc..3d08584 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -362,7 +362,9 @@ fn load_insert( continue; }, AnyTimelineEvent::State(msg) => { - info.insert_any_state(msg.into()); + if settings.tunables.state_event_display { + info.insert_any_state(msg.into()); + } }, } } @@ -1059,17 +1061,19 @@ impl ClientWorker { }, ); - let _ = self.client.add_event_handler( - |ev: AnySyncStateEvent, room: MatrixRoom, store: Ctx| { - async move { - let room_id = room.room_id(); - let mut locked = store.lock().await; + if self.settings.tunables.state_event_display { + let _ = self.client.add_event_handler( + |ev: AnySyncStateEvent, room: MatrixRoom, store: Ctx| { + async move { + let room_id = room.room_id(); + let mut locked = store.lock().await; - let info = locked.application.get_room_info(room_id.to_owned()); - info.insert_any_state(ev); - } - }, - ); + let info = locked.application.get_room_info(room_id.to_owned()); + info.insert_any_state(ev); + } + }, + ); + } let _ = self.client.add_event_handler( |ev: OriginalSyncRoomRedactionEvent, From a9cb5608f03ae864881ef5faf2362fe094f3d589 Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Thu, 5 Jun 2025 04:57:06 +0000 Subject: [PATCH 37/56] Document every client command in the manual page (#441) --- docs/iamb.1 | 61 ++++++++++++++++++++++++++++++++++++------------- src/commands.rs | 11 +++++---- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/docs/iamb.1 b/docs/iamb.1 index 3e31ce2..62deb4c 100644 --- a/docs/iamb.1 +++ b/docs/iamb.1 @@ -54,7 +54,7 @@ version and quit. View a list of joined rooms and direct messages. .It Sy ":dms" View a list of direct messages. -.It Sy ":logout" +.It Sy ":logout [user id]" Log out of .Nm . .It Sy ":rooms" @@ -63,6 +63,8 @@ View a list of joined rooms. View a list of joined spaces. .It Sy ":unreads" View a list of unread rooms. +.It Sy ":unreads clear" +Mark all rooms as read. .It Sy ":welcome" View the startup Welcome window. .El @@ -77,39 +79,56 @@ Import and decrypt keys from .Pa path . .It Sy ":verify" View a list of ongoing E2EE verifications. +.It Sy ":verify accept [key]" +Accept a verification request. +.It Sy ":verify cancel [key]" +Cancel an in-progress verification. +.It Sy ":verify confirm [key]" +Confirm an in-progress verification. +.It Sy ":verify mismatch [key]" +Reject an in-progress verification due to mismatched Emoji. +.It Sy ":verify request [user id]" +Request a new verification with the specified user. .El .Sh "MESSAGE COMMANDS" .Bl -tag -width Ds -.It Sy ":download" -Download an attachment from the selected message. +.It Sy ":download [path]" +Download an attachment from the selected message and save it to the optional path. +.It Sy ":open [path]" +Download and then open an attachment, or open a link in a message. .It Sy ":edit" Edit the selected message. .It Sy ":editor" Open an external .Ev $EDITOR to compose a message. -.It Sy ":open" -Download and then open an attachment, or open a link in a message. .It Sy ":react [shortcode]" React to the selected message with an Emoji. -.It Sy ":redact [reason]" -Redact the selected message. -.It Sy ":reply" -Reply to the selected message. -.It Sy ":unreads clear" -Mark all unread rooms as read. .It Sy ":unreact [shortcode]" Remove your reaction from the selected message. When no arguments are given, remove all of your reactions from the message. -.It Sy ":upload" +.It Sy ":redact [reason]" +Redact the selected message with the optional reason. +.It Sy ":reply" +Reply to the selected message. +.It Sy ":cancel" +Cancel the currently drafted message including replies. +.It Sy ":unreads clear" +Mark all unread rooms as read. +.It Sy ":upload [path]" Upload an attachment and send it to the currently selected room. .El .Sh "ROOM COMMANDS" .Bl -tag -width Ds -.It Sy ":create" -Create a new room. +.It Sy ":create [arguments]" +Create a new room. Arguments can be +.Dq ++alias=[alias] , +.Dq ++public , +.Dq ++space , +and +.Dq ++encrypted . .It Sy ":invite accept" Accept an invitation to the currently focused room. .It Sy ":invite reject" @@ -117,7 +136,7 @@ Reject an invitation to the currently focused room. .It Sy ":invite send [user]" Send an invitation to a user to join the currently focused room. .It Sy ":join [room]" -Join a room. +Join a room or open it if you are already joined. .It Sy ":leave" Leave the currently focused room. .It Sy ":members" @@ -126,6 +145,10 @@ View a list of members of the currently focused room. Set the name of the currently focused room. .It Sy ":room name unset" Unset the name of the currently focused room. +.It Sy ":room dm set" +Mark the currently focused room as a direct message. +.It Sy ":room dm unset" +Mark the currently focused room as a normal room. .It Sy ":room notify set [level]" Set a notification level for the currently focused room. Valid levels are @@ -153,6 +176,8 @@ Remove a tag from the currently focused room. Set the topic of the currently focused room. .It Sy ":room topic unset" Unset the topic of the currently focused room. +.It Sy ":room topic show" +Show the topic of the currently focused room. .It Sy ":room alias set [alias]" Create and point the given alias to the room. .It Sy ":room alias unset [alias]" @@ -177,8 +202,12 @@ Kick a user from this room with an optional reason. .Sh "SPACE COMMANDS" .Bl -tag -width Ds -.It Sy ":space child set [room_id]" +.It Sy ":space child set [room_id] [arguments]" Add a room to the currently focused space. +.Dq ++suggested +marks the room as a suggested child. +.Dq ++order=[string] +specifies a string by which children are lexicographically ordered. .It Sy ":space child remove" Remove the selected room from the currently focused space. .El diff --git a/src/commands.rs b/src/commands.rs index 2577bf4..c70a2af 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -484,6 +484,10 @@ fn iamb_room(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult { ("tag", "set", Some(s)) => RoomAction::Set(RoomField::Tag(tag_name(s)?), "".into()).into(), ("tag", "set", None) => return Result::Err(CommandError::InvalidArgument), + // :room tag unset + ("tag", "unset", Some(s)) => RoomAction::Unset(RoomField::Tag(tag_name(s)?)).into(), + ("tag", "unset", None) => return Result::Err(CommandError::InvalidArgument), + // :room notify set ("notify", "set", Some(s)) => RoomAction::Set(RoomField::NotificationMode, s).into(), ("notify", "set", None) => return Result::Err(CommandError::InvalidArgument), @@ -496,10 +500,6 @@ fn iamb_room(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult { ("notify", "show", None) => RoomAction::Show(RoomField::NotificationMode).into(), ("notify", "show", Some(_)) => return Result::Err(CommandError::InvalidArgument), - // :room tag unset - ("tag", "unset", Some(s)) => RoomAction::Unset(RoomField::Tag(tag_name(s)?)).into(), - ("tag", "unset", None) => return Result::Err(CommandError::InvalidArgument), - // :room aliases show ("alias", "show", None) => RoomAction::Show(RoomField::Aliases).into(), ("alias", "show", Some(_)) => return Result::Err(CommandError::InvalidArgument), @@ -563,13 +563,14 @@ fn iamb_space(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult { }; let act: IambAction = match (field.as_str(), action.as_str()) { + // :space child remove ("child", "remove") => { if !(args.is_empty()) { return Err(CommandError::InvalidArgument); } SpaceAction::RemoveChild.into() }, - // :space child set + // :space child set ("child", "set") => { let mut order = None; let mut suggested = false; From f0de97a049297e93c1b2ad54c1934255c733c329 Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Thu, 5 Jun 2025 17:16:01 +0000 Subject: [PATCH 38/56] Remove image preview on message redaction (#448) --- src/message/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/message/mod.rs b/src/message/mod.rs index 3e6ae73..e53c874 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -1126,6 +1126,8 @@ impl Message { pub fn redact(&mut self, redaction: SyncRoomRedactionEvent, version: &RoomVersionId) { self.event.redact(redaction, version); self.html = None; + self.downloaded = false; + self.image_preview = ImageStatus::None; } } From f880358a83829fbd8191c0fe89bfee1b6b7ceba1 Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Fri, 6 Jun 2025 01:11:57 +0000 Subject: [PATCH 39/56] Implement receipts per thread (#438) --- src/base.rs | 109 ++++++++++++++++++++++++++------- src/config.rs | 2 +- src/main.rs | 2 +- src/message/mod.rs | 47 +++++++++----- src/tests.rs | 2 +- src/windows/room/scrollback.rs | 2 +- src/worker.rs | 60 +++++++++--------- 7 files changed, 152 insertions(+), 72 deletions(-) diff --git a/src/base.rs b/src/base.rs index 362a7c0..1cd3071 100644 --- a/src/base.rs +++ b/src/base.rs @@ -12,6 +12,7 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use emojis::Emoji; +use matrix_sdk::ruma::events::receipt::ReceiptThread; use ratatui::{ buffer::Buffer, layout::{Alignment, Rect}, @@ -869,7 +870,6 @@ impl UnreadInfo { } /// Information about room's the user's joined. -#[derive(Default)] pub struct RoomInfo { /// The display name for this room. pub name: Option, @@ -884,15 +884,13 @@ pub struct RoomInfo { messages: Messages, /// A map of read markers to display on different events. - pub event_receipts: HashMap>, - + pub event_receipts: HashMap>>, /// A map of the most recent read marker for each user. /// /// Every receipt in this map should also have an entry in [`event_receipts`](`Self::event_receipts`), /// however not every user has an entry. If a user's most recent receipt is /// older than the oldest loaded event, that user will not be included. - pub user_receipts: HashMap, - + pub user_receipts: HashMap>, /// A map of message identifiers to a map of reaction events. pub reactions: HashMap, @@ -918,6 +916,28 @@ pub struct RoomInfo { pub draw_last: Option, } +impl Default for RoomInfo { + fn default() -> Self { + Self { + messages: Messages::new(ReceiptThread::Main), + + name: Default::default(), + tags: Default::default(), + keys: Default::default(), + event_receipts: Default::default(), + user_receipts: Default::default(), + reactions: Default::default(), + threads: Default::default(), + fetching: Default::default(), + fetch_id: Default::default(), + fetch_last: Default::default(), + users_typing: Default::default(), + display_names: Default::default(), + draw_last: Default::default(), + } + } +} + impl RoomInfo { pub fn get_thread(&self, root: Option<&EventId>) -> Option<&Messages> { if let Some(thread_root) = root { @@ -929,7 +949,9 @@ impl RoomInfo { pub fn get_thread_mut(&mut self, root: Option) -> &mut Messages { if let Some(thread_root) = root { - self.threads.entry(thread_root).or_default() + self.threads + .entry(thread_root.clone()) + .or_insert_with(|| Messages::thread(thread_root)) } else { &mut self.messages } @@ -1069,7 +1091,9 @@ impl RoomInfo { }; let source = if let Some(thread) = thread { - self.threads.entry(thread.clone()).or_default() + self.threads + .entry(thread.clone()) + .or_insert_with(|| Messages::thread(thread.clone())) } else { &mut self.messages }; @@ -1108,13 +1132,20 @@ impl RoomInfo { /// Indicates whether this room has unread messages. pub fn unreads(&self, settings: &ApplicationSettings) -> UnreadInfo { let last_message = self.messages.last_key_value(); - let last_receipt = self.get_receipt(&settings.profile.user_id); + let last_receipt = self + .user_receipts + .get(&ReceiptThread::Main) + .and_then(|receipts| receipts.get(&settings.profile.user_id)); match (last_message, last_receipt) { (Some(((ts, recent), _)), Some(last_read)) => { UnreadInfo { unread: last_read != recent, latest: Some(*ts) } }, - (Some(((ts, _), _)), None) => UnreadInfo { unread: false, latest: Some(*ts) }, + (Some(((ts, _), _)), None) => { + // If we've never loaded/generated a room's receipt (example, + // a newly joined but never viewed room), show it as unread. + UnreadInfo { unread: true, latest: Some(*ts) } + }, (None, _) => UnreadInfo::default(), } } @@ -1142,7 +1173,10 @@ impl RoomInfo { let event_id = msg.event_id().to_owned(); let key = (msg.origin_server_ts().into(), event_id.clone()); - let replies = self.threads.entry(thread_root.clone()).or_default(); + let replies = self + .threads + .entry(thread_root.clone()) + .or_insert_with(|| Messages::thread(thread_root.clone())); let loc = EventLocation::Message(Some(thread_root), key.clone()); self.keys.insert(event_id, loc); replies.insert_message(key, msg); @@ -1205,37 +1239,70 @@ impl RoomInfo { self.fetch_last.is_some_and(|i| i.elapsed() < ROOM_FETCH_DEBOUNCE) } - fn clear_receipt(&mut self, user_id: &OwnedUserId) -> Option<()> { - let old_event_id = self.user_receipts.get(user_id)?; - let old_receipts = self.event_receipts.get_mut(old_event_id)?; + fn clear_receipt(&mut self, thread: &ReceiptThread, user_id: &OwnedUserId) -> Option<()> { + let old_event_id = + self.user_receipts.get(thread).and_then(|receipts| receipts.get(user_id))?; + let old_thread = self.event_receipts.get_mut(thread)?; + let old_receipts = old_thread.get_mut(old_event_id)?; old_receipts.remove(user_id); if old_receipts.is_empty() { - self.event_receipts.remove(old_event_id); + old_thread.remove(old_event_id); + } + if old_thread.is_empty() { + self.event_receipts.remove(thread); } None } - pub fn set_receipt(&mut self, user_id: OwnedUserId, event_id: OwnedEventId) { - self.clear_receipt(&user_id); + pub fn set_receipt( + &mut self, + thread: ReceiptThread, + user_id: OwnedUserId, + event_id: OwnedEventId, + ) { + self.clear_receipt(&thread, &user_id); self.event_receipts + .entry(thread.clone()) + .or_default() .entry(event_id.clone()) .or_default() .insert(user_id.clone()); - self.user_receipts.insert(user_id, event_id); + self.user_receipts.entry(thread).or_default().insert(user_id, event_id); } - pub fn fully_read(&mut self, user_id: OwnedUserId) { + pub fn fully_read(&mut self, user_id: &UserId) { let Some(((_, event_id), _)) = self.messages.last_key_value() else { return; }; - self.set_receipt(user_id, event_id.clone()); + self.set_receipt(ReceiptThread::Main, user_id.to_owned(), event_id.clone()); + + let newest = self + .threads + .iter() + .filter_map(|(thread_id, messages)| { + let thread = ReceiptThread::Thread(thread_id.to_owned()); + + messages + .last_key_value() + .map(|((_, event_id), _)| (thread, event_id.to_owned())) + }) + .collect::>(); + + for (thread, event_id) in newest.into_iter() { + self.set_receipt(thread, user_id.to_owned(), event_id.clone()); + } } - pub fn get_receipt(&self, user_id: &UserId) -> Option<&OwnedEventId> { - self.user_receipts.get(user_id) + pub fn receipts<'a>( + &'a self, + user_id: &'a UserId, + ) -> impl Iterator + 'a { + self.user_receipts + .iter() + .filter_map(move |(t, rs)| rs.get(user_id).map(|r| (t, r))) } fn get_typers(&self) -> &[OwnedUserId] { diff --git a/src/config.rs b/src/config.rs index 4a11252..b712c73 100644 --- a/src/config.rs +++ b/src/config.rs @@ -982,7 +982,7 @@ impl ApplicationSettings { Ok(()) } - pub fn get_user_char_span<'a>(&self, user_id: &'a UserId) -> Span<'a> { + pub fn get_user_char_span(&self, user_id: &UserId) -> Span { let (color, c) = self .tunables .users diff --git a/src/main.rs b/src/main.rs index 4ca4f96..9b8fe46 100644 --- a/src/main.rs +++ b/src/main.rs @@ -559,7 +559,7 @@ impl Application { for room_id in store.application.sync_info.chats() { if let Some(room) = store.application.rooms.get_mut(room_id) { - room.fully_read(user_id.clone()); + room.fully_read(user_id); } } diff --git a/src/message/mod.rs b/src/message/mod.rs index e53c874..4608303 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -2,7 +2,6 @@ use std::borrow::Cow; use std::cmp::{Ord, Ordering, PartialOrd}; use std::collections::hash_map::DefaultHasher; -use std::collections::hash_set; use std::collections::BTreeMap; use std::convert::{TryFrom, TryInto}; use std::fmt::{self, Display}; @@ -11,6 +10,7 @@ use std::ops::{Deref, DerefMut}; use chrono::{DateTime, Local as LocalTz}; use humansize::{format_size, DECIMAL}; +use matrix_sdk::ruma::events::receipt::ReceiptThread; use serde_json::json; use unicode_width::UnicodeWidthStr; @@ -77,8 +77,7 @@ type ProtocolPreview<'a> = (&'a Protocol, u16, u16); pub type MessageKey = (MessageTimeStamp, OwnedEventId); -#[derive(Default)] -pub struct Messages(BTreeMap); +pub struct Messages(BTreeMap, pub ReceiptThread); impl Deref for Messages { type Target = BTreeMap; @@ -95,6 +94,18 @@ impl DerefMut for Messages { } impl Messages { + pub fn new(thread: ReceiptThread) -> Self { + Self(Default::default(), thread) + } + + pub fn main() -> Self { + Self::new(ReceiptThread::Main) + } + + pub fn thread(root: OwnedEventId) -> Self { + Self::new(ReceiptThread::Thread(root)) + } + pub fn insert_message(&mut self, key: MessageKey, msg: impl Into) { let event_id = key.1.clone(); let msg = msg.into(); @@ -633,8 +644,8 @@ struct MessageFormatter<'a> { /// The date the message was sent. date: Option>, - /// Iterator over the users who have read up to this message. - read: Option>, + /// The users who have read up to this message. + read: Vec, } impl<'a> MessageFormatter<'a> { @@ -667,13 +678,11 @@ impl<'a> MessageFormatter<'a> { line.push(time); // Show read receipts. - let user_char = - |user: &'a OwnedUserId| -> Span<'a> { settings.get_user_char_span(user) }; - let mut read = self.read.iter_mut().flatten(); + let user_char = |user: OwnedUserId| -> Span { settings.get_user_char_span(&user) }; - let a = read.next().map(user_char).unwrap_or_else(|| Span::raw(" ")); - let b = read.next().map(user_char).unwrap_or_else(|| Span::raw(" ")); - let c = read.next().map(user_char).unwrap_or_else(|| Span::raw(" ")); + let a = self.read.pop().map(user_char).unwrap_or_else(|| Span::raw(" ")); + let b = self.read.pop().map(user_char).unwrap_or_else(|| Span::raw(" ")); + let c = self.read.pop().map(user_char).unwrap_or_else(|| Span::raw(" ")); line.push(Span::raw(" ")); line.push(c); @@ -944,7 +953,13 @@ impl Message { let fill = width - user_gutter - TIME_GUTTER - READ_GUTTER; let user = self.show_sender(prev, true, info, settings); let time = self.timestamp.show_time(); - let read = info.event_receipts.get(self.event.event_id()).map(|read| read.iter()); + let read = info + .event_receipts + .values() + .filter_map(|receipts| receipts.get(self.event.event_id())) + .flat_map(|read| read.iter()) + .map(|user_id| user_id.to_owned()) + .collect(); MessageFormatter { settings, cols, orig, fill, user, date, time, read } } else if user_gutter + TIME_GUTTER + MIN_MSG_LEN <= width { @@ -952,7 +967,7 @@ impl Message { let fill = width - user_gutter - TIME_GUTTER; let user = self.show_sender(prev, true, info, settings); let time = self.timestamp.show_time(); - let read = None; + let read = Vec::new(); MessageFormatter { settings, cols, orig, fill, user, date, time, read } } else if user_gutter + MIN_MSG_LEN <= width { @@ -960,7 +975,7 @@ impl Message { let fill = width - user_gutter; let user = self.show_sender(prev, true, info, settings); let time = None; - let read = None; + let read = Vec::new(); MessageFormatter { settings, cols, orig, fill, user, date, time, read } } else { @@ -968,7 +983,7 @@ impl Message { let fill = width.saturating_sub(2); let user = self.show_sender(prev, false, info, settings); let time = None; - let read = None; + let read = Vec::new(); MessageFormatter { settings, cols, orig, fill, user, date, time, read } } @@ -1281,7 +1296,7 @@ pub mod tests { assert_eq!(k6, &MSG1_KEY.clone()); // MessageCursor::latest() fails to convert for a room w/o messages. - let messages_empty = Messages::default(); + let messages_empty = Messages::new(ReceiptThread::Main); assert_eq!(mc6.to_key(&messages_empty), None); } diff --git a/src/tests.rs b/src/tests.rs index 38a745c..52cb859 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -137,7 +137,7 @@ pub fn mock_keys() -> HashMap { } pub fn mock_messages() -> Messages { - let mut messages = Messages::default(); + let mut messages = Messages::main(); messages.insert(MSG1_KEY.clone(), mock_message1()); messages.insert(MSG2_KEY.clone(), mock_message2()); diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index 1566931..3d8ec7f 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -1428,7 +1428,7 @@ impl StatefulWidget for Scrollback<'_> { { // If the cursor is at the last message, then update the read marker. if let Some((k, _)) = thread.last_key_value() { - info.set_receipt(settings.profile.user_id.clone(), k.1.clone()); + info.set_receipt(thread.1.clone(), settings.profile.user_id.clone(), k.1.clone()); } } diff --git a/src/worker.rs b/src/worker.rs index 3d08584..144c34c 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -210,7 +210,7 @@ async fn update_event_receipts(info: &mut RoomInfo, room: &MatrixRoom, event_id: }; for (user_id, _) in receipts { - info.set_receipt(user_id, event_id.to_owned()); + info.set_receipt(ReceiptThread::Main, user_id, event_id.to_owned()); } } @@ -300,7 +300,7 @@ async fn load_older_one( let event_id = msg.event_id(); let receipts = match room - .load_event_receipts(ReceiptType::Read, ReceiptThread::Unthreaded, event_id) + .load_event_receipts(ReceiptType::Read, ReceiptThread::Main, event_id) .await { Ok(receipts) => receipts.into_iter().map(|(u, _)| u).collect(), @@ -338,7 +338,7 @@ fn load_insert( let _ = presences.get_or_default(sender); for user_id in receipts { - info.set_receipt(user_id, msg.event_id().to_owned()); + info.set_receipt(ReceiptThread::Main, user_id, msg.event_id().to_owned()); } match msg { @@ -497,31 +497,32 @@ async fn refresh_rooms_forever(client: &Client, store: &AsyncProgramStore) { async fn send_receipts_forever(client: &Client, store: &AsyncProgramStore) { let mut interval = tokio::time::interval(Duration::from_secs(2)); - let mut sent = HashMap::::default(); + let mut sent: HashMap> = Default::default(); loop { interval.tick().await; let locked = store.lock().await; let user_id = &locked.application.settings.profile.user_id; - let updates = client - .joined_rooms() - .into_iter() - .filter_map(|room| { - let room_id = room.room_id().to_owned(); - let info = locked.application.rooms.get(&room_id)?; - let new_receipt = info.get_receipt(user_id)?; - let old_receipt = sent.get(&room_id); - if Some(new_receipt) != old_receipt { - Some((room_id, new_receipt.clone())) - } else { - None - } - }) - .collect::>(); + + let mut updates = Vec::new(); + for room in client.joined_rooms() { + let room_id = room.room_id(); + let Some(info) = locked.application.rooms.get(&room_id) else { + continue; + }; + + let changed = info.receipts(user_id).filter_map(|(thread, new_receipt)| { + let old_receipt = sent.get(room_id).and_then(|ts| ts.get(thread)); + let changed = Some(new_receipt) != old_receipt; + changed.then(|| (room_id.to_owned(), thread.to_owned(), new_receipt.to_owned())) + }); + + updates.extend(changed); + } drop(locked); - for (room_id, new_receipt) in updates { + for (room_id, thread, new_receipt) in updates { use matrix_sdk::ruma::api::client::receipt::create_receipt::v3::ReceiptType; let Some(room) = client.get_room(&room_id) else { @@ -529,15 +530,11 @@ async fn send_receipts_forever(client: &Client, store: &AsyncProgramStore) { }; match room - .send_single_receipt( - ReceiptType::Read, - ReceiptThread::Unthreaded, - new_receipt.clone(), - ) + .send_single_receipt(ReceiptType::Read, thread.to_owned(), new_receipt.clone()) .await { Ok(()) => { - sent.insert(room_id, new_receipt); + sent.entry(room_id).or_default().insert(thread, new_receipt); }, Err(e) => tracing::warn!(?room_id, "Failed to set read receipt: {e}"), } @@ -1050,11 +1047,12 @@ impl ClientWorker { let Some(receipts) = receipts.get(&ReceiptType::Read) else { continue; }; - for (user_id, _) in receipts - .iter() - .filter(|(_, rcpt)| rcpt.thread == ReceiptThread::Unthreaded) - { - info.set_receipt(user_id.to_owned(), event_id.clone()); + for (user_id, rcpt) in receipts.iter() { + info.set_receipt( + rcpt.thread.clone(), + user_id.to_owned(), + event_id.clone(), + ); } } } From 33d3407694c9dece0f3e59aa577eda98c9384ea1 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Thu, 5 Jun 2025 19:46:32 -0700 Subject: [PATCH 40/56] Apply user highlighting to display name changes (#449) --- src/message/html.rs | 6 +++++ src/message/state.rs | 54 +++++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/message/html.rs b/src/message/html.rs index 5ba9830..82aac65 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -284,6 +284,7 @@ pub enum StyleTreeNode { RoomAlias(OwnedRoomAliasId), RoomId(OwnedRoomId), UserId(OwnedUserId), + DisplayName(String, OwnedUserId), } impl StyleTreeNode { @@ -333,6 +334,7 @@ impl StyleTreeNode { StyleTreeNode::UserId(_) => {}, StyleTreeNode::RoomId(_) => {}, StyleTreeNode::RoomAlias(_) => {}, + StyleTreeNode::DisplayName(_, _) => {}, } } @@ -472,6 +474,10 @@ impl StyleTreeNode { let style = printer.settings().get_user_style(user_id); printer.push_str(user_id.as_str(), style); }, + StyleTreeNode::DisplayName(display_name, user_id) => { + let style = printer.settings().get_user_style(user_id); + printer.push_str(display_name.as_str(), style); + }, StyleTreeNode::RoomId(room_id) => { let bold = style.add_modifier(StyleModifier::BOLD); printer.push_str(room_id.as_str(), bold); diff --git a/src/message/state.rs b/src/message/state.rs index 8f19f0c..53885c4 100644 --- a/src/message/state.rs +++ b/src/message/state.rs @@ -242,10 +242,7 @@ pub fn body_cow_state(ev: &AnySyncStateEvent) -> Cow<'static, str> { format!("* set their display name to {:?}", new) }, (Some(old), Some(new)) => { - format!( - "* changed their display name from {:?} to {:?}", - old, new - ) + format!("* changed their display name from {old} to {new}") }, (Some(_), None) => "* unset their display name".to_string(), (None, None) => { @@ -600,7 +597,7 @@ pub fn html_state(ev: &AnySyncStateEvent) -> StyleTree { let prev_details = prev_content.as_ref().map(|p| p.details()); let change = content.membership_change(prev_details, ev.sender(), &state_key); - let user_id = StyleTreeNode::UserId(state_key); + let user_id = StyleTreeNode::UserId(state_key.clone()); match change { MembershipChange::None => { @@ -673,44 +670,59 @@ pub fn html_state(ev: &AnySyncStateEvent) -> StyleTree { vec![prefix, user_id] }, MembershipChange::ProfileChanged { displayname_change, avatar_url_change } => { - let m = match (displayname_change, avatar_url_change) { + match (displayname_change, avatar_url_change) { (Some(change), avatar_change) => { let mut m = match (change.old, change.new) { (None, Some(new)) => { - format!("* set their display name to {:?}", new) + vec![ + StyleTreeNode::Text("* set their display name to ".into()), + StyleTreeNode::DisplayName(new.into(), state_key), + ] }, (Some(old), Some(new)) => { - format!( - "* changed their display name from {:?} to {:?}", - old, new - ) + vec![ + StyleTreeNode::Text( + "* changed their display name from ".into(), + ), + StyleTreeNode::DisplayName(old.into(), state_key.clone()), + StyleTreeNode::Text(" to ".into()), + StyleTreeNode::DisplayName(new.into(), state_key), + ] + }, + (Some(_), None) => { + vec![StyleTreeNode::Text("* unset their display name".into())] }, - (Some(_), None) => "* unset their display name".to_string(), (None, None) => { - "* made an unknown change to their display name".to_string() + vec![StyleTreeNode::Text( + "* made an unknown change to their display name".into(), + )] }, }; if avatar_change.is_some() { - m.push_str(" and changed their user avatar"); + m.push(StyleTreeNode::Text( + " and changed their user avatar".into(), + )); } - Cow::Owned(m) + m }, (None, Some(change)) => { - match (change.old, change.new) { + let m = match (change.old, change.new) { (None, Some(_)) => Cow::Borrowed("* added a user avatar"), (Some(_), Some(_)) => Cow::Borrowed("* changed their user avatar"), (Some(_), None) => Cow::Borrowed("* removed their user avatar"), (None, None) => { Cow::Borrowed("* made an unknown change to their user avatar") }, - } - }, - (None, None) => Cow::Borrowed("* changed their user profile"), - }; + }; - vec![StyleTreeNode::Text(m)] + vec![StyleTreeNode::Text(m)] + }, + (None, None) => { + vec![StyleTreeNode::Text("* changed their user profile".into())] + }, + } }, ev => { let prefix = From 9e40b49e5ee761825bd07fc64e02531d1a389e69 Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Tue, 17 Jun 2025 01:30:07 +0000 Subject: [PATCH 41/56] Fix display of tabs in code blocks (#463) --- docs/iamb.5 | 4 ++++ src/config.rs | 4 ++++ src/message/html.rs | 21 ++++++++++++++++++--- src/message/printer.rs | 10 +++++++++- src/tests.rs | 1 + 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/docs/iamb.5 b/docs/iamb.5 index 26fc1b7..56b0b32 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -231,6 +231,10 @@ Possible values are Specify the width of the column where usernames are displayed in a room. Usernames that are too long are truncated. Defaults to 30. + +.It Sy tabstop +Number of spaces that a counts for. +Defaults to 4. .El .Ss Example 1: Avoid showing Emojis (useful for terminals w/o support) diff --git a/src/config.rs b/src/config.rs index b712c73..1438ed7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -574,6 +574,7 @@ pub struct TunableValues { pub image_preview: Option, pub user_gutter_width: usize, pub external_edit_file_suffix: String, + pub tabstop: usize, } #[derive(Clone, Default, Deserialize)] @@ -600,6 +601,7 @@ pub struct Tunables { pub image_preview: Option, pub user_gutter_width: Option, pub external_edit_file_suffix: Option, + pub tabstop: Option, } impl Tunables { @@ -632,6 +634,7 @@ impl Tunables { external_edit_file_suffix: self .external_edit_file_suffix .or(other.external_edit_file_suffix), + tabstop: self.tabstop.or(other.tabstop), } } @@ -660,6 +663,7 @@ impl Tunables { external_edit_file_suffix: self .external_edit_file_suffix .unwrap_or_else(|| ".md".to_string()), + tabstop: self.tabstop.unwrap_or(4), } } } diff --git a/src/message/html.rs b/src/message/html.rs index 82aac65..6d4c44e 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -1415,13 +1415,14 @@ pub mod tests { let s = concat!( "
",
             "fn hello() -> usize {\n",
+            " \t// weired\n",
             "    return 5;\n",
             "}\n",
             "
\n" ); let tree = parse_matrix_html(s); let text = tree.to_text(25, Style::default(), true, &settings); - assert_eq!(text.lines.len(), 5); + assert_eq!(text.lines.len(), 6); assert_eq!( text.lines[0], Line::from(vec![ @@ -1452,6 +1453,20 @@ pub mod tests { ); assert_eq!( text.lines[2], + Line::from(vec![ + Span::raw(line::VERTICAL), + Span::raw(" "), + Span::raw(" "), + Span::raw("/"), + Span::raw("/"), + Span::raw(" "), + Span::raw("weired"), + Span::raw(" "), + Span::raw(line::VERTICAL) + ]) + ); + assert_eq!( + text.lines[3], Line::from(vec![ Span::raw(line::VERTICAL), Span::raw(" "), @@ -1464,7 +1479,7 @@ pub mod tests { ]) ); assert_eq!( - text.lines[3], + text.lines[4], Line::from(vec![ Span::raw(line::VERTICAL), Span::raw("}"), @@ -1473,7 +1488,7 @@ pub mod tests { ]) ); assert_eq!( - text.lines[4], + text.lines[5], Line::from(vec![ Span::raw(line::BOTTOM_LEFT), Span::raw(line::HORIZONTAL.repeat(23)), diff --git a/src/message/printer.rs b/src/message/printer.rs index d2a2dd0..3418752 100644 --- a/src/message/printer.rs +++ b/src/message/printer.rs @@ -216,6 +216,8 @@ impl<'a> TextPrinter<'a> { return; } + let tabstop = self.settings().tunables.tabstop; + for mut word in UnicodeSegmentation::split_word_bounds(s) { if let "\n" | "\r\n" = word { if self.literal { @@ -232,11 +234,17 @@ impl<'a> TextPrinter<'a> { continue; } - let cow = if self.emoji_shortcodes() { + let mut cow = if self.emoji_shortcodes() { Cow::Owned(replace_emojis_in_str(word)) } else { Cow::Borrowed(word) }; + + if cow == "\t" { + let tablen = tabstop - (self.curr_width % tabstop); + cow = Cow::Owned(" ".repeat(tablen)); + } + let sw = UnicodeWidthStr::width(cow.as_ref()); if sw > self.width { diff --git a/src/tests.rs b/src/tests.rs index 52cb859..3e3f825 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -198,6 +198,7 @@ pub fn mock_tunables() -> TunableValues { }, image_preview: None, user_gutter_width: 30, + tabstop: 4, } } From d961fe3f7b01d16d1709459d45d1bf6104214651 Mon Sep 17 00:00:00 2001 From: Pavlo Rudy Date: Tue, 17 Jun 2025 04:31:01 +0300 Subject: [PATCH 42/56] Document `settings.state_event_display` in manual page (#455) --- docs/iamb.5 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/iamb.5 b/docs/iamb.5 index 56b0b32..0fdab5f 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -208,6 +208,9 @@ See .Sx "SORTING LISTS" for more details. +.It Sy state_event_display +Defines whether the state events like joined or left are shown. + .It Sy typing_notice_send Defines whether or not the typing state is sent. From d1b03880f3771d5c232b2cd8be1a29d3c7e30d9c Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Tue, 17 Jun 2025 01:35:38 +0000 Subject: [PATCH 43/56] Remove duplicate documentation from manpage (#454) --- docs/iamb.1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/iamb.1 b/docs/iamb.1 index 62deb4c..2487b92 100644 --- a/docs/iamb.1 +++ b/docs/iamb.1 @@ -114,8 +114,6 @@ Redact the selected message with the optional reason. Reply to the selected message. .It Sy ":cancel" Cancel the currently drafted message including replies. -.It Sy ":unreads clear" -Mark all unread rooms as read. .It Sy ":upload [path]" Upload an attachment and send it to the currently selected room. .El From 2e6c711644cd000e0256ad56974e6c8b33e8771b Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Sat, 21 Jun 2025 17:43:26 +0000 Subject: [PATCH 44/56] Make scrollback display stable with `typing_notice_display = false` (#469) --- src/base.rs | 4 +++- src/windows/room/scrollback.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/base.rs b/src/base.rs index 1cd3071..fdb7875 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1361,7 +1361,9 @@ impl RoomInfo { } if !settings.tunables.typing_notice_display { - return area; + // still keep one line blank, so `render_jump_to_recent` doesn't immediately hide the + // last line in scrollback + return Rect::new(area.x, area.y, area.width, area.height - 1); } let top = Rect::new(area.x, area.y, area.width, area.height - 1); diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index 3d8ec7f..53da0b7 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -1571,7 +1571,7 @@ mod tests { // MSG1: | XXXday, Month NN 20XX | // | @user1:example.com writhe | // |------------------------------------------------------------| - let area = Rect::new(0, 0, 60, 4); + let area = Rect::new(0, 0, 60, 5); let mut buffer = Buffer::empty(area); scrollback.draw(area, &mut buffer, true, &mut store); From ed9ee26854fff6ff65da7add17061fab37ec8ad5 Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Sat, 21 Jun 2025 18:22:21 +0000 Subject: [PATCH 45/56] Add missing `` tag in HTML parsing (#465) --- src/message/html.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/message/html.rs b/src/message/html.rs index 6d4c44e..8c36df7 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -748,7 +748,7 @@ fn h2t(hdl: &Handle, state: &mut TreeGenState) -> StyleTreeChildren { StyleTreeNode::Style(c, s) }, - "del" | "strike" => { + "del" | "s" | "strike" => { let c = c2t(&node.children.borrow(), state); let s = Style::default().add_modifier(StyleModifier::CROSSED_OUT); From fed19d7a4becd8923d4082b905cd70f08fc9dce8 Mon Sep 17 00:00:00 2001 From: VAWVAW Date: Sat, 21 Jun 2025 18:25:46 +0000 Subject: [PATCH 46/56] Improve image preview placeholder (#453) --- src/message/mod.rs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/message/mod.rs b/src/message/mod.rs index 4608303..e1dbedc 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -176,7 +176,9 @@ fn placeholder_frame( } let mut placeholder = "\u{230c}".to_string(); placeholder.push_str(&" ".repeat(width - 2)); - placeholder.push_str("\u{230d}\n"); + placeholder.push('\u{230d}'); + placeholder.push_str(&"\n".repeat((height - 1) / 2)); + if *height > 2 { if let Some(text) = text { if text.width() <= width - 2 { @@ -186,7 +188,7 @@ fn placeholder_frame( } } - placeholder.push_str(&"\n".repeat(height - 2)); + placeholder.push_str(&"\n".repeat(height / 2)); placeholder.push('\u{230e}'); placeholder.push_str(&" ".repeat(width - 2)); placeholder.push_str("\u{230f}\n"); @@ -1087,7 +1089,7 @@ impl Message { }, ImageStatus::Loaded(backend) => { proto = Some(backend); - placeholder_frame(Some("Loading..."), width, &backend.area().into()) + placeholder_frame(Some("Cut off..."), width, &backend.area().into()) }, ImageStatus::Error(err) => Some(format!("[Image error: {err}]\n")), }; @@ -1358,6 +1360,33 @@ pub mod tests { OK ⌎ ⌏ +"# + ) + ); + assert_eq!( + placeholder_frame(Some("OK"), 6, &ImagePreviewSize { width: 6, height: 6 }), + pretty_frame_test( + r#" +⌌ ⌍ + + OK + + +⌎ ⌏ +"# + ) + ); + assert_eq!( + placeholder_frame(Some("OK"), 6, &ImagePreviewSize { width: 6, height: 7 }), + pretty_frame_test( + r#" +⌌ ⌍ + + + OK + + +⌎ ⌏ "# ) ); From 0ef5c39f7f61dd1e65ae94ba383037be604d78cb Mon Sep 17 00:00:00 2001 From: vaw Date: Wed, 25 Jun 2025 20:14:04 +0000 Subject: [PATCH 47/56] Make merging of configuration options consistent (#471) --- src/config.rs | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/config.rs b/src/config.rs index 1438ed7..f22bd05 100644 --- a/src/config.rs +++ b/src/config.rs @@ -353,29 +353,31 @@ pub struct UserDisplayTunables { pub type UserOverrides = HashMap; -fn merge_sorts(a: SortOverrides, b: SortOverrides) -> SortOverrides { +fn merge_sorts(profile: SortOverrides, global: SortOverrides) -> SortOverrides { SortOverrides { - chats: b.chats.or(a.chats), - dms: b.dms.or(a.dms), - rooms: b.rooms.or(a.rooms), - spaces: b.spaces.or(a.spaces), - members: b.members.or(a.members), + chats: profile.chats.or(global.chats), + dms: profile.dms.or(global.dms), + rooms: profile.rooms.or(global.rooms), + spaces: profile.spaces.or(global.spaces), + members: profile.members.or(global.members), } } -fn merge_maps(a: Option>, b: Option>) -> Option> +fn merge_maps( + profile: Option>, + global: Option>, +) -> Option> where K: Eq + Hash, { - match (a, b) { - (Some(a), None) => Some(a), - (None, Some(b)) => Some(b), - (Some(mut a), Some(b)) => { - for (k, v) in b { - a.insert(k, v); + match (global, profile) { + (Some(m), None) | (None, Some(m)) => Some(m), + (Some(mut global), Some(profile)) => { + for (k, v) in profile { + global.insert(k, v); } - Some(a) + Some(global) }, (None, None) => None, } @@ -911,7 +913,7 @@ impl ApplicationSettings { } }; - let macros = merge_maps(macros, profile.macros.take()).unwrap_or_default(); + let macros = merge_maps(profile.macros.take(), macros).unwrap_or_default(); let layout = profile.layout.take().or(layout).unwrap_or_default(); let tunables = global.unwrap_or_default(); @@ -1110,10 +1112,10 @@ mod tests { assert_eq!(res, Some(b.clone())); let res = merge_maps(Some(b.clone()), Some(c.clone())); - assert_eq!(res, Some(c.clone())); + assert_eq!(res, Some(b.clone())); let res = merge_maps(Some(c.clone()), Some(b.clone())); - assert_eq!(res, Some(b.clone())); + assert_eq!(res, Some(c.clone())); } #[test] From 52010d44d7a975a74f00848d8a61f279f5fcc501 Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 4 Jul 2025 17:12:50 -0700 Subject: [PATCH 48/56] Update to modalkit{,-ratatui}@0.0.23 (#473) --- Cargo.lock | 48 ++++++++++++++++++++++---- Cargo.toml | 4 +-- src/base.rs | 62 +++++++++++++++------------------- src/main.rs | 7 ++-- src/windows/room/chat.rs | 8 ++--- src/windows/room/scrollback.rs | 2 +- 6 files changed, 81 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3fed98d..630b764 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1442,6 +1442,41 @@ dependencies = [ "which", ] +[[package]] +name = "editor-types" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e99679670f67825fcd24a23cb4eb655a0f92c82bd4d1c1a1357c0cd71e87" +dependencies = [ + "bitflags 2.9.1", + "editor-types-macros", + "keybindings", + "regex", +] + +[[package]] +name = "editor-types-macros" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42680de76cf91f231abd90cc623750d39077f7d2fadb7962325fb082871f4c66" +dependencies = [ + "editor-types-parser", + "nom", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "editor-types-parser" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac4b91fe830fbbe0a60c37ba0264b6e9ffc70e3664c028234dac59e79299ad4" +dependencies = [ + "nom", + "thiserror 1.0.69", +] + [[package]] name = "either" version = "1.15.0" @@ -2706,9 +2741,9 @@ dependencies = [ [[package]] name = "keybindings" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680e4699c91c0622dd70da32c274881aadb1ac86252d738c3641266e90e4ca15" +checksum = "19a726307ed87e05155c31329676130e6a237e62dda80211f7e1ed811e47630f" dependencies = [ "textwrap", "unicode-segmentation", @@ -3292,15 +3327,16 @@ dependencies = [ [[package]] name = "modalkit" -version = "0.0.21" +version = "0.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc7599fc1bcd2f0a0b4598f23433b45613345a46419ab27d3a9adecb57acd648" +checksum = "6ed06f32b03a7504acadcb0d95d06f3d55258934c34b620ed95e3dae24f081a5" dependencies = [ "anymap2", "arboard", "bitflags 2.9.1", "crossterm", "derive_more", + "editor-types", "intervaltree", "keybindings", "nom", @@ -3314,9 +3350,9 @@ dependencies = [ [[package]] name = "modalkit-ratatui" -version = "0.0.21" +version = "0.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd3d88c86435d4b1fb22c7c0f978b09cb888338cafc10336715aa5070e92b6f6" +checksum = "a33bd64f6dd0011ee88f4f12b28108d3e63df0a5c86fe595d24561be9522f6ea" dependencies = [ "crossterm", "intervaltree", diff --git a/Cargo.toml b/Cargo.toml index 1ac3bf1..556fcc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,13 +77,13 @@ features = ["zbus", "serde"] optional = true [dependencies.modalkit] -version = "0.0.21" +version = "0.0.23" default-features = false #git = "https://github.com/ulyssa/modalkit" #rev = "e40dbb0bfeabe4cfd08facd2acb446080a330d75" [dependencies.modalkit-ratatui] -version = "0.0.21" +version = "0.0.23" #git = "https://github.com/ulyssa/modalkit" #rev = "e40dbb0bfeabe4cfd08facd2acb446080a330d75" diff --git a/src/base.rs b/src/base.rs index fdb7875..56d4c2d 100644 --- a/src/base.rs +++ b/src/base.rs @@ -74,7 +74,7 @@ use modalkit::{ ApplicationStore, ApplicationWindowId, }, - completion::{complete_path, CompletionMap}, + completion::{complete_path, Completer, CompletionMap}, context::EditContext, cursor::Cursor, rope::EditRope, @@ -1914,11 +1914,20 @@ impl ApplicationInfo for IambInfo { type WindowId = IambId; type ContentId = IambBufferId; + fn content_of_command(ct: CommandType) -> IambBufferId { + IambBufferId::Command(ct) + } +} + +pub struct IambCompleter; + +impl Completer for IambCompleter { fn complete( + &mut self, text: &EditRope, cursor: &mut Cursor, content: &IambBufferId, - store: &mut ProgramStore, + store: &mut ChatStore, ) -> Vec { match content { IambBufferId::Command(CommandType::Command) => complete_cmdbar(text, cursor, store), @@ -1936,21 +1945,16 @@ impl ApplicationInfo for IambInfo { IambBufferId::UnreadList => vec![], } } - - fn content_of_command(ct: CommandType) -> IambBufferId { - IambBufferId::Command(ct) - } } /// Tab completion for user IDs. -fn complete_users(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) -> Vec { +fn complete_users(text: &EditRope, cursor: &mut Cursor, store: &ChatStore) -> Vec { let id = text .get_prefix_word_mut(cursor, &MATRIX_ID_WORD) .unwrap_or_else(EditRope::empty); let id = Cow::from(&id); store - .application .presences .complete(id.as_ref()) .into_iter() @@ -1959,7 +1963,7 @@ fn complete_users(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) -> } /// Tab completion within the message bar. -fn complete_msgbar(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) -> Vec { +fn complete_msgbar(text: &EditRope, cursor: &mut Cursor, store: &ChatStore) -> Vec { let id = text .get_prefix_word_mut(cursor, &MATRIX_ID_WORD) .unwrap_or_else(EditRope::empty); @@ -1968,13 +1972,12 @@ fn complete_msgbar(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) - match id.chars().next() { // Complete room aliases. Some('#') => { - return store.application.names.complete(id.as_ref()); + return store.names.complete(id.as_ref()); }, // Complete room identifiers. Some('!') => { return store - .application .rooms .complete(id.as_ref()) .into_iter() @@ -1984,7 +1987,7 @@ fn complete_msgbar(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) - // Complete Emoji shortcodes. Some(':') => { - let list = store.application.emojis.complete(&id[1..]); + let list = store.emojis.complete(&id[1..]); let iter = list.into_iter().take(200).map(|s| format!(":{}:", s)); return iter.collect(); @@ -1993,7 +1996,6 @@ fn complete_msgbar(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) - // Complete usernames for @ and empty strings. Some('@') | None => { return store - .application .presences .complete(id.as_ref()) .into_iter() @@ -2007,28 +2009,23 @@ fn complete_msgbar(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) - } /// Tab completion for Matrix identifiers (usernames, room aliases, etc.) -fn complete_matrix_names( - text: &EditRope, - cursor: &mut Cursor, - store: &ProgramStore, -) -> Vec { +fn complete_matrix_names(text: &EditRope, cursor: &mut Cursor, store: &ChatStore) -> Vec { let id = text .get_prefix_word_mut(cursor, &MATRIX_ID_WORD) .unwrap_or_else(EditRope::empty); let id = Cow::from(&id); - let list = store.application.names.complete(id.as_ref()); + let list = store.names.complete(id.as_ref()); if !list.is_empty() { return list; } - let list = store.application.presences.complete(id.as_ref()); + let list = store.presences.complete(id.as_ref()); if !list.is_empty() { return list.into_iter().map(|i| i.to_string()).collect(); } store - .application .rooms .complete(id.as_ref()) .into_iter() @@ -2037,12 +2034,12 @@ fn complete_matrix_names( } /// Tab completion for Emoji shortcode names. -fn complete_emoji(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) -> Vec { +fn complete_emoji(text: &EditRope, cursor: &mut Cursor, store: &ChatStore) -> Vec { let sc = text.get_prefix_word_mut(cursor, &WordStyle::Little); let sc = sc.unwrap_or_else(EditRope::empty); let sc = Cow::from(&sc); - store.application.emojis.complete(sc.as_ref()) + store.emojis.complete(sc.as_ref()) } /// Tab completion for command names. @@ -2050,11 +2047,11 @@ fn complete_cmdname( desc: CommandDescription, text: &EditRope, cursor: &mut Cursor, - store: &ProgramStore, + store: &ChatStore, ) -> Vec { // Complete command name and set cursor position. let _ = text.get_prefix_word_mut(cursor, &WordStyle::Little); - store.application.cmds.complete_name(desc.command.as_str()) + store.cmds.complete_name(desc.command.as_str()) } /// Tab completion for command arguments. @@ -2062,9 +2059,9 @@ fn complete_cmdarg( desc: CommandDescription, text: &EditRope, cursor: &mut Cursor, - store: &ProgramStore, + store: &ChatStore, ) -> Vec { - let cmd = match store.application.cmds.get(desc.command.as_str()) { + let cmd = match store.cmds.get(desc.command.as_str()) { Ok(cmd) => cmd, Err(_) => return vec![], }; @@ -2087,12 +2084,7 @@ fn complete_cmdarg( } /// Tab completion for commands. -fn complete_cmd( - cmd: &str, - text: &EditRope, - cursor: &mut Cursor, - store: &ProgramStore, -) -> Vec { +fn complete_cmd(cmd: &str, text: &EditRope, cursor: &mut Cursor, store: &ChatStore) -> Vec { match CommandDescription::from_str(cmd) { Ok(desc) => { if desc.arg.untrimmed.is_empty() { @@ -2109,7 +2101,7 @@ fn complete_cmd( } /// Tab completion for the command bar. -fn complete_cmdbar(text: &EditRope, cursor: &mut Cursor, store: &ProgramStore) -> Vec { +fn complete_cmdbar(text: &EditRope, cursor: &mut Cursor, store: &ChatStore) -> Vec { let eo = text.cursor_to_offset(cursor); let slice = text.slice(..eo); let cow = Cow::from(&slice); @@ -2289,6 +2281,7 @@ pub mod tests { #[tokio::test] async fn test_complete_msgbar() { let store = mock_store().await; + let store = store.application; let text = EditRope::from("going for a walk :walk "); let mut cursor = Cursor::new(0, 22); @@ -2312,6 +2305,7 @@ pub mod tests { #[tokio::test] async fn test_complete_cmdbar() { let store = mock_store().await; + let store = store.application; let users = vec![ "@user1:example.com", "@user2:example.com", diff --git a/src/main.rs b/src/main.rs index 9b8fe46..9060947 100644 --- a/src/main.rs +++ b/src/main.rs @@ -89,6 +89,7 @@ use crate::{ ChatStore, HomeserverAction, IambAction, + IambCompleter, IambError, IambId, IambInfo, @@ -529,7 +530,7 @@ impl Application { }, // Unimplemented. - Action::KeywordLookup => { + Action::KeywordLookup(_) => { // XXX: implement None }, @@ -1011,7 +1012,9 @@ async fn run(settings: ApplicationSettings) -> IambResult<()> { // Set up the async worker thread and global store. let worker = ClientWorker::spawn(client.clone(), settings.clone()).await; let store = ChatStore::new(worker.clone(), settings.clone()); - let store = Store::new(store); + let mut store = Store::new(store); + store.completer = Box::new(IambCompleter); + let store = Arc::new(AsyncMutex::new(store)); worker.init(store.clone()); diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index cb584f4..426a66c 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -864,16 +864,16 @@ impl PromptActions for ChatState { fn recall( &mut self, + filter: &RecallFilter, dir: &MoveDir1D, count: &Count, - prefixed: bool, ctx: &ProgramContext, _: &mut ProgramStore, ) -> EditResult, IambInfo> { let count = ctx.resolve(count); let rope = self.tbox.get(); - let text = self.sent.recall(&rope, &mut self.sent_scrollback, *dir, prefixed, count); + let text = self.sent.recall(&rope, &mut self.sent_scrollback, filter, *dir, count); if let Some(text) = text { self.tbox.set_text(text); @@ -897,9 +897,7 @@ impl Promptable for ChatState { match act { PromptAction::Submit => self.submit(ctx, store), PromptAction::Abort(empty) => self.abort(*empty, ctx, store), - PromptAction::Recall(dir, count, prefixed) => { - self.recall(dir, count, *prefixed, ctx, store) - }, + PromptAction::Recall(filter, dir, count) => self.recall(filter, dir, count, ctx, store), } } } diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index 53da0b7..5f32897 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -840,8 +840,8 @@ impl EditorActions for ScrollbackState { fn complete( &mut self, + _: &CompletionStyle, _: &CompletionType, - _: &CompletionSelection, _: &CompletionDisplay, _: &ProgramContext, _: &mut ProgramStore, From 34d3b844af99315a84fbae554e4b20594ecefc66 Mon Sep 17 00:00:00 2001 From: vaw Date: Sat, 5 Jul 2025 00:25:38 +0000 Subject: [PATCH 49/56] Highlight border of focused window (#470) --- src/main.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 9060947..c38b239 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,7 +62,7 @@ use modalkit::crossterm::{ use ratatui::{ backend::CrosstermBackend, layout::Rect, - style::{Color, Style}, + style::{Color, Modifier, Style}, text::Span, widgets::Paragraph, Terminal, @@ -328,6 +328,9 @@ impl Application { .show_dialog(dialogstr) .show_mode(modestr) .borders(true) + .border_style(Style::default().add_modifier(Modifier::DIM)) + .tab_style(Style::default().add_modifier(Modifier::DIM)) + .tab_style_focused(Style::default().remove_modifier(Modifier::DIM)) .focus(focused); f.render_stateful_widget(screen, area, sstate); From ec88f4441ec0cf24a30bc1a310d6f398b3bb4ac6 Mon Sep 17 00:00:00 2001 From: vaw Date: Wed, 23 Jul 2025 00:05:23 +0000 Subject: [PATCH 50/56] Recognise URLs in plain text message bodies (#476) --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + src/message/html.rs | 4 ++-- src/message/mod.rs | 1 + src/windows/room/chat.rs | 19 +++++++++++++++---- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 630b764..0166516 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2274,6 +2274,7 @@ dependencies = [ "image", "lazy_static 1.5.0", "libc", + "linkify", "markup5ever_rcdom", "matrix-sdk", "mime", @@ -2831,6 +2832,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linkify" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dfa36d52c581e9ec783a7ce2a5e0143da6237be5811a0b3153fedfdbe9f780" +dependencies = [ + "memchr", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" diff --git a/Cargo.toml b/Cargo.toml index 556fcc2..4530498 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,6 +64,7 @@ unicode-width = "0.1.10" url = {version = "^2.2.2", features = ["serde"]} edit = "0.1.4" humansize = "2.0.0" +linkify = "0.10.0" [dependencies.comrak] version = "0.22.0" diff --git a/src/message/html.rs b/src/message/html.rs index 8c36df7..c3a8009 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -524,11 +524,11 @@ impl StyleTree { } pub struct TreeGenState { - link_num: u8, + pub link_num: u8, } impl TreeGenState { - fn next_link_char(&mut self) -> Option { + pub fn next_link_char(&mut self) -> Option { let num = self.link_num; if num < 62 { diff --git a/src/message/mod.rs b/src/message/mod.rs index e1dbedc..34f80b1 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -72,6 +72,7 @@ mod state; pub use self::compose::text_to_message; use self::state::{body_cow_state, html_state}; +pub use html::TreeGenState; type ProtocolPreview<'a> = (&'a Protocol, u16, u16); diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index 426a66c..8a01a0a 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -86,7 +86,14 @@ use crate::base::{ SendAction, }; -use crate::message::{text_to_message, Message, MessageEvent, MessageKey, MessageTimeStamp}; +use crate::message::{ + text_to_message, + Message, + MessageEvent, + MessageKey, + MessageTimeStamp, + TreeGenState, +}; use crate::worker::Requester; use super::scrollback::{Scrollback, ScrollbackState}; @@ -226,10 +233,14 @@ impl ChatState { let links = if let Some(html) = &msg.html { html.get_links() - } else if let Ok(url) = Url::parse(&msg.event.body()) { - vec![('0', url)] } else { - vec![] + linkify::LinkFinder::new() + .links(&msg.event.body()) + .filter_map(|u| Url::parse(u.as_str()).ok()) + .scan(TreeGenState { link_num: 0 }, |state, u| { + state.next_link_char().map(|c| (c, u)) + }) + .collect() }; if links.is_empty() { From 963ce3c7c28fc13c15dcde7ffb0dc626123bdabe Mon Sep 17 00:00:00 2001 From: Thierry Delafontaine Date: Wed, 23 Jul 2025 02:19:18 +0200 Subject: [PATCH 51/56] Support `XDG_CONFIG_HOME` on macOS for config directory resolution (#478) --- src/config.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/config.rs b/src/config.rs index f22bd05..99e9490 100644 --- a/src/config.rs +++ b/src/config.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use std::collections::hash_map::DefaultHasher; use std::collections::{BTreeMap, HashMap}; +use std::env; use std::fmt; use std::fs::File; use std::hash::{Hash, Hasher}; @@ -837,14 +838,22 @@ pub struct ApplicationSettings { } impl ApplicationSettings { + fn get_xdg_config_home() -> Option { + env::var("XDG_CONFIG_HOME").ok().map(PathBuf::from) + } + pub fn load(cli: Iamb) -> Result> { - let mut config_dir = cli.config_directory.or_else(dirs::config_dir).unwrap_or_else(|| { - usage!( - "No user configuration directory found;\ - please specify one via -C.\n\n - For more information try '--help'" - ); - }); + let mut config_dir = cli + .config_directory + .or_else(Self::get_xdg_config_home) + .or_else(dirs::config_dir) + .unwrap_or_else(|| { + usage!( + "No user configuration directory found;\ + please specify one via -C.\n\n + For more information try '--help'" + ); + }); config_dir.push("iamb"); let config_json = config_dir.join("config.json"); From 331a6bca896a51844197f96f02f7288d04ea2191 Mon Sep 17 00:00:00 2001 From: vaw Date: Wed, 23 Jul 2025 00:26:29 +0000 Subject: [PATCH 52/56] Make blockquotes in message visually distict (#466) --- src/message/html.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/message/html.rs b/src/message/html.rs index c3a8009..d2b40ae 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -41,6 +41,8 @@ use crate::{ util::{join_cell_text, space_text}, }; +const QUOTE_COLOR: Color = Color::Indexed(236); + /// Generate bullet points from a [ListStyle]. pub struct BulletIterator { style: ListStyle, @@ -351,11 +353,14 @@ impl StyleTreeNode { printer.push_span_nobreak(span); }, StyleTreeNode::Blockquote(child) => { - let mut subp = printer.sub(4); + let mut subp = printer.sub(3); child.print(&mut subp, style); for mut line in subp.finish() { - line.spans.insert(0, Span::styled(" ", style)); + line.spans.insert(0, Span::styled(" ", style)); + line.spans + .insert(0, Span::styled(line::THICK_VERTICAL, style.fg(QUOTE_COLOR))); + line.spans.insert(0, Span::styled(" ", style)); printer.push_line(line); } }, @@ -1075,14 +1080,29 @@ pub mod tests { let s = "
Hello world!
"; let tree = parse_matrix_html(s); let text = tree.to_text(10, Style::default(), false, &settings); + let style = Style::new().fg(QUOTE_COLOR); assert_eq!(text.lines.len(), 2); assert_eq!( text.lines[0], - Line::from(vec![Span::raw(" "), Span::raw("Hello"), Span::raw(" ")]) + Line::from(vec![ + Span::raw(" "), + Span::styled(line::THICK_VERTICAL, style), + Span::raw(" "), + Span::raw("Hello"), + Span::raw(" "), + Span::raw(" "), + ]) ); assert_eq!( text.lines[1], - Line::from(vec![Span::raw(" "), Span::raw("world"), Span::raw("!")]) + Line::from(vec![ + Span::raw(" "), + Span::styled(line::THICK_VERTICAL, style), + Span::raw(" "), + Span::raw("world"), + Span::raw("!"), + Span::raw(" "), + ]) ); } From 0ff8828a1c6dd944edcaa68bdab859e89d626e6b Mon Sep 17 00:00:00 2001 From: vaw Date: Wed, 23 Jul 2025 04:05:40 +0000 Subject: [PATCH 53/56] Add config option to allow resetting mode after sending a message (#459) Co-authored-by: Ulyssa --- docs/iamb.5 | 3 +++ src/config.rs | 4 ++++ src/main.rs | 3 +++ src/tests.rs | 1 + 4 files changed, 11 insertions(+) diff --git a/docs/iamb.5 b/docs/iamb.5 index 0fdab5f..8357f96 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -173,6 +173,9 @@ respective shortcodes. .It Sy message_user_color Defines whether or not the message body is colored like the username. +.It Sy normal_after_send +Defines whether to reset input to Normal mode after sending a message. + .It Sy notifications When this subsection is present, you can enable and configure push notifications. See diff --git a/src/config.rs b/src/config.rs index 99e9490..d998e20 100644 --- a/src/config.rs +++ b/src/config.rs @@ -558,6 +558,7 @@ impl SortOverrides { pub struct TunableValues { pub log_level: Level, pub message_shortcode_display: bool, + pub normal_after_send: bool, pub reaction_display: bool, pub reaction_shortcode_display: bool, pub read_receipt_send: bool, @@ -584,6 +585,7 @@ pub struct TunableValues { pub struct Tunables { pub log_level: Option, pub message_shortcode_display: Option, + pub normal_after_send: Option, pub reaction_display: Option, pub reaction_shortcode_display: Option, pub read_receipt_send: Option, @@ -614,6 +616,7 @@ impl Tunables { message_shortcode_display: self .message_shortcode_display .or(other.message_shortcode_display), + normal_after_send: self.normal_after_send.or(other.normal_after_send), reaction_display: self.reaction_display.or(other.reaction_display), reaction_shortcode_display: self .reaction_shortcode_display @@ -645,6 +648,7 @@ impl Tunables { TunableValues { log_level: self.log_level.map(Level::from).unwrap_or(Level::INFO), message_shortcode_display: self.message_shortcode_display.unwrap_or(false), + normal_after_send: self.normal_after_send.unwrap_or(false), reaction_display: self.reaction_display.unwrap_or(true), reaction_shortcode_display: self.reaction_shortcode_display.unwrap_or(false), read_receipt_send: self.read_receipt_send.unwrap_or(true), diff --git a/src/main.rs b/src/main.rs index c38b239..b0a0eec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -596,6 +596,9 @@ impl Application { None }, IambAction::Send(act) => { + if store.application.settings.tunables.normal_after_send { + self.bindings.reset_mode(); + } self.screen.current_window_mut()?.send_command(act, ctx, store).await? }, diff --git a/src/tests.rs b/src/tests.rs index 3e3f825..73d3e84 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -171,6 +171,7 @@ pub fn mock_tunables() -> TunableValues { default_room: None, log_level: Level::INFO, message_shortcode_display: false, + normal_after_send: true, reaction_display: true, reaction_shortcode_display: false, read_receipt_send: true, From e9cdb3371abb60d74e2a3949b6e0adcd073165ce Mon Sep 17 00:00:00 2001 From: vaw Date: Wed, 23 Jul 2025 05:19:23 +0000 Subject: [PATCH 54/56] Clear desktop notification when message is read (#427) Co-authored-by: Ulyssa --- src/base.rs | 5 ++++ src/main.rs | 3 +++ src/notifications.rs | 54 ++++++++++++++++++++++++++++++++++++++------ src/worker.rs | 10 +++++--- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/src/base.rs b/src/base.rs index 56d4c2d..bb4f491 100644 --- a/src/base.rs +++ b/src/base.rs @@ -92,6 +92,7 @@ use modalkit::{ use crate::config::ImagePreviewProtocolValues; use crate::message::ImageStatus; +use crate::notifications::NotificationHandle; use crate::preview::{source_from_event, spawn_insert_preview}; use crate::{ message::{Message, MessageEvent, MessageKey, MessageTimeStamp, Messages}, @@ -1558,6 +1559,9 @@ pub struct ChatStore { /// Collator for locale-aware text sorting. pub collator: feruca::Collator, + + /// Notifications that should be dismissed when the user opens the room. + pub open_notifications: HashMap>, } impl ChatStore { @@ -1582,6 +1586,7 @@ impl ChatStore { draw_curr: None, ring_bell: false, focused: true, + open_notifications: Default::default(), } } diff --git a/src/main.rs b/src/main.rs index b0a0eec..cee2247 100644 --- a/src/main.rs +++ b/src/main.rs @@ -561,6 +561,9 @@ impl Application { IambAction::ClearUnreads => { let user_id = &store.application.settings.profile.user_id; + // Clear any notifications we displayed: + store.application.open_notifications.clear(); + for room_id in store.application.sync_info.chats() { if let Some(room) = store.application.rooms.get_mut(room_id) { room.fully_read(user_id); diff --git a/src/notifications.rs b/src/notifications.rs index c120222..0462101 100644 --- a/src/notifications.rs +++ b/src/notifications.rs @@ -8,6 +8,7 @@ use matrix_sdk::{ events::{room::message::MessageType, AnyMessageLikeEventContent, AnySyncTimelineEvent}, serde::Raw, MilliSecondsSinceUnixEpoch, + OwnedRoomId, RoomId, }, Client, @@ -24,6 +25,21 @@ const IAMB_XDG_NAME: &str = match option_env!("IAMB_XDG_NAME") { Some(iamb) => iamb, }; +/// Handle for an open notification that should be closed when the user views it. +pub struct NotificationHandle( + #[cfg(all(feature = "desktop", unix, not(target_os = "macos")))] + Option, +); + +impl Drop for NotificationHandle { + fn drop(&mut self) { + #[cfg(all(feature = "desktop", unix, not(target_os = "macos")))] + if let Some(handle) = self.0.take() { + handle.close(); + } + } +} + pub async fn register_notifications( client: &Client, settings: &ApplicationSettings, @@ -54,6 +70,7 @@ pub async fn register_notifications( return; } + let room_id = room.room_id().to_owned(); match notification.event { RawAnySyncOrStrippedTimelineEvent::Sync(e) => { match parse_full_notification(e, room, show_message).await { @@ -66,8 +83,14 @@ pub async fn register_notifications( return; } - send_notification(¬ify_via, &store, &summary, body.as_deref()) - .await; + send_notification( + ¬ify_via, + &summary, + body.as_deref(), + room_id, + &store, + ) + .await; }, Err(err) => { tracing::error!("Failed to extract notification data: {err}") @@ -86,13 +109,14 @@ pub async fn register_notifications( async fn send_notification( via: &NotifyVia, - store: &AsyncProgramStore, summary: &str, body: Option<&str>, + room_id: OwnedRoomId, + store: &AsyncProgramStore, ) { #[cfg(feature = "desktop")] if via.desktop { - send_notification_desktop(summary, body); + send_notification_desktop(summary, body, room_id, store).await; } #[cfg(not(feature = "desktop"))] { @@ -110,7 +134,12 @@ async fn send_notification_bell(store: &AsyncProgramStore) { } #[cfg(feature = "desktop")] -fn send_notification_desktop(summary: &str, body: Option<&str>) { +async fn send_notification_desktop( + summary: &str, + body: Option<&str>, + room_id: OwnedRoomId, + _store: &AsyncProgramStore, +) { let mut desktop_notification = notify_rust::Notification::new(); desktop_notification .summary(summary) @@ -125,8 +154,19 @@ fn send_notification_desktop(summary: &str, body: Option<&str>) { desktop_notification.body(body); } - if let Err(err) = desktop_notification.show() { - tracing::error!("Failed to send notification: {err}") + match desktop_notification.show() { + Err(err) => tracing::error!("Failed to send notification: {err}"), + Ok(handle) => { + #[cfg(all(unix, not(target_os = "macos")))] + _store + .lock() + .await + .application + .open_notifications + .entry(room_id) + .or_default() + .push(NotificationHandle(Some(handle))); + }, } } diff --git a/src/worker.rs b/src/worker.rs index 144c34c..d0392d1 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -502,19 +502,23 @@ async fn send_receipts_forever(client: &Client, store: &AsyncProgramStore) { loop { interval.tick().await; - let locked = store.lock().await; - let user_id = &locked.application.settings.profile.user_id; + let mut locked = store.lock().await; + let ChatStore { settings, open_notifications, rooms, .. } = &mut locked.application; + let user_id = &settings.profile.user_id; let mut updates = Vec::new(); for room in client.joined_rooms() { let room_id = room.room_id(); - let Some(info) = locked.application.rooms.get(&room_id) else { + let Some(info) = rooms.get(room_id) else { continue; }; let changed = info.receipts(user_id).filter_map(|(thread, new_receipt)| { let old_receipt = sent.get(room_id).and_then(|ts| ts.get(thread)); let changed = Some(new_receipt) != old_receipt; + if changed { + open_notifications.remove(room_id); + } changed.then(|| (room_id.to_owned(), thread.to_owned(), new_receipt.to_owned())) }); From 5029c6ee3b903878dedea1027d0965a207c7ccbb Mon Sep 17 00:00:00 2001 From: Youwen Wu Date: Mon, 16 Jun 2025 10:36:27 -0700 Subject: [PATCH 55/56] feat: add regex option for username_display --- src/config.rs | 21 +++++++++++++++++++++ src/tests.rs | 1 + 2 files changed, 22 insertions(+) diff --git a/src/config.rs b/src/config.rs index d998e20..820df3b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -400,6 +400,9 @@ pub enum UserDisplayStyle { // it can wind up being the Matrix username if there are display name collisions in the room, // in order to avoid any confusion. DisplayName, + + // Acts like Username, except when the username matches given regex, then acts like DisplayName + Regex, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -570,6 +573,7 @@ pub struct TunableValues { pub typing_notice_display: bool, pub users: UserOverrides, pub username_display: UserDisplayStyle, + pub username_display_regex: Option, pub message_user_color: bool, pub default_room: Option, pub open_command: Option>, @@ -598,6 +602,7 @@ pub struct Tunables { pub typing_notice_display: Option, pub users: Option, pub username_display: Option, + pub username_display_regex: Option, pub message_user_color: Option, pub default_room: Option, pub open_command: Option>, @@ -630,6 +635,7 @@ impl Tunables { typing_notice_display: self.typing_notice_display.or(other.typing_notice_display), users: merge_maps(self.users, other.users), username_display: self.username_display.or(other.username_display), + username_display_regex: self.username_display_regex.or(other.username_display_regex), message_user_color: self.message_user_color.or(other.message_user_color), default_room: self.default_room.or(other.default_room), open_command: self.open_command.or(other.open_command), @@ -660,6 +666,7 @@ impl Tunables { typing_notice_display: self.typing_notice_display.unwrap_or(true), users: self.users.unwrap_or_default(), username_display: self.username_display.unwrap_or_default(), + username_display_regex: self.username_display_regex, message_user_color: self.message_user_color.unwrap_or(false), default_room: self.default_room, open_command: self.open_command, @@ -1061,6 +1068,20 @@ impl ApplicationSettings { Cow::Borrowed(user_id.as_str()) } }, + (None, UserDisplayStyle::Regex) => { + let re = regex::Regex::new( + &self.tunables.username_display_regex.clone().unwrap_or("*".into()), + ) + .unwrap(); + + if !re.is_match(user_id.as_str()) { + Cow::Borrowed(user_id.as_str()) + } else if let Some(display) = info.display_names.get(user_id) { + Cow::Borrowed(display.as_str()) + } else { + Cow::Borrowed(user_id.as_str()) + } + }, }; Span::styled(name, style) diff --git a/src/tests.rs b/src/tests.rs index 73d3e84..e4f67a9 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -190,6 +190,7 @@ pub fn mock_tunables() -> TunableValues { open_command: None, external_edit_file_suffix: String::from(".md"), username_display: UserDisplayStyle::Username, + username_display_regex: Some(String::from(".*")), message_user_color: false, mouse: Default::default(), notifications: Notifications { From 1475d9ce50a8ceaef020f1eed6eed43521690762 Mon Sep 17 00:00:00 2001 From: Youwen Wu Date: Mon, 16 Jun 2025 10:42:50 -0700 Subject: [PATCH 56/56] feat: add test for new username_display config options --- src/config.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.rs b/src/config.rs index 820df3b..5084dcb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1198,6 +1198,13 @@ mod tests { let res: Tunables = serde_json::from_str("{\"username_display\": \"displayname\"}").unwrap(); assert_eq!(res.username_display, Some(UserDisplayStyle::DisplayName)); + + let res: Tunables = serde_json::from_str( + "{\"username_display\": \"regex\",\n\"username_display_regex\": \"foo\"}", + ) + .unwrap(); + assert_eq!(res.username_display, Some(UserDisplayStyle::Regex)); + assert_eq!(res.username_display_regex.unwrap_or("FAILED".into()), "foo".to_string()); } #[test]