├── .cargo └── config.toml ├── .github └── workflows │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE.md ├── README.md ├── dev.kdl └── src ├── backend_workers.rs ├── main.rs ├── search_results.rs └── ui ├── controls_line.rs ├── loading_animation.rs ├── mod.rs └── selection_controls_area.rs /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-wasip1" 3 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Release 3 | permissions: write-all 4 | on: 5 | push: 6 | tags: 7 | - 'v*.*.*' 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build-release: 12 | name: build-release 13 | runs-on: ubuntu-latest 14 | env: 15 | RUST_BACKTRACE: 1 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Install Rust 23 | uses: actions-rs/toolchain@v1 24 | with: 25 | toolchain: '1.83.0' 26 | profile: minimal 27 | override: true 28 | target: wasm32-wasip1 29 | 30 | - name: Build release binary 31 | run: cargo build --release 32 | 33 | - name: Create release 34 | id: create_release 35 | uses: actions/create-release@v1 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | with: 39 | tag_name: ${{ github.event_name == 'workflow_dispatch' && '' || github.ref }} 40 | release_name: Release ${{ github.event_name == 'workflow_dispatch' && 'main' || github.ref }} 41 | draft: true 42 | prerelease: false 43 | 44 | - name: Upload wasm file to release 45 | uses: actions/upload-release-asset@v1.0.2 46 | env: 47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 48 | with: 49 | upload_url: ${{ steps.create_release.outputs.upload_url }} 50 | asset_path: ./target/wasm32-wasip1/release/monocle.wasm 51 | asset_name: monocle.wasm 52 | asset_content_type: application/octet-stream 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android-tzdata" 31 | version = "0.1.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 | 35 | [[package]] 36 | name = "android_system_properties" 37 | version = "0.1.5" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 | dependencies = [ 41 | "libc", 42 | ] 43 | 44 | [[package]] 45 | name = "anyhow" 46 | version = "1.0.95" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 49 | dependencies = [ 50 | "backtrace", 51 | ] 52 | 53 | [[package]] 54 | name = "arc-swap" 55 | version = "1.7.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 58 | 59 | [[package]] 60 | name = "arrayvec" 61 | version = "0.5.2" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 64 | 65 | [[package]] 66 | name = "async-attributes" 67 | version = "1.1.2" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" 70 | dependencies = [ 71 | "quote", 72 | "syn 1.0.109", 73 | ] 74 | 75 | [[package]] 76 | name = "async-channel" 77 | version = "1.9.0" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" 80 | dependencies = [ 81 | "concurrent-queue", 82 | "event-listener 2.5.3", 83 | "futures-core", 84 | ] 85 | 86 | [[package]] 87 | name = "async-channel" 88 | version = "2.3.1" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 91 | dependencies = [ 92 | "concurrent-queue", 93 | "event-listener-strategy", 94 | "futures-core", 95 | "pin-project-lite", 96 | ] 97 | 98 | [[package]] 99 | name = "async-executor" 100 | version = "1.13.1" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" 103 | dependencies = [ 104 | "async-task", 105 | "concurrent-queue", 106 | "fastrand 2.3.0", 107 | "futures-lite 2.5.0", 108 | "slab", 109 | ] 110 | 111 | [[package]] 112 | name = "async-global-executor" 113 | version = "2.4.1" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" 116 | dependencies = [ 117 | "async-channel 2.3.1", 118 | "async-executor", 119 | "async-io", 120 | "async-lock", 121 | "blocking", 122 | "futures-lite 2.5.0", 123 | "once_cell", 124 | ] 125 | 126 | [[package]] 127 | name = "async-io" 128 | version = "2.4.0" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" 131 | dependencies = [ 132 | "async-lock", 133 | "cfg-if", 134 | "concurrent-queue", 135 | "futures-io", 136 | "futures-lite 2.5.0", 137 | "parking", 138 | "polling 3.7.4", 139 | "rustix", 140 | "slab", 141 | "tracing", 142 | "windows-sys 0.59.0", 143 | ] 144 | 145 | [[package]] 146 | name = "async-lock" 147 | version = "3.4.0" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 150 | dependencies = [ 151 | "event-listener 5.3.1", 152 | "event-listener-strategy", 153 | "pin-project-lite", 154 | ] 155 | 156 | [[package]] 157 | name = "async-process" 158 | version = "2.3.0" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" 161 | dependencies = [ 162 | "async-channel 2.3.1", 163 | "async-io", 164 | "async-lock", 165 | "async-signal", 166 | "async-task", 167 | "blocking", 168 | "cfg-if", 169 | "event-listener 5.3.1", 170 | "futures-lite 2.5.0", 171 | "rustix", 172 | "tracing", 173 | ] 174 | 175 | [[package]] 176 | name = "async-signal" 177 | version = "0.2.10" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" 180 | dependencies = [ 181 | "async-io", 182 | "async-lock", 183 | "atomic-waker", 184 | "cfg-if", 185 | "futures-core", 186 | "futures-io", 187 | "rustix", 188 | "signal-hook-registry", 189 | "slab", 190 | "windows-sys 0.59.0", 191 | ] 192 | 193 | [[package]] 194 | name = "async-std" 195 | version = "1.13.0" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" 198 | dependencies = [ 199 | "async-attributes", 200 | "async-channel 1.9.0", 201 | "async-global-executor", 202 | "async-io", 203 | "async-lock", 204 | "async-process", 205 | "crossbeam-utils", 206 | "futures-channel", 207 | "futures-core", 208 | "futures-io", 209 | "futures-lite 2.5.0", 210 | "gloo-timers", 211 | "kv-log-macro", 212 | "log", 213 | "memchr", 214 | "once_cell", 215 | "pin-project-lite", 216 | "pin-utils", 217 | "slab", 218 | "wasm-bindgen-futures", 219 | ] 220 | 221 | [[package]] 222 | name = "async-task" 223 | version = "4.7.1" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 226 | 227 | [[package]] 228 | name = "atomic" 229 | version = "0.6.0" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" 232 | dependencies = [ 233 | "bytemuck", 234 | ] 235 | 236 | [[package]] 237 | name = "atomic-waker" 238 | version = "1.1.2" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 241 | 242 | [[package]] 243 | name = "atty" 244 | version = "0.2.14" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 247 | dependencies = [ 248 | "hermit-abi 0.1.19", 249 | "libc", 250 | "winapi", 251 | ] 252 | 253 | [[package]] 254 | name = "autocfg" 255 | version = "1.4.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 258 | 259 | [[package]] 260 | name = "backtrace" 261 | version = "0.3.74" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 264 | dependencies = [ 265 | "addr2line", 266 | "cfg-if", 267 | "libc", 268 | "miniz_oxide", 269 | "object", 270 | "rustc-demangle", 271 | "windows-targets 0.52.6", 272 | ] 273 | 274 | [[package]] 275 | name = "backtrace-ext" 276 | version = "0.2.1" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" 279 | dependencies = [ 280 | "backtrace", 281 | ] 282 | 283 | [[package]] 284 | name = "base64" 285 | version = "0.21.7" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 288 | 289 | [[package]] 290 | name = "bit-set" 291 | version = "0.5.3" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 294 | dependencies = [ 295 | "bit-vec", 296 | ] 297 | 298 | [[package]] 299 | name = "bit-vec" 300 | version = "0.6.3" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 303 | 304 | [[package]] 305 | name = "bitflags" 306 | version = "1.3.2" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 309 | 310 | [[package]] 311 | name = "bitflags" 312 | version = "2.6.0" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 315 | 316 | [[package]] 317 | name = "block-buffer" 318 | version = "0.10.4" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 321 | dependencies = [ 322 | "generic-array", 323 | ] 324 | 325 | [[package]] 326 | name = "blocking" 327 | version = "1.6.1" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 330 | dependencies = [ 331 | "async-channel 2.3.1", 332 | "async-task", 333 | "futures-io", 334 | "futures-lite 2.5.0", 335 | "piper", 336 | ] 337 | 338 | [[package]] 339 | name = "bstr" 340 | version = "1.11.3" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" 343 | dependencies = [ 344 | "memchr", 345 | "serde", 346 | ] 347 | 348 | [[package]] 349 | name = "bumpalo" 350 | version = "3.16.0" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 353 | 354 | [[package]] 355 | name = "bytemuck" 356 | version = "1.21.0" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 359 | 360 | [[package]] 361 | name = "byteorder" 362 | version = "1.5.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 365 | 366 | [[package]] 367 | name = "bytes" 368 | version = "1.9.0" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 371 | 372 | [[package]] 373 | name = "castaway" 374 | version = "0.1.2" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" 377 | 378 | [[package]] 379 | name = "cc" 380 | version = "1.2.6" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" 383 | dependencies = [ 384 | "shlex", 385 | ] 386 | 387 | [[package]] 388 | name = "cfg-if" 389 | version = "1.0.0" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 392 | 393 | [[package]] 394 | name = "cfg_aliases" 395 | version = "0.1.1" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 398 | 399 | [[package]] 400 | name = "chrono" 401 | version = "0.4.39" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 404 | dependencies = [ 405 | "android-tzdata", 406 | "iana-time-zone", 407 | "num-traits", 408 | "windows-targets 0.52.6", 409 | ] 410 | 411 | [[package]] 412 | name = "clap" 413 | version = "3.2.25" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" 416 | dependencies = [ 417 | "atty", 418 | "bitflags 1.3.2", 419 | "clap_derive", 420 | "clap_lex", 421 | "indexmap 1.9.3", 422 | "once_cell", 423 | "strsim", 424 | "termcolor", 425 | "textwrap 0.16.1", 426 | ] 427 | 428 | [[package]] 429 | name = "clap_complete" 430 | version = "3.2.5" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" 433 | dependencies = [ 434 | "clap", 435 | ] 436 | 437 | [[package]] 438 | name = "clap_derive" 439 | version = "3.2.25" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" 442 | dependencies = [ 443 | "heck 0.4.1", 444 | "proc-macro-error", 445 | "proc-macro2", 446 | "quote", 447 | "syn 1.0.109", 448 | ] 449 | 450 | [[package]] 451 | name = "clap_lex" 452 | version = "0.2.4" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 455 | dependencies = [ 456 | "os_str_bytes", 457 | ] 458 | 459 | [[package]] 460 | name = "colored" 461 | version = "2.2.0" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" 464 | dependencies = [ 465 | "lazy_static", 466 | "windows-sys 0.59.0", 467 | ] 468 | 469 | [[package]] 470 | name = "colorsys" 471 | version = "0.6.7" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "54261aba646433cb567ec89844be4c4825ca92a4f8afba52fc4dd88436e31bbd" 474 | 475 | [[package]] 476 | name = "concurrent-queue" 477 | version = "2.5.0" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 480 | dependencies = [ 481 | "crossbeam-utils", 482 | ] 483 | 484 | [[package]] 485 | name = "core-foundation-sys" 486 | version = "0.8.7" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 489 | 490 | [[package]] 491 | name = "cpufeatures" 492 | version = "0.2.16" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" 495 | dependencies = [ 496 | "libc", 497 | ] 498 | 499 | [[package]] 500 | name = "crossbeam" 501 | version = "0.8.4" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" 504 | dependencies = [ 505 | "crossbeam-channel", 506 | "crossbeam-deque", 507 | "crossbeam-epoch", 508 | "crossbeam-queue", 509 | "crossbeam-utils", 510 | ] 511 | 512 | [[package]] 513 | name = "crossbeam-channel" 514 | version = "0.5.14" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" 517 | dependencies = [ 518 | "crossbeam-utils", 519 | ] 520 | 521 | [[package]] 522 | name = "crossbeam-deque" 523 | version = "0.8.6" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 526 | dependencies = [ 527 | "crossbeam-epoch", 528 | "crossbeam-utils", 529 | ] 530 | 531 | [[package]] 532 | name = "crossbeam-epoch" 533 | version = "0.9.18" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 536 | dependencies = [ 537 | "crossbeam-utils", 538 | ] 539 | 540 | [[package]] 541 | name = "crossbeam-queue" 542 | version = "0.3.12" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 545 | dependencies = [ 546 | "crossbeam-utils", 547 | ] 548 | 549 | [[package]] 550 | name = "crossbeam-utils" 551 | version = "0.8.21" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 554 | 555 | [[package]] 556 | name = "crypto-common" 557 | version = "0.1.6" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 560 | dependencies = [ 561 | "generic-array", 562 | "typenum", 563 | ] 564 | 565 | [[package]] 566 | name = "csscolorparser" 567 | version = "0.6.2" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" 570 | dependencies = [ 571 | "lab", 572 | "phf", 573 | ] 574 | 575 | [[package]] 576 | name = "curl" 577 | version = "0.4.47" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" 580 | dependencies = [ 581 | "curl-sys", 582 | "libc", 583 | "openssl-probe", 584 | "openssl-sys", 585 | "schannel", 586 | "socket2", 587 | "windows-sys 0.52.0", 588 | ] 589 | 590 | [[package]] 591 | name = "curl-sys" 592 | version = "0.4.78+curl-8.11.0" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "8eec768341c5c7789611ae51cf6c459099f22e64a5d5d0ce4892434e33821eaf" 595 | dependencies = [ 596 | "cc", 597 | "libc", 598 | "libnghttp2-sys", 599 | "libz-sys", 600 | "openssl-sys", 601 | "pkg-config", 602 | "vcpkg", 603 | "windows-sys 0.52.0", 604 | ] 605 | 606 | [[package]] 607 | name = "deltae" 608 | version = "0.3.2" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" 611 | 612 | [[package]] 613 | name = "derivative" 614 | version = "2.2.0" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 617 | dependencies = [ 618 | "proc-macro2", 619 | "quote", 620 | "syn 1.0.109", 621 | ] 622 | 623 | [[package]] 624 | name = "destructure_traitobject" 625 | version = "0.2.0" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" 628 | 629 | [[package]] 630 | name = "digest" 631 | version = "0.10.7" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 634 | dependencies = [ 635 | "block-buffer", 636 | "crypto-common", 637 | ] 638 | 639 | [[package]] 640 | name = "directories" 641 | version = "5.0.1" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" 644 | dependencies = [ 645 | "dirs-sys 0.4.1", 646 | ] 647 | 648 | [[package]] 649 | name = "dirs" 650 | version = "4.0.0" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 653 | dependencies = [ 654 | "dirs-sys 0.3.7", 655 | ] 656 | 657 | [[package]] 658 | name = "dirs" 659 | version = "5.0.1" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 662 | dependencies = [ 663 | "dirs-sys 0.4.1", 664 | ] 665 | 666 | [[package]] 667 | name = "dirs-sys" 668 | version = "0.3.7" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 671 | dependencies = [ 672 | "libc", 673 | "redox_users", 674 | "winapi", 675 | ] 676 | 677 | [[package]] 678 | name = "dirs-sys" 679 | version = "0.4.1" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 682 | dependencies = [ 683 | "libc", 684 | "option-ext", 685 | "redox_users", 686 | "windows-sys 0.48.0", 687 | ] 688 | 689 | [[package]] 690 | name = "displaydoc" 691 | version = "0.2.5" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 694 | dependencies = [ 695 | "proc-macro2", 696 | "quote", 697 | "syn 2.0.94", 698 | ] 699 | 700 | [[package]] 701 | name = "either" 702 | version = "1.13.0" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 705 | 706 | [[package]] 707 | name = "encoding_rs" 708 | version = "0.8.35" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 711 | dependencies = [ 712 | "cfg-if", 713 | ] 714 | 715 | [[package]] 716 | name = "equivalent" 717 | version = "1.0.1" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 720 | 721 | [[package]] 722 | name = "errno" 723 | version = "0.3.10" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 726 | dependencies = [ 727 | "libc", 728 | "windows-sys 0.59.0", 729 | ] 730 | 731 | [[package]] 732 | name = "euclid" 733 | version = "0.22.11" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" 736 | dependencies = [ 737 | "num-traits", 738 | ] 739 | 740 | [[package]] 741 | name = "event-listener" 742 | version = "2.5.3" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 745 | 746 | [[package]] 747 | name = "event-listener" 748 | version = "5.3.1" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" 751 | dependencies = [ 752 | "concurrent-queue", 753 | "parking", 754 | "pin-project-lite", 755 | ] 756 | 757 | [[package]] 758 | name = "event-listener-strategy" 759 | version = "0.5.3" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 762 | dependencies = [ 763 | "event-listener 5.3.1", 764 | "pin-project-lite", 765 | ] 766 | 767 | [[package]] 768 | name = "fancy-regex" 769 | version = "0.11.0" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" 772 | dependencies = [ 773 | "bit-set", 774 | "regex", 775 | ] 776 | 777 | [[package]] 778 | name = "fastrand" 779 | version = "1.9.0" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 782 | dependencies = [ 783 | "instant", 784 | ] 785 | 786 | [[package]] 787 | name = "fastrand" 788 | version = "2.3.0" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 791 | 792 | [[package]] 793 | name = "file-id" 794 | version = "0.1.0" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "e13be71e6ca82e91bc0cb862bebaac0b2d1924a5a1d970c822b2f98b63fda8c3" 797 | dependencies = [ 798 | "winapi-util", 799 | ] 800 | 801 | [[package]] 802 | name = "filedescriptor" 803 | version = "0.8.2" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" 806 | dependencies = [ 807 | "libc", 808 | "thiserror 1.0.69", 809 | "winapi", 810 | ] 811 | 812 | [[package]] 813 | name = "filetime" 814 | version = "0.2.25" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" 817 | dependencies = [ 818 | "cfg-if", 819 | "libc", 820 | "libredox", 821 | "windows-sys 0.59.0", 822 | ] 823 | 824 | [[package]] 825 | name = "finl_unicode" 826 | version = "1.3.0" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "94c970b525906eb37d3940083aa65b95e481fc1857d467d13374e1d925cfc163" 829 | 830 | [[package]] 831 | name = "fixedbitset" 832 | version = "0.4.2" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 835 | 836 | [[package]] 837 | name = "fnv" 838 | version = "1.0.7" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 841 | 842 | [[package]] 843 | name = "form_urlencoded" 844 | version = "1.2.1" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 847 | dependencies = [ 848 | "percent-encoding", 849 | ] 850 | 851 | [[package]] 852 | name = "fsevent-sys" 853 | version = "4.1.0" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" 856 | dependencies = [ 857 | "libc", 858 | ] 859 | 860 | [[package]] 861 | name = "futures" 862 | version = "0.3.31" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 865 | dependencies = [ 866 | "futures-channel", 867 | "futures-core", 868 | "futures-executor", 869 | "futures-io", 870 | "futures-sink", 871 | "futures-task", 872 | "futures-util", 873 | ] 874 | 875 | [[package]] 876 | name = "futures-channel" 877 | version = "0.3.31" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 880 | dependencies = [ 881 | "futures-core", 882 | "futures-sink", 883 | ] 884 | 885 | [[package]] 886 | name = "futures-core" 887 | version = "0.3.31" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 890 | 891 | [[package]] 892 | name = "futures-executor" 893 | version = "0.3.31" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 896 | dependencies = [ 897 | "futures-core", 898 | "futures-task", 899 | "futures-util", 900 | ] 901 | 902 | [[package]] 903 | name = "futures-io" 904 | version = "0.3.31" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 907 | 908 | [[package]] 909 | name = "futures-lite" 910 | version = "1.13.0" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" 913 | dependencies = [ 914 | "fastrand 1.9.0", 915 | "futures-core", 916 | "futures-io", 917 | "memchr", 918 | "parking", 919 | "pin-project-lite", 920 | "waker-fn", 921 | ] 922 | 923 | [[package]] 924 | name = "futures-lite" 925 | version = "2.5.0" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" 928 | dependencies = [ 929 | "fastrand 2.3.0", 930 | "futures-core", 931 | "futures-io", 932 | "parking", 933 | "pin-project-lite", 934 | ] 935 | 936 | [[package]] 937 | name = "futures-macro" 938 | version = "0.3.31" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 941 | dependencies = [ 942 | "proc-macro2", 943 | "quote", 944 | "syn 2.0.94", 945 | ] 946 | 947 | [[package]] 948 | name = "futures-sink" 949 | version = "0.3.31" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 952 | 953 | [[package]] 954 | name = "futures-task" 955 | version = "0.3.31" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 958 | 959 | [[package]] 960 | name = "futures-util" 961 | version = "0.3.31" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 964 | dependencies = [ 965 | "futures-channel", 966 | "futures-core", 967 | "futures-io", 968 | "futures-macro", 969 | "futures-sink", 970 | "futures-task", 971 | "memchr", 972 | "pin-project-lite", 973 | "pin-utils", 974 | "slab", 975 | ] 976 | 977 | [[package]] 978 | name = "fuzzy-matcher" 979 | version = "0.3.7" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" 982 | dependencies = [ 983 | "thread_local", 984 | ] 985 | 986 | [[package]] 987 | name = "generic-array" 988 | version = "0.14.7" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 991 | dependencies = [ 992 | "typenum", 993 | "version_check", 994 | ] 995 | 996 | [[package]] 997 | name = "getrandom" 998 | version = "0.2.15" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 1001 | dependencies = [ 1002 | "cfg-if", 1003 | "libc", 1004 | "wasi", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "gimli" 1009 | version = "0.31.1" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1012 | 1013 | [[package]] 1014 | name = "globset" 1015 | version = "0.4.15" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" 1018 | dependencies = [ 1019 | "aho-corasick", 1020 | "bstr", 1021 | "log", 1022 | "regex-automata", 1023 | "regex-syntax", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "gloo-timers" 1028 | version = "0.3.0" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" 1031 | dependencies = [ 1032 | "futures-channel", 1033 | "futures-core", 1034 | "js-sys", 1035 | "wasm-bindgen", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "hashbrown" 1040 | version = "0.12.3" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1043 | 1044 | [[package]] 1045 | name = "hashbrown" 1046 | version = "0.15.2" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1049 | 1050 | [[package]] 1051 | name = "heck" 1052 | version = "0.3.3" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1055 | dependencies = [ 1056 | "unicode-segmentation", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "heck" 1061 | version = "0.4.1" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1064 | 1065 | [[package]] 1066 | name = "hermit-abi" 1067 | version = "0.1.19" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1070 | dependencies = [ 1071 | "libc", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "hermit-abi" 1076 | version = "0.4.0" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 1079 | 1080 | [[package]] 1081 | name = "hex" 1082 | version = "0.4.3" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1085 | 1086 | [[package]] 1087 | name = "home" 1088 | version = "0.5.11" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1091 | dependencies = [ 1092 | "windows-sys 0.59.0", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "http" 1097 | version = "0.2.12" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1100 | dependencies = [ 1101 | "bytes", 1102 | "fnv", 1103 | "itoa", 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "humantime" 1108 | version = "2.1.0" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 1111 | 1112 | [[package]] 1113 | name = "iana-time-zone" 1114 | version = "0.1.61" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1117 | dependencies = [ 1118 | "android_system_properties", 1119 | "core-foundation-sys", 1120 | "iana-time-zone-haiku", 1121 | "js-sys", 1122 | "wasm-bindgen", 1123 | "windows-core", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "iana-time-zone-haiku" 1128 | version = "0.1.2" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1131 | dependencies = [ 1132 | "cc", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "icu_collections" 1137 | version = "1.5.0" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1140 | dependencies = [ 1141 | "displaydoc", 1142 | "yoke", 1143 | "zerofrom", 1144 | "zerovec", 1145 | ] 1146 | 1147 | [[package]] 1148 | name = "icu_locid" 1149 | version = "1.5.0" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1152 | dependencies = [ 1153 | "displaydoc", 1154 | "litemap", 1155 | "tinystr", 1156 | "writeable", 1157 | "zerovec", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "icu_locid_transform" 1162 | version = "1.5.0" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1165 | dependencies = [ 1166 | "displaydoc", 1167 | "icu_locid", 1168 | "icu_locid_transform_data", 1169 | "icu_provider", 1170 | "tinystr", 1171 | "zerovec", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "icu_locid_transform_data" 1176 | version = "1.5.0" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1179 | 1180 | [[package]] 1181 | name = "icu_normalizer" 1182 | version = "1.5.0" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1185 | dependencies = [ 1186 | "displaydoc", 1187 | "icu_collections", 1188 | "icu_normalizer_data", 1189 | "icu_properties", 1190 | "icu_provider", 1191 | "smallvec", 1192 | "utf16_iter", 1193 | "utf8_iter", 1194 | "write16", 1195 | "zerovec", 1196 | ] 1197 | 1198 | [[package]] 1199 | name = "icu_normalizer_data" 1200 | version = "1.5.0" 1201 | source = "registry+https://github.com/rust-lang/crates.io-index" 1202 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1203 | 1204 | [[package]] 1205 | name = "icu_properties" 1206 | version = "1.5.1" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1209 | dependencies = [ 1210 | "displaydoc", 1211 | "icu_collections", 1212 | "icu_locid_transform", 1213 | "icu_properties_data", 1214 | "icu_provider", 1215 | "tinystr", 1216 | "zerovec", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "icu_properties_data" 1221 | version = "1.5.0" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1224 | 1225 | [[package]] 1226 | name = "icu_provider" 1227 | version = "1.5.0" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1230 | dependencies = [ 1231 | "displaydoc", 1232 | "icu_locid", 1233 | "icu_provider_macros", 1234 | "stable_deref_trait", 1235 | "tinystr", 1236 | "writeable", 1237 | "yoke", 1238 | "zerofrom", 1239 | "zerovec", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "icu_provider_macros" 1244 | version = "1.5.0" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1247 | dependencies = [ 1248 | "proc-macro2", 1249 | "quote", 1250 | "syn 2.0.94", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "idna" 1255 | version = "1.0.3" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1258 | dependencies = [ 1259 | "idna_adapter", 1260 | "smallvec", 1261 | "utf8_iter", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "idna_adapter" 1266 | version = "1.2.0" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1269 | dependencies = [ 1270 | "icu_normalizer", 1271 | "icu_properties", 1272 | ] 1273 | 1274 | [[package]] 1275 | name = "ignore" 1276 | version = "0.4.23" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" 1279 | dependencies = [ 1280 | "crossbeam-deque", 1281 | "globset", 1282 | "log", 1283 | "memchr", 1284 | "regex-automata", 1285 | "same-file", 1286 | "walkdir", 1287 | "winapi-util", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "include_dir" 1292 | version = "0.7.4" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" 1295 | dependencies = [ 1296 | "include_dir_macros", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "include_dir_macros" 1301 | version = "0.7.4" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" 1304 | dependencies = [ 1305 | "proc-macro2", 1306 | "quote", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "indexmap" 1311 | version = "1.9.3" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1314 | dependencies = [ 1315 | "autocfg", 1316 | "hashbrown 0.12.3", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "indexmap" 1321 | version = "2.7.0" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" 1324 | dependencies = [ 1325 | "equivalent", 1326 | "hashbrown 0.15.2", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "inotify" 1331 | version = "0.9.6" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" 1334 | dependencies = [ 1335 | "bitflags 1.3.2", 1336 | "inotify-sys", 1337 | "libc", 1338 | ] 1339 | 1340 | [[package]] 1341 | name = "inotify-sys" 1342 | version = "0.1.5" 1343 | source = "registry+https://github.com/rust-lang/crates.io-index" 1344 | checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" 1345 | dependencies = [ 1346 | "libc", 1347 | ] 1348 | 1349 | [[package]] 1350 | name = "instant" 1351 | version = "0.1.13" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 1354 | dependencies = [ 1355 | "cfg-if", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "interprocess" 1360 | version = "1.2.1" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "81f2533f3be42fffe3b5e63b71aeca416c1c3bc33e4e27be018521e76b1f38fb" 1363 | dependencies = [ 1364 | "blocking", 1365 | "cfg-if", 1366 | "futures-core", 1367 | "futures-io", 1368 | "intmap", 1369 | "libc", 1370 | "once_cell", 1371 | "rustc_version", 1372 | "spinning", 1373 | "thiserror 1.0.69", 1374 | "to_method", 1375 | "winapi", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "intmap" 1380 | version = "0.7.1" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9" 1383 | 1384 | [[package]] 1385 | name = "is-terminal" 1386 | version = "0.4.13" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" 1389 | dependencies = [ 1390 | "hermit-abi 0.4.0", 1391 | "libc", 1392 | "windows-sys 0.52.0", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "is_ci" 1397 | version = "1.2.0" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" 1400 | 1401 | [[package]] 1402 | name = "isahc" 1403 | version = "1.7.2" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" 1406 | dependencies = [ 1407 | "async-channel 1.9.0", 1408 | "castaway", 1409 | "crossbeam-utils", 1410 | "curl", 1411 | "curl-sys", 1412 | "encoding_rs", 1413 | "event-listener 2.5.3", 1414 | "futures-lite 1.13.0", 1415 | "http", 1416 | "log", 1417 | "mime", 1418 | "once_cell", 1419 | "polling 2.8.0", 1420 | "slab", 1421 | "sluice", 1422 | "tracing", 1423 | "tracing-futures", 1424 | "url", 1425 | "waker-fn", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "itertools" 1430 | version = "0.10.5" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1433 | dependencies = [ 1434 | "either", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "itoa" 1439 | version = "1.0.14" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 1442 | 1443 | [[package]] 1444 | name = "js-sys" 1445 | version = "0.3.76" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" 1448 | dependencies = [ 1449 | "once_cell", 1450 | "wasm-bindgen", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "kdl" 1455 | version = "4.7.1" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "e03e2e96c5926fe761088d66c8c2aee3a4352a2573f4eaca50043ad130af9117" 1458 | dependencies = [ 1459 | "miette", 1460 | "nom", 1461 | "thiserror 1.0.69", 1462 | ] 1463 | 1464 | [[package]] 1465 | name = "kqueue" 1466 | version = "1.0.8" 1467 | source = "registry+https://github.com/rust-lang/crates.io-index" 1468 | checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" 1469 | dependencies = [ 1470 | "kqueue-sys", 1471 | "libc", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "kqueue-sys" 1476 | version = "1.0.4" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" 1479 | dependencies = [ 1480 | "bitflags 1.3.2", 1481 | "libc", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "kv-log-macro" 1486 | version = "1.0.7" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" 1489 | dependencies = [ 1490 | "log", 1491 | ] 1492 | 1493 | [[package]] 1494 | name = "lab" 1495 | version = "0.11.0" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" 1498 | 1499 | [[package]] 1500 | name = "lazy_static" 1501 | version = "1.5.0" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1504 | 1505 | [[package]] 1506 | name = "libc" 1507 | version = "0.2.169" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 1510 | 1511 | [[package]] 1512 | name = "libnghttp2-sys" 1513 | version = "0.1.10+1.61.0" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "959c25552127d2e1fa72f0e52548ec04fc386e827ba71a7bd01db46a447dc135" 1516 | dependencies = [ 1517 | "cc", 1518 | "libc", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "libredox" 1523 | version = "0.1.3" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1526 | dependencies = [ 1527 | "bitflags 2.6.0", 1528 | "libc", 1529 | "redox_syscall", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "libz-sys" 1534 | version = "1.1.20" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" 1537 | dependencies = [ 1538 | "cc", 1539 | "libc", 1540 | "pkg-config", 1541 | "vcpkg", 1542 | ] 1543 | 1544 | [[package]] 1545 | name = "linux-raw-sys" 1546 | version = "0.4.14" 1547 | source = "registry+https://github.com/rust-lang/crates.io-index" 1548 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 1549 | 1550 | [[package]] 1551 | name = "litemap" 1552 | version = "0.7.4" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 1555 | 1556 | [[package]] 1557 | name = "lock_api" 1558 | version = "0.4.12" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1561 | dependencies = [ 1562 | "autocfg", 1563 | "scopeguard", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "log" 1568 | version = "0.4.22" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 1571 | dependencies = [ 1572 | "serde", 1573 | "value-bag", 1574 | ] 1575 | 1576 | [[package]] 1577 | name = "log-mdc" 1578 | version = "0.1.0" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" 1581 | 1582 | [[package]] 1583 | name = "log4rs" 1584 | version = "1.3.0" 1585 | source = "registry+https://github.com/rust-lang/crates.io-index" 1586 | checksum = "0816135ae15bd0391cf284eab37e6e3ee0a6ee63d2ceeb659862bd8d0a984ca6" 1587 | dependencies = [ 1588 | "anyhow", 1589 | "arc-swap", 1590 | "chrono", 1591 | "derivative", 1592 | "fnv", 1593 | "humantime", 1594 | "libc", 1595 | "log", 1596 | "log-mdc", 1597 | "once_cell", 1598 | "parking_lot", 1599 | "rand", 1600 | "serde", 1601 | "serde-value", 1602 | "serde_json", 1603 | "serde_yaml", 1604 | "thiserror 1.0.69", 1605 | "thread-id", 1606 | "typemap-ors", 1607 | "winapi", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "mac_address" 1612 | version = "1.1.7" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "8836fae9d0d4be2c8b4efcdd79e828a2faa058a90d005abf42f91cac5493a08e" 1615 | dependencies = [ 1616 | "nix 0.28.0", 1617 | "winapi", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "memchr" 1622 | version = "2.7.4" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1625 | 1626 | [[package]] 1627 | name = "memmem" 1628 | version = "0.1.1" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" 1631 | 1632 | [[package]] 1633 | name = "memoffset" 1634 | version = "0.6.5" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1637 | dependencies = [ 1638 | "autocfg", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "memoffset" 1643 | version = "0.7.1" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" 1646 | dependencies = [ 1647 | "autocfg", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "memoffset" 1652 | version = "0.9.1" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 1655 | dependencies = [ 1656 | "autocfg", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "miette" 1661 | version = "5.10.0" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" 1664 | dependencies = [ 1665 | "backtrace", 1666 | "backtrace-ext", 1667 | "is-terminal", 1668 | "miette-derive", 1669 | "once_cell", 1670 | "owo-colors", 1671 | "supports-color", 1672 | "supports-hyperlinks", 1673 | "supports-unicode", 1674 | "terminal_size", 1675 | "textwrap 0.15.2", 1676 | "thiserror 1.0.69", 1677 | "unicode-width 0.1.14", 1678 | ] 1679 | 1680 | [[package]] 1681 | name = "miette-derive" 1682 | version = "5.10.0" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" 1685 | dependencies = [ 1686 | "proc-macro2", 1687 | "quote", 1688 | "syn 2.0.94", 1689 | ] 1690 | 1691 | [[package]] 1692 | name = "mime" 1693 | version = "0.3.17" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1696 | 1697 | [[package]] 1698 | name = "minimal-lexical" 1699 | version = "0.2.1" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1702 | 1703 | [[package]] 1704 | name = "miniz_oxide" 1705 | version = "0.8.2" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" 1708 | dependencies = [ 1709 | "adler2", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "mio" 1714 | version = "0.8.11" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1717 | dependencies = [ 1718 | "libc", 1719 | "log", 1720 | "wasi", 1721 | "windows-sys 0.48.0", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "monocle" 1726 | version = "0.100.1" 1727 | dependencies = [ 1728 | "fuzzy-matcher", 1729 | "ignore", 1730 | "serde", 1731 | "serde_json", 1732 | "strip-ansi-escapes 0.2.0", 1733 | "unicode-width 0.2.0", 1734 | "zellij-tile", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "multimap" 1739 | version = "0.8.3" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" 1742 | 1743 | [[package]] 1744 | name = "nix" 1745 | version = "0.23.2" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" 1748 | dependencies = [ 1749 | "bitflags 1.3.2", 1750 | "cc", 1751 | "cfg-if", 1752 | "libc", 1753 | "memoffset 0.6.5", 1754 | ] 1755 | 1756 | [[package]] 1757 | name = "nix" 1758 | version = "0.26.4" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" 1761 | dependencies = [ 1762 | "bitflags 1.3.2", 1763 | "cfg-if", 1764 | "libc", 1765 | "memoffset 0.7.1", 1766 | "pin-utils", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "nix" 1771 | version = "0.28.0" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" 1774 | dependencies = [ 1775 | "bitflags 2.6.0", 1776 | "cfg-if", 1777 | "cfg_aliases", 1778 | "libc", 1779 | "memoffset 0.9.1", 1780 | ] 1781 | 1782 | [[package]] 1783 | name = "nom" 1784 | version = "7.1.3" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1787 | dependencies = [ 1788 | "memchr", 1789 | "minimal-lexical", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "notify" 1794 | version = "6.1.1" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" 1797 | dependencies = [ 1798 | "bitflags 2.6.0", 1799 | "crossbeam-channel", 1800 | "filetime", 1801 | "fsevent-sys", 1802 | "inotify", 1803 | "kqueue", 1804 | "libc", 1805 | "log", 1806 | "mio", 1807 | "walkdir", 1808 | "windows-sys 0.48.0", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "notify-debouncer-full" 1813 | version = "0.1.0" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "f4812c1eb49be776fb8df4961623bdc01ec9dfdc1abe8211ceb09150a2e64219" 1816 | dependencies = [ 1817 | "crossbeam-channel", 1818 | "file-id", 1819 | "notify", 1820 | "parking_lot", 1821 | "walkdir", 1822 | ] 1823 | 1824 | [[package]] 1825 | name = "num-derive" 1826 | version = "0.3.3" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 1829 | dependencies = [ 1830 | "proc-macro2", 1831 | "quote", 1832 | "syn 1.0.109", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "num-traits" 1837 | version = "0.2.19" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1840 | dependencies = [ 1841 | "autocfg", 1842 | ] 1843 | 1844 | [[package]] 1845 | name = "object" 1846 | version = "0.36.7" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1849 | dependencies = [ 1850 | "memchr", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "once_cell" 1855 | version = "1.20.2" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1858 | 1859 | [[package]] 1860 | name = "openssl-probe" 1861 | version = "0.1.5" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1864 | 1865 | [[package]] 1866 | name = "openssl-sys" 1867 | version = "0.9.104" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" 1870 | dependencies = [ 1871 | "cc", 1872 | "libc", 1873 | "pkg-config", 1874 | "vcpkg", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "option-ext" 1879 | version = "0.2.0" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1882 | 1883 | [[package]] 1884 | name = "ordered-float" 1885 | version = "2.10.1" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" 1888 | dependencies = [ 1889 | "num-traits", 1890 | ] 1891 | 1892 | [[package]] 1893 | name = "ordered-float" 1894 | version = "4.6.0" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" 1897 | dependencies = [ 1898 | "num-traits", 1899 | ] 1900 | 1901 | [[package]] 1902 | name = "os_str_bytes" 1903 | version = "6.6.1" 1904 | source = "registry+https://github.com/rust-lang/crates.io-index" 1905 | checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" 1906 | 1907 | [[package]] 1908 | name = "owo-colors" 1909 | version = "3.5.0" 1910 | source = "registry+https://github.com/rust-lang/crates.io-index" 1911 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 1912 | 1913 | [[package]] 1914 | name = "parking" 1915 | version = "2.2.1" 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" 1917 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1918 | 1919 | [[package]] 1920 | name = "parking_lot" 1921 | version = "0.12.3" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1924 | dependencies = [ 1925 | "lock_api", 1926 | "parking_lot_core", 1927 | ] 1928 | 1929 | [[package]] 1930 | name = "parking_lot_core" 1931 | version = "0.9.10" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1934 | dependencies = [ 1935 | "cfg-if", 1936 | "libc", 1937 | "redox_syscall", 1938 | "smallvec", 1939 | "windows-targets 0.52.6", 1940 | ] 1941 | 1942 | [[package]] 1943 | name = "paste" 1944 | version = "1.0.15" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1947 | 1948 | [[package]] 1949 | name = "percent-encoding" 1950 | version = "2.3.1" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1953 | 1954 | [[package]] 1955 | name = "pest" 1956 | version = "2.7.15" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" 1959 | dependencies = [ 1960 | "memchr", 1961 | "thiserror 2.0.9", 1962 | "ucd-trie", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "pest_derive" 1967 | version = "2.7.15" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" 1970 | dependencies = [ 1971 | "pest", 1972 | "pest_generator", 1973 | ] 1974 | 1975 | [[package]] 1976 | name = "pest_generator" 1977 | version = "2.7.15" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" 1980 | dependencies = [ 1981 | "pest", 1982 | "pest_meta", 1983 | "proc-macro2", 1984 | "quote", 1985 | "syn 2.0.94", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "pest_meta" 1990 | version = "2.7.15" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" 1993 | dependencies = [ 1994 | "once_cell", 1995 | "pest", 1996 | "sha2", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "petgraph" 2001 | version = "0.6.5" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" 2004 | dependencies = [ 2005 | "fixedbitset", 2006 | "indexmap 2.7.0", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "phf" 2011 | version = "0.11.2" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 2014 | dependencies = [ 2015 | "phf_macros", 2016 | "phf_shared", 2017 | ] 2018 | 2019 | [[package]] 2020 | name = "phf_codegen" 2021 | version = "0.11.2" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" 2024 | dependencies = [ 2025 | "phf_generator", 2026 | "phf_shared", 2027 | ] 2028 | 2029 | [[package]] 2030 | name = "phf_generator" 2031 | version = "0.11.2" 2032 | source = "registry+https://github.com/rust-lang/crates.io-index" 2033 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 2034 | dependencies = [ 2035 | "phf_shared", 2036 | "rand", 2037 | ] 2038 | 2039 | [[package]] 2040 | name = "phf_macros" 2041 | version = "0.11.2" 2042 | source = "registry+https://github.com/rust-lang/crates.io-index" 2043 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 2044 | dependencies = [ 2045 | "phf_generator", 2046 | "phf_shared", 2047 | "proc-macro2", 2048 | "quote", 2049 | "syn 2.0.94", 2050 | ] 2051 | 2052 | [[package]] 2053 | name = "phf_shared" 2054 | version = "0.11.2" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 2057 | dependencies = [ 2058 | "siphasher", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "pin-project" 2063 | version = "1.1.7" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" 2066 | dependencies = [ 2067 | "pin-project-internal", 2068 | ] 2069 | 2070 | [[package]] 2071 | name = "pin-project-internal" 2072 | version = "1.1.7" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" 2075 | dependencies = [ 2076 | "proc-macro2", 2077 | "quote", 2078 | "syn 2.0.94", 2079 | ] 2080 | 2081 | [[package]] 2082 | name = "pin-project-lite" 2083 | version = "0.2.15" 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" 2085 | checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" 2086 | 2087 | [[package]] 2088 | name = "pin-utils" 2089 | version = "0.1.0" 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" 2091 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2092 | 2093 | [[package]] 2094 | name = "piper" 2095 | version = "0.2.4" 2096 | source = "registry+https://github.com/rust-lang/crates.io-index" 2097 | checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 2098 | dependencies = [ 2099 | "atomic-waker", 2100 | "fastrand 2.3.0", 2101 | "futures-io", 2102 | ] 2103 | 2104 | [[package]] 2105 | name = "pkg-config" 2106 | version = "0.3.31" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 2109 | 2110 | [[package]] 2111 | name = "polling" 2112 | version = "2.8.0" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" 2115 | dependencies = [ 2116 | "autocfg", 2117 | "bitflags 1.3.2", 2118 | "cfg-if", 2119 | "concurrent-queue", 2120 | "libc", 2121 | "log", 2122 | "pin-project-lite", 2123 | "windows-sys 0.48.0", 2124 | ] 2125 | 2126 | [[package]] 2127 | name = "polling" 2128 | version = "3.7.4" 2129 | source = "registry+https://github.com/rust-lang/crates.io-index" 2130 | checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" 2131 | dependencies = [ 2132 | "cfg-if", 2133 | "concurrent-queue", 2134 | "hermit-abi 0.4.0", 2135 | "pin-project-lite", 2136 | "rustix", 2137 | "tracing", 2138 | "windows-sys 0.59.0", 2139 | ] 2140 | 2141 | [[package]] 2142 | name = "ppv-lite86" 2143 | version = "0.2.20" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 2146 | dependencies = [ 2147 | "zerocopy", 2148 | ] 2149 | 2150 | [[package]] 2151 | name = "prettyplease" 2152 | version = "0.1.25" 2153 | source = "registry+https://github.com/rust-lang/crates.io-index" 2154 | checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" 2155 | dependencies = [ 2156 | "proc-macro2", 2157 | "syn 1.0.109", 2158 | ] 2159 | 2160 | [[package]] 2161 | name = "proc-macro-error" 2162 | version = "1.0.4" 2163 | source = "registry+https://github.com/rust-lang/crates.io-index" 2164 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2165 | dependencies = [ 2166 | "proc-macro-error-attr", 2167 | "proc-macro2", 2168 | "quote", 2169 | "syn 1.0.109", 2170 | "version_check", 2171 | ] 2172 | 2173 | [[package]] 2174 | name = "proc-macro-error-attr" 2175 | version = "1.0.4" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2178 | dependencies = [ 2179 | "proc-macro2", 2180 | "quote", 2181 | "version_check", 2182 | ] 2183 | 2184 | [[package]] 2185 | name = "proc-macro2" 2186 | version = "1.0.92" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" 2189 | dependencies = [ 2190 | "unicode-ident", 2191 | ] 2192 | 2193 | [[package]] 2194 | name = "prost" 2195 | version = "0.11.9" 2196 | source = "registry+https://github.com/rust-lang/crates.io-index" 2197 | checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" 2198 | dependencies = [ 2199 | "bytes", 2200 | "prost-derive", 2201 | ] 2202 | 2203 | [[package]] 2204 | name = "prost-build" 2205 | version = "0.11.9" 2206 | source = "registry+https://github.com/rust-lang/crates.io-index" 2207 | checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" 2208 | dependencies = [ 2209 | "bytes", 2210 | "heck 0.4.1", 2211 | "itertools", 2212 | "lazy_static", 2213 | "log", 2214 | "multimap", 2215 | "petgraph", 2216 | "prettyplease", 2217 | "prost", 2218 | "prost-types", 2219 | "regex", 2220 | "syn 1.0.109", 2221 | "tempfile", 2222 | "which", 2223 | ] 2224 | 2225 | [[package]] 2226 | name = "prost-derive" 2227 | version = "0.11.9" 2228 | source = "registry+https://github.com/rust-lang/crates.io-index" 2229 | checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" 2230 | dependencies = [ 2231 | "anyhow", 2232 | "itertools", 2233 | "proc-macro2", 2234 | "quote", 2235 | "syn 1.0.109", 2236 | ] 2237 | 2238 | [[package]] 2239 | name = "prost-types" 2240 | version = "0.11.9" 2241 | source = "registry+https://github.com/rust-lang/crates.io-index" 2242 | checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" 2243 | dependencies = [ 2244 | "prost", 2245 | ] 2246 | 2247 | [[package]] 2248 | name = "quote" 2249 | version = "1.0.38" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 2252 | dependencies = [ 2253 | "proc-macro2", 2254 | ] 2255 | 2256 | [[package]] 2257 | name = "rand" 2258 | version = "0.8.5" 2259 | source = "registry+https://github.com/rust-lang/crates.io-index" 2260 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2261 | dependencies = [ 2262 | "libc", 2263 | "rand_chacha", 2264 | "rand_core", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "rand_chacha" 2269 | version = "0.3.1" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2272 | dependencies = [ 2273 | "ppv-lite86", 2274 | "rand_core", 2275 | ] 2276 | 2277 | [[package]] 2278 | name = "rand_core" 2279 | version = "0.6.4" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2282 | dependencies = [ 2283 | "getrandom", 2284 | ] 2285 | 2286 | [[package]] 2287 | name = "redox_syscall" 2288 | version = "0.5.8" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 2291 | dependencies = [ 2292 | "bitflags 2.6.0", 2293 | ] 2294 | 2295 | [[package]] 2296 | name = "redox_users" 2297 | version = "0.4.6" 2298 | source = "registry+https://github.com/rust-lang/crates.io-index" 2299 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 2300 | dependencies = [ 2301 | "getrandom", 2302 | "libredox", 2303 | "thiserror 1.0.69", 2304 | ] 2305 | 2306 | [[package]] 2307 | name = "regex" 2308 | version = "1.11.1" 2309 | source = "registry+https://github.com/rust-lang/crates.io-index" 2310 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 2311 | dependencies = [ 2312 | "aho-corasick", 2313 | "memchr", 2314 | "regex-automata", 2315 | "regex-syntax", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "regex-automata" 2320 | version = "0.4.9" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 2323 | dependencies = [ 2324 | "aho-corasick", 2325 | "memchr", 2326 | "regex-syntax", 2327 | ] 2328 | 2329 | [[package]] 2330 | name = "regex-syntax" 2331 | version = "0.8.5" 2332 | source = "registry+https://github.com/rust-lang/crates.io-index" 2333 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 2334 | 2335 | [[package]] 2336 | name = "rmp" 2337 | version = "0.8.14" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" 2340 | dependencies = [ 2341 | "byteorder", 2342 | "num-traits", 2343 | "paste", 2344 | ] 2345 | 2346 | [[package]] 2347 | name = "rmp-serde" 2348 | version = "1.3.0" 2349 | source = "registry+https://github.com/rust-lang/crates.io-index" 2350 | checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" 2351 | dependencies = [ 2352 | "byteorder", 2353 | "rmp", 2354 | "serde", 2355 | ] 2356 | 2357 | [[package]] 2358 | name = "rustc-demangle" 2359 | version = "0.1.24" 2360 | source = "registry+https://github.com/rust-lang/crates.io-index" 2361 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2362 | 2363 | [[package]] 2364 | name = "rustc_version" 2365 | version = "0.4.1" 2366 | source = "registry+https://github.com/rust-lang/crates.io-index" 2367 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2368 | dependencies = [ 2369 | "semver 1.0.24", 2370 | ] 2371 | 2372 | [[package]] 2373 | name = "rustix" 2374 | version = "0.38.42" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" 2377 | dependencies = [ 2378 | "bitflags 2.6.0", 2379 | "errno", 2380 | "libc", 2381 | "linux-raw-sys", 2382 | "windows-sys 0.59.0", 2383 | ] 2384 | 2385 | [[package]] 2386 | name = "ryu" 2387 | version = "1.0.18" 2388 | source = "registry+https://github.com/rust-lang/crates.io-index" 2389 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 2390 | 2391 | [[package]] 2392 | name = "same-file" 2393 | version = "1.0.6" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2396 | dependencies = [ 2397 | "winapi-util", 2398 | ] 2399 | 2400 | [[package]] 2401 | name = "schannel" 2402 | version = "0.1.27" 2403 | source = "registry+https://github.com/rust-lang/crates.io-index" 2404 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 2405 | dependencies = [ 2406 | "windows-sys 0.59.0", 2407 | ] 2408 | 2409 | [[package]] 2410 | name = "scopeguard" 2411 | version = "1.2.0" 2412 | source = "registry+https://github.com/rust-lang/crates.io-index" 2413 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2414 | 2415 | [[package]] 2416 | name = "semver" 2417 | version = "0.11.0" 2418 | source = "registry+https://github.com/rust-lang/crates.io-index" 2419 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 2420 | dependencies = [ 2421 | "semver-parser", 2422 | ] 2423 | 2424 | [[package]] 2425 | name = "semver" 2426 | version = "1.0.24" 2427 | source = "registry+https://github.com/rust-lang/crates.io-index" 2428 | checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" 2429 | 2430 | [[package]] 2431 | name = "semver-parser" 2432 | version = "0.10.3" 2433 | source = "registry+https://github.com/rust-lang/crates.io-index" 2434 | checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" 2435 | dependencies = [ 2436 | "pest", 2437 | ] 2438 | 2439 | [[package]] 2440 | name = "serde" 2441 | version = "1.0.217" 2442 | source = "registry+https://github.com/rust-lang/crates.io-index" 2443 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 2444 | dependencies = [ 2445 | "serde_derive", 2446 | ] 2447 | 2448 | [[package]] 2449 | name = "serde-value" 2450 | version = "0.7.0" 2451 | source = "registry+https://github.com/rust-lang/crates.io-index" 2452 | checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" 2453 | dependencies = [ 2454 | "ordered-float 2.10.1", 2455 | "serde", 2456 | ] 2457 | 2458 | [[package]] 2459 | name = "serde_derive" 2460 | version = "1.0.217" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 2463 | dependencies = [ 2464 | "proc-macro2", 2465 | "quote", 2466 | "syn 2.0.94", 2467 | ] 2468 | 2469 | [[package]] 2470 | name = "serde_json" 2471 | version = "1.0.134" 2472 | source = "registry+https://github.com/rust-lang/crates.io-index" 2473 | checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" 2474 | dependencies = [ 2475 | "itoa", 2476 | "memchr", 2477 | "ryu", 2478 | "serde", 2479 | ] 2480 | 2481 | [[package]] 2482 | name = "serde_yaml" 2483 | version = "0.9.34+deprecated" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" 2486 | dependencies = [ 2487 | "indexmap 2.7.0", 2488 | "itoa", 2489 | "ryu", 2490 | "serde", 2491 | "unsafe-libyaml", 2492 | ] 2493 | 2494 | [[package]] 2495 | name = "sha2" 2496 | version = "0.10.8" 2497 | source = "registry+https://github.com/rust-lang/crates.io-index" 2498 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2499 | dependencies = [ 2500 | "cfg-if", 2501 | "cpufeatures", 2502 | "digest", 2503 | ] 2504 | 2505 | [[package]] 2506 | name = "shellexpand" 2507 | version = "3.1.0" 2508 | source = "registry+https://github.com/rust-lang/crates.io-index" 2509 | checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" 2510 | dependencies = [ 2511 | "dirs 5.0.1", 2512 | ] 2513 | 2514 | [[package]] 2515 | name = "shlex" 2516 | version = "1.3.0" 2517 | source = "registry+https://github.com/rust-lang/crates.io-index" 2518 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2519 | 2520 | [[package]] 2521 | name = "signal-hook" 2522 | version = "0.3.17" 2523 | source = "registry+https://github.com/rust-lang/crates.io-index" 2524 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 2525 | dependencies = [ 2526 | "libc", 2527 | "signal-hook-registry", 2528 | ] 2529 | 2530 | [[package]] 2531 | name = "signal-hook-registry" 2532 | version = "1.4.2" 2533 | source = "registry+https://github.com/rust-lang/crates.io-index" 2534 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2535 | dependencies = [ 2536 | "libc", 2537 | ] 2538 | 2539 | [[package]] 2540 | name = "siphasher" 2541 | version = "0.3.11" 2542 | source = "registry+https://github.com/rust-lang/crates.io-index" 2543 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 2544 | 2545 | [[package]] 2546 | name = "slab" 2547 | version = "0.4.9" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2550 | dependencies = [ 2551 | "autocfg", 2552 | ] 2553 | 2554 | [[package]] 2555 | name = "sluice" 2556 | version = "0.5.5" 2557 | source = "registry+https://github.com/rust-lang/crates.io-index" 2558 | checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" 2559 | dependencies = [ 2560 | "async-channel 1.9.0", 2561 | "futures-core", 2562 | "futures-io", 2563 | ] 2564 | 2565 | [[package]] 2566 | name = "smallvec" 2567 | version = "1.13.2" 2568 | source = "registry+https://github.com/rust-lang/crates.io-index" 2569 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2570 | 2571 | [[package]] 2572 | name = "smawk" 2573 | version = "0.3.2" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" 2576 | 2577 | [[package]] 2578 | name = "socket2" 2579 | version = "0.5.8" 2580 | source = "registry+https://github.com/rust-lang/crates.io-index" 2581 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 2582 | dependencies = [ 2583 | "libc", 2584 | "windows-sys 0.52.0", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "spinning" 2589 | version = "0.1.0" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" 2592 | dependencies = [ 2593 | "lock_api", 2594 | ] 2595 | 2596 | [[package]] 2597 | name = "stable_deref_trait" 2598 | version = "1.2.0" 2599 | source = "registry+https://github.com/rust-lang/crates.io-index" 2600 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2601 | 2602 | [[package]] 2603 | name = "strip-ansi-escapes" 2604 | version = "0.1.1" 2605 | source = "registry+https://github.com/rust-lang/crates.io-index" 2606 | checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8" 2607 | dependencies = [ 2608 | "vte 0.10.1", 2609 | ] 2610 | 2611 | [[package]] 2612 | name = "strip-ansi-escapes" 2613 | version = "0.2.0" 2614 | source = "registry+https://github.com/rust-lang/crates.io-index" 2615 | checksum = "55ff8ef943b384c414f54aefa961dd2bd853add74ec75e7ac74cf91dba62bcfa" 2616 | dependencies = [ 2617 | "vte 0.11.1", 2618 | ] 2619 | 2620 | [[package]] 2621 | name = "strsim" 2622 | version = "0.10.0" 2623 | source = "registry+https://github.com/rust-lang/crates.io-index" 2624 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2625 | 2626 | [[package]] 2627 | name = "strum" 2628 | version = "0.20.0" 2629 | source = "registry+https://github.com/rust-lang/crates.io-index" 2630 | checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" 2631 | 2632 | [[package]] 2633 | name = "strum_macros" 2634 | version = "0.20.1" 2635 | source = "registry+https://github.com/rust-lang/crates.io-index" 2636 | checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" 2637 | dependencies = [ 2638 | "heck 0.3.3", 2639 | "proc-macro2", 2640 | "quote", 2641 | "syn 1.0.109", 2642 | ] 2643 | 2644 | [[package]] 2645 | name = "supports-color" 2646 | version = "2.1.0" 2647 | source = "registry+https://github.com/rust-lang/crates.io-index" 2648 | checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89" 2649 | dependencies = [ 2650 | "is-terminal", 2651 | "is_ci", 2652 | ] 2653 | 2654 | [[package]] 2655 | name = "supports-hyperlinks" 2656 | version = "2.1.0" 2657 | source = "registry+https://github.com/rust-lang/crates.io-index" 2658 | checksum = "f84231692eb0d4d41e4cdd0cabfdd2e6cd9e255e65f80c9aa7c98dd502b4233d" 2659 | dependencies = [ 2660 | "is-terminal", 2661 | ] 2662 | 2663 | [[package]] 2664 | name = "supports-unicode" 2665 | version = "2.1.0" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "f850c19edd184a205e883199a261ed44471c81e39bd95b1357f5febbef00e77a" 2668 | dependencies = [ 2669 | "is-terminal", 2670 | ] 2671 | 2672 | [[package]] 2673 | name = "syn" 2674 | version = "1.0.109" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2677 | dependencies = [ 2678 | "proc-macro2", 2679 | "quote", 2680 | "unicode-ident", 2681 | ] 2682 | 2683 | [[package]] 2684 | name = "syn" 2685 | version = "2.0.94" 2686 | source = "registry+https://github.com/rust-lang/crates.io-index" 2687 | checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" 2688 | dependencies = [ 2689 | "proc-macro2", 2690 | "quote", 2691 | "unicode-ident", 2692 | ] 2693 | 2694 | [[package]] 2695 | name = "synstructure" 2696 | version = "0.13.1" 2697 | source = "registry+https://github.com/rust-lang/crates.io-index" 2698 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2699 | dependencies = [ 2700 | "proc-macro2", 2701 | "quote", 2702 | "syn 2.0.94", 2703 | ] 2704 | 2705 | [[package]] 2706 | name = "tempfile" 2707 | version = "3.14.0" 2708 | source = "registry+https://github.com/rust-lang/crates.io-index" 2709 | checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" 2710 | dependencies = [ 2711 | "cfg-if", 2712 | "fastrand 2.3.0", 2713 | "once_cell", 2714 | "rustix", 2715 | "windows-sys 0.59.0", 2716 | ] 2717 | 2718 | [[package]] 2719 | name = "termcolor" 2720 | version = "1.4.1" 2721 | source = "registry+https://github.com/rust-lang/crates.io-index" 2722 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 2723 | dependencies = [ 2724 | "winapi-util", 2725 | ] 2726 | 2727 | [[package]] 2728 | name = "terminal_size" 2729 | version = "0.1.17" 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" 2731 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 2732 | dependencies = [ 2733 | "libc", 2734 | "winapi", 2735 | ] 2736 | 2737 | [[package]] 2738 | name = "terminfo" 2739 | version = "0.8.0" 2740 | source = "registry+https://github.com/rust-lang/crates.io-index" 2741 | checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" 2742 | dependencies = [ 2743 | "dirs 4.0.0", 2744 | "fnv", 2745 | "nom", 2746 | "phf", 2747 | "phf_codegen", 2748 | ] 2749 | 2750 | [[package]] 2751 | name = "termios" 2752 | version = "0.3.3" 2753 | source = "registry+https://github.com/rust-lang/crates.io-index" 2754 | checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" 2755 | dependencies = [ 2756 | "libc", 2757 | ] 2758 | 2759 | [[package]] 2760 | name = "termwiz" 2761 | version = "0.22.0" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "5a75313e21da5d4406ea31402035b3b97aa74c04356bdfafa5d1043ab4e551d1" 2764 | dependencies = [ 2765 | "anyhow", 2766 | "base64", 2767 | "bitflags 2.6.0", 2768 | "fancy-regex", 2769 | "filedescriptor", 2770 | "finl_unicode", 2771 | "fixedbitset", 2772 | "hex", 2773 | "lazy_static", 2774 | "libc", 2775 | "log", 2776 | "memmem", 2777 | "nix 0.26.4", 2778 | "num-derive", 2779 | "num-traits", 2780 | "ordered-float 4.6.0", 2781 | "pest", 2782 | "pest_derive", 2783 | "phf", 2784 | "semver 0.11.0", 2785 | "sha2", 2786 | "signal-hook", 2787 | "siphasher", 2788 | "tempfile", 2789 | "terminfo", 2790 | "termios", 2791 | "thiserror 1.0.69", 2792 | "ucd-trie", 2793 | "unicode-segmentation", 2794 | "vtparse", 2795 | "wezterm-bidi", 2796 | "wezterm-blob-leases", 2797 | "wezterm-color-types", 2798 | "wezterm-dynamic", 2799 | "wezterm-input-types", 2800 | "winapi", 2801 | ] 2802 | 2803 | [[package]] 2804 | name = "textwrap" 2805 | version = "0.15.2" 2806 | source = "registry+https://github.com/rust-lang/crates.io-index" 2807 | checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" 2808 | dependencies = [ 2809 | "smawk", 2810 | "unicode-linebreak", 2811 | "unicode-width 0.1.14", 2812 | ] 2813 | 2814 | [[package]] 2815 | name = "textwrap" 2816 | version = "0.16.1" 2817 | source = "registry+https://github.com/rust-lang/crates.io-index" 2818 | checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" 2819 | 2820 | [[package]] 2821 | name = "thiserror" 2822 | version = "1.0.69" 2823 | source = "registry+https://github.com/rust-lang/crates.io-index" 2824 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2825 | dependencies = [ 2826 | "thiserror-impl 1.0.69", 2827 | ] 2828 | 2829 | [[package]] 2830 | name = "thiserror" 2831 | version = "2.0.9" 2832 | source = "registry+https://github.com/rust-lang/crates.io-index" 2833 | checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" 2834 | dependencies = [ 2835 | "thiserror-impl 2.0.9", 2836 | ] 2837 | 2838 | [[package]] 2839 | name = "thiserror-impl" 2840 | version = "1.0.69" 2841 | source = "registry+https://github.com/rust-lang/crates.io-index" 2842 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2843 | dependencies = [ 2844 | "proc-macro2", 2845 | "quote", 2846 | "syn 2.0.94", 2847 | ] 2848 | 2849 | [[package]] 2850 | name = "thiserror-impl" 2851 | version = "2.0.9" 2852 | source = "registry+https://github.com/rust-lang/crates.io-index" 2853 | checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" 2854 | dependencies = [ 2855 | "proc-macro2", 2856 | "quote", 2857 | "syn 2.0.94", 2858 | ] 2859 | 2860 | [[package]] 2861 | name = "thread-id" 2862 | version = "4.2.2" 2863 | source = "registry+https://github.com/rust-lang/crates.io-index" 2864 | checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" 2865 | dependencies = [ 2866 | "libc", 2867 | "winapi", 2868 | ] 2869 | 2870 | [[package]] 2871 | name = "thread_local" 2872 | version = "1.1.8" 2873 | source = "registry+https://github.com/rust-lang/crates.io-index" 2874 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2875 | dependencies = [ 2876 | "cfg-if", 2877 | "once_cell", 2878 | ] 2879 | 2880 | [[package]] 2881 | name = "tinystr" 2882 | version = "0.7.6" 2883 | source = "registry+https://github.com/rust-lang/crates.io-index" 2884 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2885 | dependencies = [ 2886 | "displaydoc", 2887 | "zerovec", 2888 | ] 2889 | 2890 | [[package]] 2891 | name = "to_method" 2892 | version = "1.1.0" 2893 | source = "registry+https://github.com/rust-lang/crates.io-index" 2894 | checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" 2895 | 2896 | [[package]] 2897 | name = "tracing" 2898 | version = "0.1.41" 2899 | source = "registry+https://github.com/rust-lang/crates.io-index" 2900 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2901 | dependencies = [ 2902 | "log", 2903 | "pin-project-lite", 2904 | "tracing-attributes", 2905 | "tracing-core", 2906 | ] 2907 | 2908 | [[package]] 2909 | name = "tracing-attributes" 2910 | version = "0.1.28" 2911 | source = "registry+https://github.com/rust-lang/crates.io-index" 2912 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2913 | dependencies = [ 2914 | "proc-macro2", 2915 | "quote", 2916 | "syn 2.0.94", 2917 | ] 2918 | 2919 | [[package]] 2920 | name = "tracing-core" 2921 | version = "0.1.33" 2922 | source = "registry+https://github.com/rust-lang/crates.io-index" 2923 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2924 | dependencies = [ 2925 | "once_cell", 2926 | ] 2927 | 2928 | [[package]] 2929 | name = "tracing-futures" 2930 | version = "0.2.5" 2931 | source = "registry+https://github.com/rust-lang/crates.io-index" 2932 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 2933 | dependencies = [ 2934 | "pin-project", 2935 | "tracing", 2936 | ] 2937 | 2938 | [[package]] 2939 | name = "typemap-ors" 2940 | version = "1.0.0" 2941 | source = "registry+https://github.com/rust-lang/crates.io-index" 2942 | checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" 2943 | dependencies = [ 2944 | "unsafe-any-ors", 2945 | ] 2946 | 2947 | [[package]] 2948 | name = "typenum" 2949 | version = "1.17.0" 2950 | source = "registry+https://github.com/rust-lang/crates.io-index" 2951 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2952 | 2953 | [[package]] 2954 | name = "ucd-trie" 2955 | version = "0.1.7" 2956 | source = "registry+https://github.com/rust-lang/crates.io-index" 2957 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2958 | 2959 | [[package]] 2960 | name = "unicode-ident" 2961 | version = "1.0.14" 2962 | source = "registry+https://github.com/rust-lang/crates.io-index" 2963 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 2964 | 2965 | [[package]] 2966 | name = "unicode-linebreak" 2967 | version = "0.1.5" 2968 | source = "registry+https://github.com/rust-lang/crates.io-index" 2969 | checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 2970 | 2971 | [[package]] 2972 | name = "unicode-segmentation" 2973 | version = "1.12.0" 2974 | source = "registry+https://github.com/rust-lang/crates.io-index" 2975 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2976 | 2977 | [[package]] 2978 | name = "unicode-width" 2979 | version = "0.1.14" 2980 | source = "registry+https://github.com/rust-lang/crates.io-index" 2981 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 2982 | 2983 | [[package]] 2984 | name = "unicode-width" 2985 | version = "0.2.0" 2986 | source = "registry+https://github.com/rust-lang/crates.io-index" 2987 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 2988 | 2989 | [[package]] 2990 | name = "unsafe-any-ors" 2991 | version = "1.0.0" 2992 | source = "registry+https://github.com/rust-lang/crates.io-index" 2993 | checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" 2994 | dependencies = [ 2995 | "destructure_traitobject", 2996 | ] 2997 | 2998 | [[package]] 2999 | name = "unsafe-libyaml" 3000 | version = "0.2.11" 3001 | source = "registry+https://github.com/rust-lang/crates.io-index" 3002 | checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" 3003 | 3004 | [[package]] 3005 | name = "url" 3006 | version = "2.5.4" 3007 | source = "registry+https://github.com/rust-lang/crates.io-index" 3008 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 3009 | dependencies = [ 3010 | "form_urlencoded", 3011 | "idna", 3012 | "percent-encoding", 3013 | "serde", 3014 | ] 3015 | 3016 | [[package]] 3017 | name = "utf16_iter" 3018 | version = "1.0.5" 3019 | source = "registry+https://github.com/rust-lang/crates.io-index" 3020 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 3021 | 3022 | [[package]] 3023 | name = "utf8_iter" 3024 | version = "1.0.4" 3025 | source = "registry+https://github.com/rust-lang/crates.io-index" 3026 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3027 | 3028 | [[package]] 3029 | name = "utf8parse" 3030 | version = "0.2.2" 3031 | source = "registry+https://github.com/rust-lang/crates.io-index" 3032 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3033 | 3034 | [[package]] 3035 | name = "uuid" 3036 | version = "1.11.0" 3037 | source = "registry+https://github.com/rust-lang/crates.io-index" 3038 | checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" 3039 | dependencies = [ 3040 | "atomic", 3041 | "getrandom", 3042 | "serde", 3043 | ] 3044 | 3045 | [[package]] 3046 | name = "value-bag" 3047 | version = "1.10.0" 3048 | source = "registry+https://github.com/rust-lang/crates.io-index" 3049 | checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" 3050 | 3051 | [[package]] 3052 | name = "vcpkg" 3053 | version = "0.2.15" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3056 | 3057 | [[package]] 3058 | name = "version_check" 3059 | version = "0.9.5" 3060 | source = "registry+https://github.com/rust-lang/crates.io-index" 3061 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3062 | 3063 | [[package]] 3064 | name = "vte" 3065 | version = "0.10.1" 3066 | source = "registry+https://github.com/rust-lang/crates.io-index" 3067 | checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" 3068 | dependencies = [ 3069 | "arrayvec", 3070 | "utf8parse", 3071 | "vte_generate_state_changes", 3072 | ] 3073 | 3074 | [[package]] 3075 | name = "vte" 3076 | version = "0.11.1" 3077 | source = "registry+https://github.com/rust-lang/crates.io-index" 3078 | checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" 3079 | dependencies = [ 3080 | "utf8parse", 3081 | "vte_generate_state_changes", 3082 | ] 3083 | 3084 | [[package]] 3085 | name = "vte_generate_state_changes" 3086 | version = "0.1.2" 3087 | source = "registry+https://github.com/rust-lang/crates.io-index" 3088 | checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" 3089 | dependencies = [ 3090 | "proc-macro2", 3091 | "quote", 3092 | ] 3093 | 3094 | [[package]] 3095 | name = "vtparse" 3096 | version = "0.6.2" 3097 | source = "registry+https://github.com/rust-lang/crates.io-index" 3098 | checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" 3099 | dependencies = [ 3100 | "utf8parse", 3101 | ] 3102 | 3103 | [[package]] 3104 | name = "waker-fn" 3105 | version = "1.2.0" 3106 | source = "registry+https://github.com/rust-lang/crates.io-index" 3107 | checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" 3108 | 3109 | [[package]] 3110 | name = "walkdir" 3111 | version = "2.5.0" 3112 | source = "registry+https://github.com/rust-lang/crates.io-index" 3113 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3114 | dependencies = [ 3115 | "same-file", 3116 | "winapi-util", 3117 | ] 3118 | 3119 | [[package]] 3120 | name = "wasi" 3121 | version = "0.11.0+wasi-snapshot-preview1" 3122 | source = "registry+https://github.com/rust-lang/crates.io-index" 3123 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3124 | 3125 | [[package]] 3126 | name = "wasm-bindgen" 3127 | version = "0.2.99" 3128 | source = "registry+https://github.com/rust-lang/crates.io-index" 3129 | checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" 3130 | dependencies = [ 3131 | "cfg-if", 3132 | "once_cell", 3133 | "wasm-bindgen-macro", 3134 | ] 3135 | 3136 | [[package]] 3137 | name = "wasm-bindgen-backend" 3138 | version = "0.2.99" 3139 | source = "registry+https://github.com/rust-lang/crates.io-index" 3140 | checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" 3141 | dependencies = [ 3142 | "bumpalo", 3143 | "log", 3144 | "proc-macro2", 3145 | "quote", 3146 | "syn 2.0.94", 3147 | "wasm-bindgen-shared", 3148 | ] 3149 | 3150 | [[package]] 3151 | name = "wasm-bindgen-futures" 3152 | version = "0.4.49" 3153 | source = "registry+https://github.com/rust-lang/crates.io-index" 3154 | checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" 3155 | dependencies = [ 3156 | "cfg-if", 3157 | "js-sys", 3158 | "once_cell", 3159 | "wasm-bindgen", 3160 | "web-sys", 3161 | ] 3162 | 3163 | [[package]] 3164 | name = "wasm-bindgen-macro" 3165 | version = "0.2.99" 3166 | source = "registry+https://github.com/rust-lang/crates.io-index" 3167 | checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" 3168 | dependencies = [ 3169 | "quote", 3170 | "wasm-bindgen-macro-support", 3171 | ] 3172 | 3173 | [[package]] 3174 | name = "wasm-bindgen-macro-support" 3175 | version = "0.2.99" 3176 | source = "registry+https://github.com/rust-lang/crates.io-index" 3177 | checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" 3178 | dependencies = [ 3179 | "proc-macro2", 3180 | "quote", 3181 | "syn 2.0.94", 3182 | "wasm-bindgen-backend", 3183 | "wasm-bindgen-shared", 3184 | ] 3185 | 3186 | [[package]] 3187 | name = "wasm-bindgen-shared" 3188 | version = "0.2.99" 3189 | source = "registry+https://github.com/rust-lang/crates.io-index" 3190 | checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" 3191 | 3192 | [[package]] 3193 | name = "web-sys" 3194 | version = "0.3.76" 3195 | source = "registry+https://github.com/rust-lang/crates.io-index" 3196 | checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" 3197 | dependencies = [ 3198 | "js-sys", 3199 | "wasm-bindgen", 3200 | ] 3201 | 3202 | [[package]] 3203 | name = "wezterm-bidi" 3204 | version = "0.2.3" 3205 | source = "registry+https://github.com/rust-lang/crates.io-index" 3206 | checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" 3207 | dependencies = [ 3208 | "log", 3209 | "wezterm-dynamic", 3210 | ] 3211 | 3212 | [[package]] 3213 | name = "wezterm-blob-leases" 3214 | version = "0.1.0" 3215 | source = "registry+https://github.com/rust-lang/crates.io-index" 3216 | checksum = "8e5a5e0adf7eed68976410def849a4bdab6f6e9f6163f152de9cb89deea9e60b" 3217 | dependencies = [ 3218 | "getrandom", 3219 | "mac_address", 3220 | "once_cell", 3221 | "sha2", 3222 | "thiserror 1.0.69", 3223 | "uuid", 3224 | ] 3225 | 3226 | [[package]] 3227 | name = "wezterm-color-types" 3228 | version = "0.3.0" 3229 | source = "registry+https://github.com/rust-lang/crates.io-index" 3230 | checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" 3231 | dependencies = [ 3232 | "csscolorparser", 3233 | "deltae", 3234 | "lazy_static", 3235 | "wezterm-dynamic", 3236 | ] 3237 | 3238 | [[package]] 3239 | name = "wezterm-dynamic" 3240 | version = "0.2.0" 3241 | source = "registry+https://github.com/rust-lang/crates.io-index" 3242 | checksum = "dfb128bacfa86734e07681fb6068e34c144698e84ee022d6e009145d1abb77b5" 3243 | dependencies = [ 3244 | "log", 3245 | "ordered-float 4.6.0", 3246 | "strsim", 3247 | "thiserror 1.0.69", 3248 | "wezterm-dynamic-derive", 3249 | ] 3250 | 3251 | [[package]] 3252 | name = "wezterm-dynamic-derive" 3253 | version = "0.1.0" 3254 | source = "registry+https://github.com/rust-lang/crates.io-index" 3255 | checksum = "0c9f5ef318442d07b3d071f9f43ea40b80992f87faee14bb4d017b6991c307f0" 3256 | dependencies = [ 3257 | "proc-macro2", 3258 | "quote", 3259 | "syn 1.0.109", 3260 | ] 3261 | 3262 | [[package]] 3263 | name = "wezterm-input-types" 3264 | version = "0.1.0" 3265 | source = "registry+https://github.com/rust-lang/crates.io-index" 3266 | checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" 3267 | dependencies = [ 3268 | "bitflags 1.3.2", 3269 | "euclid", 3270 | "lazy_static", 3271 | "wezterm-dynamic", 3272 | ] 3273 | 3274 | [[package]] 3275 | name = "which" 3276 | version = "4.4.2" 3277 | source = "registry+https://github.com/rust-lang/crates.io-index" 3278 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 3279 | dependencies = [ 3280 | "either", 3281 | "home", 3282 | "once_cell", 3283 | "rustix", 3284 | ] 3285 | 3286 | [[package]] 3287 | name = "winapi" 3288 | version = "0.3.9" 3289 | source = "registry+https://github.com/rust-lang/crates.io-index" 3290 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3291 | dependencies = [ 3292 | "winapi-i686-pc-windows-gnu", 3293 | "winapi-x86_64-pc-windows-gnu", 3294 | ] 3295 | 3296 | [[package]] 3297 | name = "winapi-i686-pc-windows-gnu" 3298 | version = "0.4.0" 3299 | source = "registry+https://github.com/rust-lang/crates.io-index" 3300 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3301 | 3302 | [[package]] 3303 | name = "winapi-util" 3304 | version = "0.1.9" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 3307 | dependencies = [ 3308 | "windows-sys 0.59.0", 3309 | ] 3310 | 3311 | [[package]] 3312 | name = "winapi-x86_64-pc-windows-gnu" 3313 | version = "0.4.0" 3314 | source = "registry+https://github.com/rust-lang/crates.io-index" 3315 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3316 | 3317 | [[package]] 3318 | name = "windows-core" 3319 | version = "0.52.0" 3320 | source = "registry+https://github.com/rust-lang/crates.io-index" 3321 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 3322 | dependencies = [ 3323 | "windows-targets 0.52.6", 3324 | ] 3325 | 3326 | [[package]] 3327 | name = "windows-sys" 3328 | version = "0.48.0" 3329 | source = "registry+https://github.com/rust-lang/crates.io-index" 3330 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3331 | dependencies = [ 3332 | "windows-targets 0.48.5", 3333 | ] 3334 | 3335 | [[package]] 3336 | name = "windows-sys" 3337 | version = "0.52.0" 3338 | source = "registry+https://github.com/rust-lang/crates.io-index" 3339 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3340 | dependencies = [ 3341 | "windows-targets 0.52.6", 3342 | ] 3343 | 3344 | [[package]] 3345 | name = "windows-sys" 3346 | version = "0.59.0" 3347 | source = "registry+https://github.com/rust-lang/crates.io-index" 3348 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3349 | dependencies = [ 3350 | "windows-targets 0.52.6", 3351 | ] 3352 | 3353 | [[package]] 3354 | name = "windows-targets" 3355 | version = "0.48.5" 3356 | source = "registry+https://github.com/rust-lang/crates.io-index" 3357 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3358 | dependencies = [ 3359 | "windows_aarch64_gnullvm 0.48.5", 3360 | "windows_aarch64_msvc 0.48.5", 3361 | "windows_i686_gnu 0.48.5", 3362 | "windows_i686_msvc 0.48.5", 3363 | "windows_x86_64_gnu 0.48.5", 3364 | "windows_x86_64_gnullvm 0.48.5", 3365 | "windows_x86_64_msvc 0.48.5", 3366 | ] 3367 | 3368 | [[package]] 3369 | name = "windows-targets" 3370 | version = "0.52.6" 3371 | source = "registry+https://github.com/rust-lang/crates.io-index" 3372 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3373 | dependencies = [ 3374 | "windows_aarch64_gnullvm 0.52.6", 3375 | "windows_aarch64_msvc 0.52.6", 3376 | "windows_i686_gnu 0.52.6", 3377 | "windows_i686_gnullvm", 3378 | "windows_i686_msvc 0.52.6", 3379 | "windows_x86_64_gnu 0.52.6", 3380 | "windows_x86_64_gnullvm 0.52.6", 3381 | "windows_x86_64_msvc 0.52.6", 3382 | ] 3383 | 3384 | [[package]] 3385 | name = "windows_aarch64_gnullvm" 3386 | version = "0.48.5" 3387 | source = "registry+https://github.com/rust-lang/crates.io-index" 3388 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3389 | 3390 | [[package]] 3391 | name = "windows_aarch64_gnullvm" 3392 | version = "0.52.6" 3393 | source = "registry+https://github.com/rust-lang/crates.io-index" 3394 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3395 | 3396 | [[package]] 3397 | name = "windows_aarch64_msvc" 3398 | version = "0.48.5" 3399 | source = "registry+https://github.com/rust-lang/crates.io-index" 3400 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3401 | 3402 | [[package]] 3403 | name = "windows_aarch64_msvc" 3404 | version = "0.52.6" 3405 | source = "registry+https://github.com/rust-lang/crates.io-index" 3406 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3407 | 3408 | [[package]] 3409 | name = "windows_i686_gnu" 3410 | version = "0.48.5" 3411 | source = "registry+https://github.com/rust-lang/crates.io-index" 3412 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3413 | 3414 | [[package]] 3415 | name = "windows_i686_gnu" 3416 | version = "0.52.6" 3417 | source = "registry+https://github.com/rust-lang/crates.io-index" 3418 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3419 | 3420 | [[package]] 3421 | name = "windows_i686_gnullvm" 3422 | version = "0.52.6" 3423 | source = "registry+https://github.com/rust-lang/crates.io-index" 3424 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3425 | 3426 | [[package]] 3427 | name = "windows_i686_msvc" 3428 | version = "0.48.5" 3429 | source = "registry+https://github.com/rust-lang/crates.io-index" 3430 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3431 | 3432 | [[package]] 3433 | name = "windows_i686_msvc" 3434 | version = "0.52.6" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3437 | 3438 | [[package]] 3439 | name = "windows_x86_64_gnu" 3440 | version = "0.48.5" 3441 | source = "registry+https://github.com/rust-lang/crates.io-index" 3442 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3443 | 3444 | [[package]] 3445 | name = "windows_x86_64_gnu" 3446 | version = "0.52.6" 3447 | source = "registry+https://github.com/rust-lang/crates.io-index" 3448 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3449 | 3450 | [[package]] 3451 | name = "windows_x86_64_gnullvm" 3452 | version = "0.48.5" 3453 | source = "registry+https://github.com/rust-lang/crates.io-index" 3454 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3455 | 3456 | [[package]] 3457 | name = "windows_x86_64_gnullvm" 3458 | version = "0.52.6" 3459 | source = "registry+https://github.com/rust-lang/crates.io-index" 3460 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3461 | 3462 | [[package]] 3463 | name = "windows_x86_64_msvc" 3464 | version = "0.48.5" 3465 | source = "registry+https://github.com/rust-lang/crates.io-index" 3466 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3467 | 3468 | [[package]] 3469 | name = "windows_x86_64_msvc" 3470 | version = "0.52.6" 3471 | source = "registry+https://github.com/rust-lang/crates.io-index" 3472 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3473 | 3474 | [[package]] 3475 | name = "write16" 3476 | version = "1.0.0" 3477 | source = "registry+https://github.com/rust-lang/crates.io-index" 3478 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 3479 | 3480 | [[package]] 3481 | name = "writeable" 3482 | version = "0.5.5" 3483 | source = "registry+https://github.com/rust-lang/crates.io-index" 3484 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 3485 | 3486 | [[package]] 3487 | name = "yoke" 3488 | version = "0.7.5" 3489 | source = "registry+https://github.com/rust-lang/crates.io-index" 3490 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 3491 | dependencies = [ 3492 | "serde", 3493 | "stable_deref_trait", 3494 | "yoke-derive", 3495 | "zerofrom", 3496 | ] 3497 | 3498 | [[package]] 3499 | name = "yoke-derive" 3500 | version = "0.7.5" 3501 | source = "registry+https://github.com/rust-lang/crates.io-index" 3502 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 3503 | dependencies = [ 3504 | "proc-macro2", 3505 | "quote", 3506 | "syn 2.0.94", 3507 | "synstructure", 3508 | ] 3509 | 3510 | [[package]] 3511 | name = "zellij-tile" 3512 | version = "0.41.2" 3513 | source = "registry+https://github.com/rust-lang/crates.io-index" 3514 | checksum = "00d9fa972c8b045359a1451ec55ee77906d6231592ef8cdb0a3f275972b21b96" 3515 | dependencies = [ 3516 | "clap", 3517 | "serde", 3518 | "serde_json", 3519 | "strum", 3520 | "strum_macros", 3521 | "zellij-utils", 3522 | ] 3523 | 3524 | [[package]] 3525 | name = "zellij-utils" 3526 | version = "0.41.2" 3527 | source = "registry+https://github.com/rust-lang/crates.io-index" 3528 | checksum = "0a791fae542909bccb8f8d8fcf521cfbe0af2c196526f2acbe67f4d7a5db6978" 3529 | dependencies = [ 3530 | "anyhow", 3531 | "async-channel 1.9.0", 3532 | "async-std", 3533 | "backtrace", 3534 | "bitflags 2.6.0", 3535 | "clap", 3536 | "clap_complete", 3537 | "colored", 3538 | "colorsys", 3539 | "crossbeam", 3540 | "directories", 3541 | "futures", 3542 | "humantime", 3543 | "include_dir", 3544 | "interprocess", 3545 | "isahc", 3546 | "kdl", 3547 | "lazy_static", 3548 | "libc", 3549 | "log", 3550 | "log4rs", 3551 | "miette", 3552 | "nix 0.23.2", 3553 | "notify-debouncer-full", 3554 | "once_cell", 3555 | "percent-encoding", 3556 | "prost", 3557 | "prost-build", 3558 | "regex", 3559 | "rmp-serde", 3560 | "serde", 3561 | "serde_json", 3562 | "shellexpand", 3563 | "signal-hook", 3564 | "strip-ansi-escapes 0.1.1", 3565 | "strum", 3566 | "strum_macros", 3567 | "tempfile", 3568 | "termwiz", 3569 | "thiserror 1.0.69", 3570 | "unicode-width 0.1.14", 3571 | "url", 3572 | "uuid", 3573 | "vte 0.11.1", 3574 | ] 3575 | 3576 | [[package]] 3577 | name = "zerocopy" 3578 | version = "0.7.35" 3579 | source = "registry+https://github.com/rust-lang/crates.io-index" 3580 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 3581 | dependencies = [ 3582 | "byteorder", 3583 | "zerocopy-derive", 3584 | ] 3585 | 3586 | [[package]] 3587 | name = "zerocopy-derive" 3588 | version = "0.7.35" 3589 | source = "registry+https://github.com/rust-lang/crates.io-index" 3590 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 3591 | dependencies = [ 3592 | "proc-macro2", 3593 | "quote", 3594 | "syn 2.0.94", 3595 | ] 3596 | 3597 | [[package]] 3598 | name = "zerofrom" 3599 | version = "0.1.5" 3600 | source = "registry+https://github.com/rust-lang/crates.io-index" 3601 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 3602 | dependencies = [ 3603 | "zerofrom-derive", 3604 | ] 3605 | 3606 | [[package]] 3607 | name = "zerofrom-derive" 3608 | version = "0.1.5" 3609 | source = "registry+https://github.com/rust-lang/crates.io-index" 3610 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 3611 | dependencies = [ 3612 | "proc-macro2", 3613 | "quote", 3614 | "syn 2.0.94", 3615 | "synstructure", 3616 | ] 3617 | 3618 | [[package]] 3619 | name = "zerovec" 3620 | version = "0.10.4" 3621 | source = "registry+https://github.com/rust-lang/crates.io-index" 3622 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 3623 | dependencies = [ 3624 | "yoke", 3625 | "zerofrom", 3626 | "zerovec-derive", 3627 | ] 3628 | 3629 | [[package]] 3630 | name = "zerovec-derive" 3631 | version = "0.10.3" 3632 | source = "registry+https://github.com/rust-lang/crates.io-index" 3633 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 3634 | dependencies = [ 3635 | "proc-macro2", 3636 | "quote", 3637 | "syn 2.0.94", 3638 | ] 3639 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "monocle" 3 | version = "0.100.1" 4 | authors = ["Aram Drevekenin "] 5 | edition = "2018" 6 | 7 | [dependencies] 8 | zellij-tile = "0.41.2" 9 | ignore = "0.4.23" 10 | fuzzy-matcher = "0.3.7" 11 | serde = { version = "1.0", features = ["derive"] } 12 | serde_json = "1.0" 13 | unicode-width = "0.2.0" 14 | strip-ansi-escapes = "0.2.0" 15 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Aram Drevekenin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![preview](https://github.com/imsnif/monocle/assets/795598/67c0332c-cc05-4e59-88fa-b7f9d5e9472a) 4 | 5 | ## About 6 | This [Zellij][zellij] plugin is a fuzzy finder for file names and their contents. 7 | 8 | It can open results in your `$EDITOR` (scrolled to the correct line), as floating or tiled panes. 9 | 10 | It can open a new terminal pane to the location of the file, as a floating or tiled pane. 11 | 12 | It will ignore hidden files and respect your `.gitignore`. If you press `ESC` or `Ctrl c`, it will hide itself until you call it again. 13 | 14 | [zellij]: https://github.com/zellij-org/zellij 15 | 16 | ## Try it out 17 | 18 | From inside Zellij: 19 | ``` 20 | zellij plugin -- https://github.com/imsnif/monocle/releases/latest/download/monocle.wasm 21 | ``` 22 | 23 | ## Permanent Installation 24 | 1. Download the `monocle.wasm` file from the latest release 25 | 2. Place it in `~/.config/zellij/plugins` 26 | 3. From inside Zellij, run `zellij plugin [--floating] [--in-place] -- file:~/.config/zellij/plugins/monocle.wasm` 27 | 28 | ## Kiosk Mode 29 | Monocle can be stared in "Kiosk Mode" - meaning that it will open files on top of itself instead of in a new pane. This can be especially powerful when combined with opening the monocle plugin itself "in-place". 30 | 31 | Example: 32 | ``` 33 | zellij plugin --configuration kiosk=true --in-place -- file:~/.config/zellij/plugins/monocle.wasm 34 | ``` 35 | 36 | ## How do I invoke monocle with a keybinding? 37 | Add the following to your [zellij config](https://zellij.dev/documentation/configuration.html) somewhere inside the [`keybinds`](https://zellij.dev/documentation/keybindings.html) section: 38 | ```kdl 39 | // bind F1 to open monocle in a new floating pane and open any results in a new tiled/floating pane 40 | bind "F1" { 41 | LaunchOrFocusPlugin "file:~/.config/zellij/plugins/monocle.wasm" { 42 | floating true 43 | }; 44 | SwitchToMode "Normal" 45 | } 46 | // bind "Alt m" to open monocle on top of the current pane and open any results on top of itself 47 | bind "Alt m" { 48 | LaunchPlugin "file:~/.config/zellij/plugins/monocle.wasm" { 49 | in_place true 50 | kiosk true 51 | }; 52 | SwitchToMode "Normal" 53 | } 54 | ``` 55 | 56 | ## Development 57 | 58 | Load the `dev.kdl` layout from inside zellij: `zellij action new-tab -l dev.kdl` or from outside Zellij with `zellij -l dev.kdl` 59 | 60 | ## Known issue 61 | Does not like (read: crashes on) device files and other non-file entities. This is an upstream issue with the Zellij version of wasmer. It is recommended not to use it inside system folders. 62 | -------------------------------------------------------------------------------- /dev.kdl: -------------------------------------------------------------------------------- 1 | layout { 2 | pane size=1 borderless=true { 3 | plugin location="zellij:tab-bar" 4 | } 5 | pane split_direction="vertical" { 6 | pane edit="src/main.rs" 7 | pane { 8 | pane command="bash" name="STDERR" { 9 | args "-c" "echo \"LOG RESTARTED\" > /tmp/zellij-1000/zellij-log/zellij.log && tail -f /tmp/zellij-1000/zellij-log/zellij.log" 10 | } 11 | pane stacked=true { 12 | pane size="10%" command="bash" name="COMPILE AND RELOAD PLUGIN" { 13 | args "-c" "cargo build && zellij action start-or-reload-plugin file:target/wasm32-wasi/debug/monocle.wasm" 14 | // if you have "watchexec" installed, you can comment the above line and uncomment the below one to build + reload the plugin on fs changes 15 | // args "-c" "watchexec 'cargo build && zellij action start-or-reload-plugin file:target/wasm32-wasi/debug/monocle.wasm'" 16 | } 17 | pane expanded=true { 18 | plugin location="file:target/wasm32-wasi/debug/monocle.wasm" 19 | } 20 | } 21 | } 22 | } 23 | pane size=2 borderless=true { 24 | plugin location="zellij:status-bar" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/backend_workers.rs: -------------------------------------------------------------------------------- 1 | use zellij_tile::prelude::*; 2 | 3 | use fuzzy_matcher::skim::SkimMatcherV2; 4 | use fuzzy_matcher::FuzzyMatcher; 5 | use ignore::Walk; 6 | use serde::{Deserialize, Serialize}; 7 | use std::collections::{BTreeMap, BTreeSet, HashMap}; 8 | use std::io::{self, BufRead}; 9 | use std::path::Path; 10 | use unicode_width::UnicodeWidthStr; 11 | 12 | use crate::search_results::{ResultsOfSearch, SearchResult}; 13 | use crate::{SearchType, CURRENT_SEARCH_TERM, ROOT}; 14 | 15 | static MAX_FILE_SIZE_BYTES: u64 = 1000000; 16 | 17 | #[derive(Default, Serialize, Deserialize)] 18 | pub struct Search { 19 | search_type: SearchType, 20 | file_names: BTreeSet, 21 | file_contents: BTreeMap<(String, usize), String>, // file_name, line_number, line 22 | cached_file_name_results: HashMap>, 23 | cached_file_contents_results: HashMap>, 24 | } 25 | 26 | impl Search { 27 | pub fn new(search_type: SearchType) -> Self { 28 | Search { 29 | search_type, 30 | ..Default::default() 31 | } 32 | } 33 | fn on_message(&mut self, message: String, _payload: String) { 34 | match serde_json::from_str::(&message) { 35 | Ok(MessageToSearch::ScanFolder) => { 36 | self.scan_hd(); 37 | post_message_to_plugin(PluginMessage::new_to_plugin( 38 | &serde_json::to_string(&MessageToPlugin::DoneScanningFolder).unwrap(), 39 | "", 40 | )); 41 | } 42 | Ok(MessageToSearch::Search) => { 43 | if let Some(current_search_term) = self.read_search_term_from_hd_cache() { 44 | self.search(current_search_term); 45 | } 46 | } 47 | Err(e) => eprintln!("Failed to deserialize worker message {:?}", e), 48 | } 49 | } 50 | pub fn scan_hd(&mut self) { 51 | for result in Walk::new(ROOT) { 52 | if let Ok(entry) = result { 53 | self.add_file_entry(entry.path(), entry.metadata().ok()); 54 | } 55 | } 56 | } 57 | pub fn search(&mut self, search_term: String) { 58 | let search_results_limit = 100; // artificial limit to prevent probably unwanted chaos 59 | let mut file_names_search_results = None; 60 | let mut file_contents_search_results = None; 61 | if let SearchType::Names | SearchType::NamesAndContents = self.search_type { 62 | let file_names_matches = match self.cached_file_name_results.get(&search_term) { 63 | Some(cached_results) => cached_results.clone(), 64 | None => { 65 | let mut matcher = SkimMatcherV2::default().use_cache(true); 66 | let results = self.search_file_names(&search_term, &mut matcher); 67 | self.cached_file_name_results 68 | .insert(search_term.clone(), results.clone()); 69 | results 70 | } 71 | }; 72 | file_names_search_results = Some( 73 | ResultsOfSearch::new(search_term.clone(), file_names_matches) 74 | .limit_search_results(search_results_limit), 75 | ); 76 | }; 77 | if let SearchType::Contents | SearchType::NamesAndContents = self.search_type { 78 | let file_contents_matches = match self.cached_file_contents_results.get(&search_term) { 79 | Some(cached_results) => cached_results.clone(), 80 | None => { 81 | let mut matcher = SkimMatcherV2::default().use_cache(true); 82 | let results = self.search_file_contents(&search_term, &mut matcher); 83 | self.cached_file_contents_results 84 | .insert(search_term.clone(), results.clone()); 85 | results 86 | } 87 | }; 88 | file_contents_search_results = Some( 89 | ResultsOfSearch::new(search_term.clone(), file_contents_matches) 90 | .limit_search_results(search_results_limit), 91 | ); 92 | }; 93 | 94 | // if the search term changed before we finished, let's search again! 95 | if let Some(current_search_term) = self.read_search_term_from_hd_cache() { 96 | if current_search_term != search_term { 97 | return self.search(current_search_term.into()); 98 | } 99 | } 100 | if let Some(file_names_search_results) = file_names_search_results { 101 | post_message_to_plugin(PluginMessage::new_to_plugin( 102 | &serde_json::to_string(&MessageToPlugin::UpdateFileNameSearchResults).unwrap(), 103 | &serde_json::to_string(&file_names_search_results).unwrap(), 104 | )); 105 | } 106 | if let Some(file_contents_search_results) = file_contents_search_results { 107 | post_message_to_plugin(PluginMessage::new_to_plugin( 108 | &serde_json::to_string(&MessageToPlugin::UpdateFileContentsSearchResults).unwrap(), 109 | &serde_json::to_string(&file_contents_search_results).unwrap(), 110 | )); 111 | } 112 | } 113 | fn add_file_entry(&mut self, file_name: &Path, file_metadata: Option) { 114 | let file_path = file_name.display().to_string(); 115 | let file_path_stripped_prefix = self.strip_file_prefix(&file_name); 116 | 117 | self.file_names.insert(file_path_stripped_prefix.clone()); 118 | if let SearchType::NamesAndContents | SearchType::Contents = self.search_type { 119 | if file_metadata.map(|f| f.is_file()).unwrap_or(false) { 120 | if let Ok(file) = std::fs::File::open(&file_path) { 121 | let file_size = file 122 | .metadata() 123 | .map(|f| f.len()) 124 | .unwrap_or(MAX_FILE_SIZE_BYTES); 125 | if file_size >= MAX_FILE_SIZE_BYTES { 126 | eprintln!( 127 | "File {} too large, not indexing its contents", 128 | file_name.display() 129 | ); 130 | return; 131 | } 132 | let lines = io::BufReader::with_capacity(file_size as usize, file).lines(); 133 | for (index, line) in lines.enumerate() { 134 | match line { 135 | Ok(line) => { 136 | self.file_contents.insert( 137 | (file_path_stripped_prefix.clone(), index + 1), 138 | String::from_utf8_lossy(&strip_ansi_escapes::strip(line)) 139 | .to_string(), 140 | ); 141 | } 142 | Err(_) => { 143 | break; // probably a binary file, skip it 144 | } 145 | } 146 | } 147 | } 148 | } 149 | } 150 | } 151 | fn search_file_names( 152 | &self, 153 | search_term: &str, 154 | matcher: &mut SkimMatcherV2, 155 | ) -> Vec { 156 | let mut matches = vec![]; 157 | for entry in &self.file_names { 158 | if let Some((score, indices)) = matcher.fuzzy_indices(&entry, &search_term) { 159 | matches.push(SearchResult::new_file_name( 160 | score, 161 | indices, 162 | entry.to_owned(), 163 | )); 164 | } 165 | } 166 | matches 167 | } 168 | fn search_file_contents( 169 | &self, 170 | search_term: &str, 171 | matcher: &mut SkimMatcherV2, 172 | ) -> Vec { 173 | let mut matches = vec![]; 174 | for ((file_name, line_number), line_entry) in &self.file_contents { 175 | if let Some((score, indices)) = matcher.fuzzy_indices(&line_entry, &search_term) { 176 | matches.push(SearchResult::new_file_line( 177 | score, 178 | indices, 179 | file_name.clone(), 180 | line_entry.clone(), 181 | *line_number, 182 | )); 183 | } 184 | } 185 | matches 186 | } 187 | fn strip_file_prefix(&self, file_name: &Path) -> String { 188 | let mut file_path_stripped_prefix = file_name.display().to_string().split_off(ROOT.width()); 189 | if file_path_stripped_prefix.starts_with('/') { 190 | file_path_stripped_prefix.remove(0); 191 | } 192 | file_path_stripped_prefix 193 | } 194 | fn read_search_term_from_hd_cache(&self) -> Option { 195 | match std::fs::read(CURRENT_SEARCH_TERM) { 196 | Ok(current_search_term) => { 197 | Some(String::from_utf8_lossy(¤t_search_term).to_string()) 198 | } 199 | _ => None, 200 | } 201 | } 202 | } 203 | 204 | #[derive(Serialize, Deserialize)] 205 | pub enum MessageToSearch { 206 | ScanFolder, 207 | Search, 208 | } 209 | 210 | #[derive(Serialize, Deserialize)] 211 | pub enum MessageToPlugin { 212 | UpdateFileNameSearchResults, 213 | UpdateFileContentsSearchResults, 214 | DoneScanningFolder, 215 | } 216 | 217 | #[derive(Serialize, Deserialize)] 218 | pub struct FileNameWorker { 219 | search: Search, 220 | } 221 | 222 | impl Default for FileNameWorker { 223 | fn default() -> Self { 224 | FileNameWorker { 225 | search: Search::new(SearchType::Names), 226 | } 227 | } 228 | } 229 | 230 | #[derive(Serialize, Deserialize)] 231 | pub struct FileContentsWorker { 232 | search: Search, 233 | } 234 | 235 | impl Default for FileContentsWorker { 236 | fn default() -> Self { 237 | FileContentsWorker { 238 | search: Search::new(SearchType::Contents), 239 | } 240 | } 241 | } 242 | 243 | impl<'de> ZellijWorker<'de> for FileNameWorker { 244 | fn on_message(&mut self, message: String, payload: String) { 245 | self.search.on_message(message, payload); 246 | } 247 | } 248 | 249 | impl<'de> ZellijWorker<'de> for FileContentsWorker { 250 | fn on_message(&mut self, message: String, payload: String) { 251 | self.search.on_message(message, payload); 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod backend_workers; 2 | mod search_results; 3 | mod ui; 4 | use zellij_tile::prelude::*; 5 | 6 | use serde::{Deserialize, Serialize}; 7 | use std::collections::BTreeMap; 8 | use std::path::PathBuf; 9 | 10 | use backend_workers::{FileContentsWorker, FileNameWorker, MessageToPlugin, MessageToSearch}; 11 | use search_results::{ResultsOfSearch, SearchResult}; 12 | 13 | pub const ROOT: &str = "/host"; 14 | pub const CURRENT_SEARCH_TERM: &str = "/data/current_search_term"; 15 | 16 | register_plugin!(State); 17 | register_worker!(FileNameWorker, file_name_search_worker, FILE_NAME_WORKER); 18 | register_worker!( 19 | FileContentsWorker, 20 | file_contents_search_worker, 21 | FILE_CONTENTS_WORKER 22 | ); 23 | 24 | #[derive(Default)] 25 | struct State { 26 | search_term: String, 27 | file_name_search_results: Vec, 28 | file_contents_search_results: Vec, 29 | loading: bool, 30 | loading_animation_offset: u8, 31 | should_open_floating: bool, 32 | search_filter: SearchType, 33 | display_rows: usize, 34 | display_columns: usize, 35 | displayed_search_results: (usize, Vec), // usize is selected index 36 | kiosk_mode: bool, // in this mode, monocle only opens files on top of itself 37 | } 38 | 39 | impl ZellijPlugin for State { 40 | fn load(&mut self, config: BTreeMap) { 41 | self.loading = true; 42 | self.kiosk_mode = config.get("kiosk").map(|k| k == "true").unwrap_or(false); 43 | if let Some(search_type) = config.get("search_filter") { 44 | match search_type.as_str() { 45 | "file_names" => self.search_filter = SearchType::Names, 46 | "file_contents" => self.search_filter = SearchType::Contents, 47 | "all" => self.search_filter = SearchType::NamesAndContents, 48 | _ => {} 49 | } 50 | } 51 | request_permission(&[ 52 | PermissionType::OpenFiles, 53 | PermissionType::ChangeApplicationState, 54 | PermissionType::OpenTerminalsOrPlugins, 55 | ]); 56 | subscribe(&[ 57 | EventType::Key, 58 | EventType::Mouse, 59 | EventType::CustomMessage, 60 | EventType::Timer, 61 | ]); 62 | post_message_to(PluginMessage::new_to_worker( 63 | "file_name_search", 64 | &serde_json::to_string(&MessageToSearch::ScanFolder).unwrap(), 65 | "", 66 | )); 67 | post_message_to(PluginMessage::new_to_worker( 68 | "file_contents_search", 69 | &serde_json::to_string(&MessageToSearch::ScanFolder).unwrap(), 70 | "", 71 | )); 72 | self.loading = true; 73 | set_timeout(0.5); // for displaying loading animation 74 | } 75 | 76 | fn update(&mut self, event: Event) -> bool { 77 | let mut should_render = false; 78 | match event { 79 | Event::Timer(_elapsed) => { 80 | if self.loading { 81 | set_timeout(0.5); 82 | self.progress_animation(); 83 | should_render = true; 84 | } 85 | } 86 | Event::CustomMessage(message, payload) => match serde_json::from_str(&message) { 87 | Ok(MessageToPlugin::UpdateFileNameSearchResults) => { 88 | if let Ok(results_of_search) = serde_json::from_str::(&payload) 89 | { 90 | self.update_file_name_search_results(results_of_search); 91 | should_render = true; 92 | } 93 | } 94 | Ok(MessageToPlugin::UpdateFileContentsSearchResults) => { 95 | if let Ok(results_of_search) = serde_json::from_str::(&payload) 96 | { 97 | self.update_file_contents_search_results(results_of_search); 98 | should_render = true; 99 | } 100 | } 101 | Ok(MessageToPlugin::DoneScanningFolder) => { 102 | self.loading = false; 103 | should_render = true; 104 | } 105 | Err(e) => eprintln!("Failed to deserialize custom message: {:?}", e), 106 | }, 107 | Event::Key(key) => { 108 | self.handle_key(key); 109 | should_render = true; 110 | } 111 | _ => { 112 | eprintln!("Unknown event: {}", event.to_string()); 113 | } 114 | } 115 | should_render 116 | } 117 | fn render(&mut self, rows: usize, cols: usize) { 118 | self.change_size(rows, cols); 119 | print!("{}", self); 120 | } 121 | } 122 | 123 | impl State { 124 | pub fn handle_key(&mut self, key: KeyWithModifier) { 125 | match key.bare_key { 126 | BareKey::Down => self.move_search_selection_down(), 127 | BareKey::Up => self.move_search_selection_up(), 128 | BareKey::Enter => self.open_search_result_in_editor(), 129 | BareKey::Tab => { 130 | self.open_search_result_in_terminal() 131 | } 132 | BareKey::Char('f') if key.has_modifiers(&[KeyModifier::Ctrl]) => { 133 | self.should_open_floating = !self.should_open_floating; 134 | } 135 | BareKey::Char('r') if key.has_modifiers(&[KeyModifier::Ctrl]) => { 136 | self.toggle_search_filter() 137 | } 138 | BareKey::Esc => { 139 | if !self.search_term.is_empty() { 140 | self.clear_state(); 141 | } else { 142 | hide_self(); 143 | } 144 | } 145 | BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => { 146 | if !self.search_term.is_empty() { 147 | self.clear_state(); 148 | } else { 149 | hide_self(); 150 | } 151 | } 152 | _ => self.append_to_search_term(key), 153 | } 154 | } 155 | pub fn update_file_name_search_results(&mut self, mut results_of_search: ResultsOfSearch) { 156 | if self.search_term == results_of_search.search_term { 157 | self.file_name_search_results = results_of_search.search_results.drain(..).collect(); 158 | self.update_displayed_search_results(); 159 | } 160 | } 161 | pub fn update_file_contents_search_results(&mut self, mut results_of_search: ResultsOfSearch) { 162 | if self.search_term == results_of_search.search_term { 163 | self.file_contents_search_results = 164 | results_of_search.search_results.drain(..).collect(); 165 | self.update_displayed_search_results(); 166 | } 167 | } 168 | pub fn change_size(&mut self, rows: usize, cols: usize) { 169 | self.display_rows = rows; 170 | self.display_columns = cols; 171 | } 172 | pub fn progress_animation(&mut self) { 173 | if self.loading_animation_offset == u8::MAX { 174 | self.loading_animation_offset = 0; 175 | } else { 176 | self.loading_animation_offset = self.loading_animation_offset.saturating_add(1); 177 | } 178 | } 179 | pub fn number_of_lines_in_displayed_search_results(&self) -> usize { 180 | self.displayed_search_results 181 | .1 182 | .iter() 183 | .map(|l| l.rendered_height()) 184 | .sum() 185 | } 186 | fn move_search_selection_down(&mut self) { 187 | if self.displayed_search_results.0 < self.max_search_selection_index() { 188 | self.displayed_search_results.0 += 1; 189 | } 190 | } 191 | fn move_search_selection_up(&mut self) { 192 | self.displayed_search_results.0 = self.displayed_search_results.0.saturating_sub(1); 193 | } 194 | fn open_search_result_in_editor(&mut self) { 195 | match self.selected_search_result_entry() { 196 | Some(SearchResult::File { path, .. }) => { 197 | let ctx = BTreeMap::new(); 198 | if self.kiosk_mode { 199 | open_file_in_place(FileToOpen::new(PathBuf::from(path)), ctx) 200 | } else if self.should_open_floating { 201 | open_file_floating(FileToOpen::new(PathBuf::from(path)), None, ctx) 202 | } else { 203 | open_file(FileToOpen::new(PathBuf::from(path)), ctx); 204 | } 205 | } 206 | Some(SearchResult::LineInFile { 207 | path, line_number, .. 208 | }) => { 209 | let ctx = BTreeMap::new(); 210 | if self.kiosk_mode { 211 | open_file_in_place( 212 | FileToOpen::new(PathBuf::from(path)).with_line_number(line_number), 213 | ctx, 214 | ); 215 | } else if self.should_open_floating { 216 | open_file_floating( 217 | FileToOpen::new(PathBuf::from(path)).with_line_number(line_number), 218 | None, 219 | ctx, 220 | ); 221 | } else { 222 | open_file( 223 | FileToOpen::new(PathBuf::from(path)).with_line_number(line_number), 224 | ctx, 225 | ); 226 | } 227 | } 228 | None => eprintln!("Search results not found"), 229 | } 230 | } 231 | fn open_search_result_in_terminal(&mut self) { 232 | let dir_path_of_result = |path: &str| -> PathBuf { 233 | let file_path = PathBuf::from(path); 234 | let mut dir_path = file_path.components(); 235 | dir_path.next_back(); // remove file name to stay with just the folder 236 | dir_path.as_path().into() 237 | }; 238 | let selected_search_result_entry = self.selected_search_result_entry(); 239 | if let Some(SearchResult::File { path, .. }) | Some(SearchResult::LineInFile { path, .. }) = 240 | selected_search_result_entry 241 | { 242 | let dir_path = dir_path_of_result(&path); 243 | if self.kiosk_mode { 244 | open_terminal_in_place(&dir_path); 245 | } else if self.should_open_floating { 246 | open_terminal_floating(&dir_path, None); 247 | } else { 248 | open_terminal(&dir_path); 249 | } 250 | } 251 | } 252 | fn toggle_search_filter(&mut self) { 253 | self.search_filter.progress(); 254 | self.send_search_query(); 255 | } 256 | fn clear_state(&mut self) { 257 | self.file_name_search_results.clear(); 258 | self.file_contents_search_results.clear(); 259 | self.displayed_search_results = (0, vec![]); 260 | self.search_term.clear(); 261 | } 262 | fn append_to_search_term(&mut self, key: KeyWithModifier) { 263 | match key.bare_key { 264 | BareKey::Char(character) => { 265 | self.search_term.push(character); 266 | } 267 | BareKey::Backspace => { 268 | self.search_term.pop(); 269 | if self.search_term.len() == 0 { 270 | self.clear_state(); 271 | } 272 | } 273 | _ => {} 274 | } 275 | self.send_search_query(); 276 | } 277 | fn send_search_query(&mut self) { 278 | match std::fs::write(CURRENT_SEARCH_TERM, &self.search_term) { 279 | Ok(_) => { 280 | if !self.search_term.is_empty() { 281 | post_message_to(PluginMessage::new_to_worker( 282 | "file_name_search", 283 | &serde_json::to_string(&MessageToSearch::Search).unwrap(), 284 | "", 285 | )); 286 | post_message_to(PluginMessage::new_to_worker( 287 | "file_contents_search", 288 | &serde_json::to_string(&MessageToSearch::Search).unwrap(), 289 | "", 290 | )); 291 | self.file_name_search_results.clear(); 292 | self.file_contents_search_results.clear(); 293 | } 294 | } 295 | Err(e) => eprintln!("Failed to write search term to HD, aborting search: {}", e), 296 | } 297 | } 298 | fn max_search_selection_index(&self) -> usize { 299 | self.displayed_search_results.1.len().saturating_sub(1) 300 | } 301 | fn update_displayed_search_results(&mut self) { 302 | if self.search_term.is_empty() { 303 | self.clear_state(); 304 | return; 305 | } 306 | let mut search_results_of_interest = match self.search_filter { 307 | SearchType::NamesAndContents => { 308 | let mut all_search_results = self.file_name_search_results.clone(); 309 | all_search_results.append(&mut self.file_contents_search_results.clone()); 310 | all_search_results.sort_by(|a, b| b.score().cmp(&a.score())); 311 | all_search_results 312 | } 313 | SearchType::Names => self.file_name_search_results.clone(), 314 | SearchType::Contents => self.file_contents_search_results.clone(), 315 | }; 316 | let mut height_taken_up_by_results = 0; 317 | let mut displayed_search_results = vec![]; 318 | for search_result in search_results_of_interest.drain(..) { 319 | if height_taken_up_by_results + search_result.rendered_height() 320 | > self.rows_for_results() 321 | { 322 | break; 323 | } 324 | height_taken_up_by_results += search_result.rendered_height(); 325 | displayed_search_results.push(search_result); 326 | } 327 | let new_index = self 328 | .selected_search_result_entry() 329 | .and_then(|currently_selected_search_result| { 330 | displayed_search_results 331 | .iter() 332 | .position(|r| r.is_same_entry(¤tly_selected_search_result)) 333 | }) 334 | .unwrap_or(0); 335 | self.displayed_search_results = (new_index, displayed_search_results); 336 | } 337 | fn selected_search_result_entry(&self) -> Option { 338 | self.displayed_search_results 339 | .1 340 | .get(self.displayed_search_results.0) 341 | .cloned() 342 | } 343 | pub fn rows_for_results(&self) -> usize { 344 | self.display_rows.saturating_sub(3) // search line and 2 controls lines 345 | } 346 | } 347 | 348 | #[derive(Serialize, Deserialize)] 349 | pub enum SearchType { 350 | NamesAndContents, 351 | Names, 352 | Contents, 353 | } 354 | 355 | impl SearchType { 356 | pub fn progress(&mut self) { 357 | match &self { 358 | &SearchType::NamesAndContents => *self = SearchType::Names, 359 | &SearchType::Names => *self = SearchType::Contents, 360 | &SearchType::Contents => *self = SearchType::NamesAndContents, 361 | } 362 | } 363 | } 364 | 365 | impl Default for SearchType { 366 | fn default() -> Self { 367 | SearchType::NamesAndContents 368 | } 369 | } 370 | -------------------------------------------------------------------------------- /src/search_results.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use unicode_width::{UnicodeWidthStr, UnicodeWidthChar}; 3 | 4 | use crate::ui::{ 5 | bold, styled_text, styled_text_background, styled_text_foreground, underline, GRAY_LIGHT, 6 | GREEN, ORANGE, 7 | }; 8 | 9 | #[derive(Serialize, Deserialize, Debug, Clone)] 10 | pub struct ResultsOfSearch { 11 | pub search_term: String, 12 | pub search_results: Vec, 13 | } 14 | 15 | impl ResultsOfSearch { 16 | pub fn new(search_term: String, search_results: Vec) -> Self { 17 | ResultsOfSearch { 18 | search_term, 19 | search_results, 20 | } 21 | } 22 | pub fn limit_search_results(mut self, max_results: usize) -> Self { 23 | self.search_results 24 | .sort_by(|a, b| b.score().cmp(&a.score())); 25 | self.search_results = if self.search_results.len() > max_results { 26 | self.search_results.drain(..max_results).collect() 27 | } else { 28 | self.search_results.drain(..).collect() 29 | }; 30 | self 31 | } 32 | } 33 | 34 | #[derive(Serialize, Deserialize, Debug, Clone)] 35 | pub enum SearchResult { 36 | File { 37 | path: String, 38 | score: i64, 39 | indices: Vec, 40 | }, 41 | LineInFile { 42 | path: String, 43 | line: String, 44 | line_number: usize, 45 | score: i64, 46 | indices: Vec, 47 | }, 48 | } 49 | 50 | impl SearchResult { 51 | pub fn new_file_name(score: i64, indices: Vec, path: String) -> Self { 52 | SearchResult::File { 53 | path, 54 | score, 55 | indices, 56 | } 57 | } 58 | pub fn new_file_line( 59 | score: i64, 60 | indices: Vec, 61 | path: String, 62 | line: String, 63 | line_number: usize, 64 | ) -> Self { 65 | SearchResult::LineInFile { 66 | path, 67 | score, 68 | indices, 69 | line, 70 | line_number, 71 | } 72 | } 73 | pub fn score(&self) -> i64 { 74 | match self { 75 | SearchResult::File { score, .. } => *score, 76 | SearchResult::LineInFile { score, .. } => *score, 77 | } 78 | } 79 | pub fn rendered_height(&self) -> usize { 80 | match self { 81 | SearchResult::File { .. } => 1, 82 | SearchResult::LineInFile { .. } => 2, 83 | } 84 | } 85 | pub fn is_same_entry(&self, other: &Self) -> bool { 86 | match (&self, other) { 87 | ( 88 | SearchResult::File { path: my_path, .. }, 89 | SearchResult::File { 90 | path: other_path, .. 91 | }, 92 | ) => my_path == other_path, 93 | ( 94 | SearchResult::LineInFile { 95 | path: my_path, 96 | line_number: my_line_number, 97 | .. 98 | }, 99 | SearchResult::LineInFile { 100 | path: other_path, 101 | line_number: other_line_number, 102 | .. 103 | }, 104 | ) => my_path == other_path && my_line_number == other_line_number, 105 | _ => false, 106 | } 107 | } 108 | pub fn render( 109 | &self, 110 | max_width: usize, 111 | is_selected: bool, 112 | is_below_search_result: bool, 113 | ) -> String { 114 | let max_width = max_width.saturating_sub(4); // for the UI left line separator 115 | match self { 116 | SearchResult::File { path, indices, .. } => self.render_file_result( 117 | path, 118 | indices, 119 | is_selected, 120 | is_below_search_result, 121 | max_width, 122 | ), 123 | SearchResult::LineInFile { 124 | path, 125 | line, 126 | line_number, 127 | indices, 128 | .. 129 | } => self.render_line_in_file_result( 130 | path, 131 | line, 132 | *line_number, 133 | indices, 134 | is_selected, 135 | is_below_search_result, 136 | max_width, 137 | ), 138 | } 139 | } 140 | fn render_file_result( 141 | &self, 142 | path: &String, 143 | indices: &Vec, 144 | is_selected: bool, 145 | is_below_search_result: bool, 146 | max_width: usize, 147 | ) -> String { 148 | if is_selected { 149 | let line = self.render_line_with_indices( 150 | path, 151 | indices, 152 | max_width.saturating_sub(3), 153 | Some(GREEN), 154 | ); 155 | let selection_arrow = styled_text_foreground(ORANGE, "┌>"); 156 | format!("{} {}", selection_arrow, line) 157 | } else { 158 | let line_prefix = if is_below_search_result { "│ " } else { " " }; 159 | let line = 160 | self.render_line_with_indices(path, indices, max_width.saturating_sub(3), None); 161 | format!("{} {}", line_prefix, line) 162 | } 163 | } 164 | fn render_line_in_file_result( 165 | &self, 166 | path: &String, 167 | line: &String, 168 | line_number: usize, 169 | indices: &Vec, 170 | is_selected: bool, 171 | is_below_search_result: bool, 172 | max_width: usize, 173 | ) -> String { 174 | let line_number_prefix_text = format!("└ {} ", line_number); 175 | let max_width_of_line_in_file = max_width 176 | .saturating_sub(3) 177 | .saturating_sub(line_number_prefix_text.width()); 178 | if is_selected { 179 | let file_name_line = self.render_line_with_indices( 180 | path, 181 | &vec![], 182 | max_width.saturating_sub(3), 183 | Some(GREEN), 184 | ); 185 | let line_in_file = self.render_line_with_indices( 186 | line, 187 | indices, 188 | max_width_of_line_in_file, 189 | Some(GREEN), 190 | ); 191 | let line_number_prefix = styled_text_foreground(GREEN, &bold(&line_number_prefix_text)); 192 | format!( 193 | "{} {}\n│ {}{}", 194 | styled_text_foreground(ORANGE, "┌>"), 195 | file_name_line, 196 | line_number_prefix, 197 | line_in_file 198 | ) 199 | } else { 200 | let file_name_line = 201 | self.render_line_with_indices(path, &vec![], max_width.saturating_sub(3), None); 202 | let line_in_file = 203 | self.render_line_with_indices(line, indices, max_width_of_line_in_file, None); 204 | let line_number_prefix = bold(&line_number_prefix_text); 205 | let line_prefix = if is_below_search_result { "│ " } else { " " }; 206 | format!( 207 | "{} {}\n{} {}{}", 208 | line_prefix, file_name_line, line_prefix, line_number_prefix, line_in_file 209 | ) 210 | } 211 | } 212 | fn render_line_with_indices( 213 | &self, 214 | line_to_render: &String, 215 | indices: &Vec, 216 | max_width: usize, 217 | foreground_color: Option, 218 | ) -> String { 219 | let non_index_character_style = |c: &str| match foreground_color { 220 | Some(foreground_color) => styled_text_foreground(foreground_color, &bold(c)), 221 | None => bold(c), 222 | }; 223 | let index_character_style = |c: &str| match foreground_color { 224 | Some(foreground_color) => { 225 | styled_text(foreground_color, GRAY_LIGHT, &bold(&underline(c))) 226 | } 227 | None => styled_text_background(GRAY_LIGHT, &bold(&underline(c))), 228 | }; 229 | 230 | let truncate_positions = 231 | self.truncate_line_with_indices(line_to_render, indices, max_width); 232 | let truncate_start_position = truncate_positions.map(|p| p.0).unwrap_or(0); 233 | let truncate_end_position = truncate_positions 234 | .map(|p| p.1) 235 | .unwrap_or(line_to_render.chars().count()); 236 | 237 | let left_truncate_sign = if truncate_start_position == 0 { 238 | "" 239 | } else { 240 | ".." 241 | }; 242 | let right_truncate_sign = if truncate_end_position == line_to_render.chars().count() { 243 | "" 244 | } else { 245 | ".." 246 | }; 247 | 248 | let max_width_for_visible_portion = max_width.saturating_sub(left_truncate_sign.chars().count()).saturating_sub(right_truncate_sign.chars().count()); 249 | let mut visible_portion = String::new(); 250 | let mut visible_characters = String::new(); 251 | for (i, character) in line_to_render.chars().enumerate() { 252 | if visible_characters.width() + character.width().unwrap_or(0) > max_width_for_visible_portion { 253 | break; 254 | } 255 | if i >= truncate_start_position && i <= truncate_end_position { 256 | if indices.contains(&i) { 257 | visible_portion.push_str(&index_character_style(&character.to_string())); 258 | } else { 259 | visible_portion.push_str(&non_index_character_style(&character.to_string())); 260 | } 261 | visible_characters.push(character); 262 | } 263 | } 264 | if truncate_positions.is_some() { 265 | format!( 266 | "{}{}{}", 267 | non_index_character_style(left_truncate_sign), 268 | visible_portion, 269 | non_index_character_style(right_truncate_sign) 270 | ) 271 | } else { 272 | visible_portion 273 | } 274 | } 275 | fn truncate_line_with_indices( 276 | &self, 277 | line_to_render: &String, 278 | indices: &Vec, 279 | max_width: usize, 280 | ) -> Option<(usize, usize)> { 281 | let first_index = indices.get(0).copied().unwrap_or(0); 282 | let last_index = indices 283 | .last() 284 | .copied() 285 | .unwrap_or_else(|| std::cmp::min(line_to_render.chars().count(), max_width)); 286 | if line_to_render.width() <= max_width { 287 | // there's enough room, no need to truncate 288 | None 289 | } else if last_index.saturating_sub(first_index) < max_width { 290 | // truncate around the indices 291 | let mut width_remaining = max_width 292 | .saturating_sub(1) 293 | .saturating_sub(last_index.saturating_sub(first_index)); 294 | 295 | let mut string_start_position = first_index; 296 | let mut string_end_position = last_index; 297 | 298 | let mut i = 0; 299 | loop { 300 | if i >= width_remaining { 301 | break; 302 | } 303 | if string_start_position > 0 && string_end_position < line_to_render.width() 304 | { 305 | let take_from_start = i % 2 == 0; 306 | if take_from_start { 307 | string_start_position -= 1; 308 | if string_start_position == 0 { 309 | width_remaining += 2; // no need for truncating dots 310 | } 311 | } else { 312 | string_end_position += 1; 313 | if string_end_position == line_to_render.width() { 314 | width_remaining += 2; // no need for truncating dots 315 | } 316 | } 317 | } else if string_end_position < line_to_render.width() { 318 | string_end_position += 1; 319 | if string_end_position == line_to_render.width() { 320 | width_remaining += 2; // no need for truncating dots 321 | } 322 | } else if string_start_position > 0 { 323 | string_start_position -= 1; 324 | if string_start_position == 0 { 325 | width_remaining += 2; // no need for truncating dots 326 | } 327 | } else { 328 | break; 329 | } 330 | i += 1; 331 | } 332 | Some((string_start_position, string_end_position)) 333 | } else if !indices.is_empty() { 334 | // no room for all indices, remove the last one and try again 335 | let mut new_indices = indices.clone(); 336 | new_indices.pop(); 337 | self.truncate_line_with_indices(line_to_render, &new_indices, max_width) 338 | } else { 339 | Some((first_index, last_index)) 340 | } 341 | } 342 | } 343 | -------------------------------------------------------------------------------- /src/ui/controls_line.rs: -------------------------------------------------------------------------------- 1 | use crate::ui::loading_animation::LoadingAnimation; 2 | use crate::ui::{ 3 | arrow, bold, color_line_to_end, dot, styled_text, BLACK, GRAY_DARK, GRAY_LIGHT, RED, WHITE, 4 | }; 5 | use crate::SearchType; 6 | 7 | #[derive(Default)] 8 | pub struct ControlsLine { 9 | controls: Vec, 10 | scanning_indication: Option>, 11 | animation_offset: u8, 12 | } 13 | 14 | impl ControlsLine { 15 | pub fn new(controls: Vec, scanning_indication: Option>) -> Self { 16 | ControlsLine { 17 | controls, 18 | scanning_indication, 19 | ..Default::default() 20 | } 21 | } 22 | pub fn with_animation_offset(mut self, animation_offset: u8) -> Self { 23 | self.animation_offset = animation_offset; 24 | self 25 | } 26 | pub fn render(&self, max_width: usize) -> String { 27 | let loading_animation = 28 | LoadingAnimation::new(&self.scanning_indication, self.animation_offset); 29 | let full_length = loading_animation.full_len() 30 | + self.controls.iter().map(|c| c.full_len()).sum::(); 31 | let mid_length = 32 | loading_animation.mid_len() + self.controls.iter().map(|c| c.mid_len()).sum::(); 33 | let short_length = loading_animation.short_len() 34 | + self.controls.iter().map(|c| c.short_len()).sum::(); 35 | if max_width >= full_length { 36 | let mut to_render = String::new(); 37 | for control in &self.controls { 38 | to_render.push_str(&control.render_full_length()); 39 | } 40 | to_render.push_str(&self.render_padding(max_width.saturating_sub(full_length))); 41 | to_render.push_str(&loading_animation.render_full_length()); 42 | to_render 43 | } else if max_width >= mid_length { 44 | let mut to_render = String::new(); 45 | for control in &self.controls { 46 | to_render.push_str(&control.render_mid_length()); 47 | } 48 | to_render.push_str(&self.render_padding(max_width.saturating_sub(mid_length))); 49 | to_render.push_str(&loading_animation.render_mid_length()); 50 | to_render 51 | } else if max_width >= short_length { 52 | let mut to_render = String::new(); 53 | for control in &self.controls { 54 | to_render.push_str(&control.render_short_length()); 55 | } 56 | to_render.push_str(&self.render_padding(max_width.saturating_sub(short_length))); 57 | to_render.push_str(&loading_animation.render_short_length()); 58 | to_render 59 | } else { 60 | format!("") 61 | } 62 | } 63 | pub fn render_empty_line(&self, max_width: usize) -> String { 64 | let loading_animation = 65 | LoadingAnimation::new(&self.scanning_indication, self.animation_offset); 66 | let mut to_render = String::new(); 67 | if max_width >= loading_animation.full_len() { 68 | to_render.push_str( 69 | &self.render_padding(max_width.saturating_sub(loading_animation.full_len())), 70 | ); 71 | to_render.push_str(&loading_animation.render_full_length()); 72 | } else if max_width >= loading_animation.mid_len() { 73 | to_render.push_str( 74 | &self.render_padding(max_width.saturating_sub(loading_animation.mid_len())), 75 | ); 76 | to_render.push_str(&loading_animation.render_mid_length()); 77 | } else if max_width >= loading_animation.short_len() { 78 | to_render.push_str( 79 | &self.render_padding(max_width.saturating_sub(loading_animation.short_len())), 80 | ); 81 | to_render.push_str(&loading_animation.render_short_length()); 82 | } 83 | to_render 84 | } 85 | fn render_padding(&self, padding: usize) -> String { 86 | // TODO: color whole line 87 | format!("{}\u{1b}[{}C", color_line_to_end(GRAY_LIGHT), padding) 88 | } 89 | } 90 | 91 | pub struct Control { 92 | key: &'static str, 93 | options: Vec<&'static str>, 94 | option_index: (usize, usize), // eg. 1 out of 2 (1, 2) 95 | keycode_background_color: u8, 96 | keycode_foreground_color: u8, 97 | control_text_background_color: u8, 98 | control_text_foreground_color: u8, 99 | active_dot_color: u8, 100 | } 101 | 102 | impl Default for Control { 103 | fn default() -> Self { 104 | Control { 105 | key: "", 106 | options: vec![], 107 | option_index: (0, 0), 108 | keycode_background_color: GRAY_LIGHT, 109 | keycode_foreground_color: WHITE, 110 | control_text_background_color: GRAY_DARK, 111 | control_text_foreground_color: BLACK, 112 | active_dot_color: RED, 113 | } 114 | } 115 | } 116 | 117 | impl Control { 118 | pub fn new( 119 | key: &'static str, 120 | options: Vec<&'static str>, 121 | option_index: (usize, usize), 122 | ) -> Self { 123 | Control { 124 | key, 125 | options, 126 | option_index, 127 | ..Default::default() 128 | } 129 | } 130 | pub fn new_floating_control(key: &'static str, should_open_floating: bool) -> Self { 131 | if should_open_floating { 132 | Control::new(key, vec!["OPEN FLOATING", "FLOATING", "F"], (2, 2)) 133 | } else { 134 | Control::new(key, vec!["OPEN TILED", "TILED", "T"], (1, 2)) 135 | } 136 | } 137 | pub fn new_filter_control(key: &'static str, search_filter: &SearchType) -> Self { 138 | match search_filter { 139 | SearchType::NamesAndContents => Control::new( 140 | key, 141 | vec!["FILE NAMES AND CONTENTS", "NAMES + CONTENTS", "N+C"], 142 | (1, 3), 143 | ), 144 | SearchType::Names => Control::new(key, vec!["FILE NAMES", "NAMES", "N"], (2, 3)), 145 | SearchType::Contents => { 146 | Control::new(key, vec!["FILE CONTENTS", "CONTENTS", "C"], (3, 3)) 147 | } 148 | } 149 | } 150 | pub fn short_len(&self) -> usize { 151 | let short_text = self 152 | .options 153 | .get(2) 154 | .or_else(|| self.options.get(1)) 155 | .or_else(|| self.options.get(0)) 156 | .unwrap_or(&""); 157 | short_text.chars().count() + self.key.chars().count() + self.option_index.1 + 7 158 | // 7 for all the spaces and decorations 159 | } 160 | pub fn mid_len(&self) -> usize { 161 | let mid_text = self 162 | .options 163 | .get(1) 164 | .or_else(|| self.options.get(0)) 165 | .unwrap_or(&""); 166 | mid_text.chars().count() + self.key.chars().count() + self.option_index.1 + 7 167 | // 7 for all the spaces and decorations 168 | } 169 | pub fn full_len(&self) -> usize { 170 | let full_text = self.options.get(0).unwrap_or(&""); 171 | full_text.chars().count() + self.key.chars().count() + self.option_index.1 + 7 172 | // 7 for all the spaces and decorations 173 | } 174 | pub fn render_short_length(&self) -> String { 175 | let short_text = self 176 | .options 177 | .get(2) 178 | .or_else(|| self.options.get(1)) 179 | .or_else(|| self.options.get(0)) 180 | .unwrap_or(&""); 181 | self.render(short_text) 182 | } 183 | pub fn render_mid_length(&self) -> String { 184 | let mid_text = self 185 | .options 186 | .get(1) 187 | .or_else(|| self.options.get(0)) 188 | .unwrap_or(&""); 189 | self.render(mid_text) 190 | } 191 | pub fn render_full_length(&self) -> String { 192 | let full_text = self.options.get(0).unwrap_or(&""); 193 | self.render(full_text) 194 | } 195 | fn render(&self, text: &str) -> String { 196 | format!( 197 | "{}{}{}{}{}{}", 198 | self.render_keycode(&format!(" {} ", self.key)), 199 | arrow( 200 | self.keycode_background_color, 201 | self.control_text_background_color 202 | ), 203 | self.render_selection_dots(), 204 | self.render_control_text(&format!("{} ", text)), 205 | arrow( 206 | self.control_text_background_color, 207 | self.keycode_background_color 208 | ), 209 | color_line_to_end(self.keycode_background_color), 210 | ) 211 | } 212 | fn render_keycode(&self, text: &str) -> String { 213 | styled_text( 214 | self.keycode_foreground_color, 215 | self.keycode_background_color, 216 | &bold(text), 217 | ) 218 | } 219 | fn render_control_text(&self, text: &str) -> String { 220 | styled_text( 221 | self.control_text_foreground_color, 222 | self.control_text_background_color, 223 | &bold(text), 224 | ) 225 | } 226 | fn render_selection_dots(&self) -> String { 227 | let mut selection_dots = String::from(" "); 228 | for i in 1..=self.option_index.1 { 229 | if i == self.option_index.0 { 230 | selection_dots.push_str(&dot( 231 | self.active_dot_color, 232 | self.control_text_background_color, 233 | )); 234 | } else { 235 | selection_dots.push_str(&dot( 236 | self.control_text_foreground_color, 237 | self.control_text_background_color, 238 | )); 239 | } 240 | } 241 | selection_dots.push_str(" "); 242 | selection_dots 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /src/ui/loading_animation.rs: -------------------------------------------------------------------------------- 1 | use crate::ui::{bold, styled_text, GRAY_LIGHT, WHITE}; 2 | 3 | pub struct LoadingAnimation { 4 | scanning_indication: Option>, 5 | animation_offset: u8, 6 | background_color: u8, 7 | foreground_color: u8, 8 | } 9 | impl LoadingAnimation { 10 | pub fn new(scanning_indication: &Option>, animation_offset: u8) -> Self { 11 | LoadingAnimation { 12 | scanning_indication: scanning_indication.clone(), 13 | animation_offset, 14 | background_color: GRAY_LIGHT, 15 | foreground_color: WHITE, 16 | } 17 | } 18 | pub fn full_len(&self) -> usize { 19 | self.scanning_indication 20 | .as_ref() 21 | .and_then(|scanning_indication| scanning_indication.get(0)) 22 | .map(|s| s.chars().count() + 3) // 3 for animation dots 23 | .unwrap_or(0) 24 | } 25 | pub fn mid_len(&self) -> usize { 26 | self.scanning_indication 27 | .as_ref() 28 | .and_then(|scanning_indication| { 29 | scanning_indication 30 | .get(1) 31 | .or_else(|| scanning_indication.get(0)) 32 | }) 33 | .map(|s| s.chars().count() + 3) // 3 for animation dots 34 | .unwrap_or(0) 35 | } 36 | pub fn short_len(&self) -> usize { 37 | self.scanning_indication 38 | .as_ref() 39 | .and_then(|scanning_indication| { 40 | scanning_indication 41 | .get(2) 42 | .or_else(|| scanning_indication.get(1)) 43 | .or_else(|| scanning_indication.get(0)) 44 | }) 45 | .map(|s| s.chars().count() + 3) // 3 for animation dots 46 | .unwrap_or(0) 47 | } 48 | pub fn render_full_length(&self) -> String { 49 | self.scanning_indication 50 | .as_ref() 51 | .and_then(|scanning_indication| scanning_indication.get(0)) 52 | .map(|s| { 53 | styled_text( 54 | self.foreground_color, 55 | self.background_color, 56 | &bold(&(s.to_string() + &self.animation_dots())), 57 | ) 58 | }) 59 | .unwrap_or_else(String::new) 60 | } 61 | pub fn render_mid_length(&self) -> String { 62 | self.scanning_indication 63 | .as_ref() 64 | .and_then(|scanning_indication| { 65 | scanning_indication 66 | .get(1) 67 | .or_else(|| scanning_indication.get(0)) 68 | }) 69 | .map(|s| { 70 | styled_text( 71 | self.background_color, 72 | self.foreground_color, 73 | &bold(&(s.to_string() + &self.animation_dots())), 74 | ) 75 | }) 76 | .unwrap_or_else(String::new) 77 | } 78 | pub fn render_short_length(&self) -> String { 79 | self.scanning_indication 80 | .as_ref() 81 | .and_then(|scanning_indication| { 82 | scanning_indication 83 | .get(2) 84 | .or_else(|| scanning_indication.get(1)) 85 | .or_else(|| scanning_indication.get(0)) 86 | }) 87 | .map(|s| { 88 | styled_text( 89 | self.background_color, 90 | self.foreground_color, 91 | &bold(&(s.to_string() + &self.animation_dots())), 92 | ) 93 | }) 94 | .unwrap_or_else(String::new) 95 | } 96 | fn animation_dots(&self) -> String { 97 | let mut to_render = String::from(""); 98 | let dot_count = self.animation_offset % 4; 99 | for _ in 0..dot_count { 100 | to_render.push('.'); 101 | } 102 | to_render 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/ui/mod.rs: -------------------------------------------------------------------------------- 1 | mod controls_line; 2 | mod loading_animation; 3 | mod selection_controls_area; 4 | 5 | use std::fmt::{Display, Formatter}; 6 | 7 | use crate::ui::controls_line::{Control, ControlsLine}; 8 | use crate::ui::selection_controls_area::SelectionControlsArea; 9 | use crate::State; 10 | 11 | pub const CYAN: u8 = 51; 12 | pub const GRAY_LIGHT: u8 = 238; 13 | pub const GRAY_DARK: u8 = 245; 14 | pub const WHITE: u8 = 15; 15 | pub const BLACK: u8 = 16; 16 | pub const RED: u8 = 124; 17 | pub const GREEN: u8 = 154; 18 | pub const ORANGE: u8 = 166; 19 | 20 | impl Display for State { 21 | fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { 22 | write!(f, "{}", self.render_search_line())?; 23 | write!(f, "{}", self.render_search_results())?; 24 | write!(f, "{}", self.render_selection_control_area())?; 25 | write!(f, "{}", self.render_controls_line())?; 26 | Ok(()) 27 | } 28 | } 29 | 30 | impl State { 31 | pub fn render_search_line(&self) -> String { 32 | format!( 33 | "{}{}\n", 34 | styled_text_foreground(CYAN, &bold("SEARCH: ")), 35 | self.search_term 36 | ) 37 | } 38 | pub fn render_search_results(&self) -> String { 39 | let mut space_for_results = self.display_rows.saturating_sub(3); // title and both controls lines 40 | let mut to_render = String::new(); 41 | for (i, search_result) in self.displayed_search_results.1.iter().enumerate() { 42 | let result_height = search_result.rendered_height(); 43 | if space_for_results < result_height { 44 | break; 45 | } 46 | space_for_results -= result_height; 47 | let index_of_selected_result = self.displayed_search_results.0; 48 | let is_selected = i == index_of_selected_result; 49 | let is_below_search_result = i > index_of_selected_result; 50 | let rendered_result = 51 | search_result.render(self.display_columns, is_selected, is_below_search_result); 52 | to_render.push_str(&format!("{}", rendered_result)); 53 | to_render.push('\n') 54 | } 55 | to_render 56 | } 57 | pub fn render_selection_control_area(&self) -> String { 58 | let rows_for_results = self.rows_for_results(); 59 | if !self.displayed_search_results.1.is_empty() { 60 | format!( 61 | "{}\n", 62 | SelectionControlsArea::new(rows_for_results, self.display_columns) 63 | .render(self.number_of_lines_in_displayed_search_results()) 64 | ) 65 | } else { 66 | format!( 67 | "{}\n", 68 | SelectionControlsArea::new(rows_for_results, self.display_columns) 69 | .render_empty_lines() 70 | ) 71 | } 72 | } 73 | pub fn render_controls_line(&self) -> String { 74 | let tiled_floating_control = 75 | Control::new_floating_control("Ctrl f", self.should_open_floating); 76 | let names_contents_control = Control::new_filter_control("Ctrl r", &self.search_filter); 77 | let controls = if self.kiosk_mode { 78 | vec![names_contents_control] 79 | } else { 80 | vec![tiled_floating_control, names_contents_control] 81 | }; 82 | if self.loading { 83 | ControlsLine::new( 84 | controls, 85 | Some(vec!["Scanning folder", "Scanning", "S"]), 86 | ) 87 | .with_animation_offset(self.loading_animation_offset) 88 | .render(self.display_columns) 89 | } else { 90 | ControlsLine::new(controls, None) 91 | .render(self.display_columns) 92 | } 93 | } 94 | } 95 | 96 | pub fn bold(text: &str) -> String { 97 | format!("\u{1b}[1m{}\u{1b}[m", text) 98 | } 99 | 100 | pub fn underline(text: &str) -> String { 101 | format!("\u{1b}[4m{}\u{1b}[m", text) 102 | } 103 | 104 | pub fn styled_text(foreground_color: u8, background_color: u8, text: &str) -> String { 105 | format!( 106 | "\u{1b}[38;5;{};48;5;{}m{}\u{1b}[m", 107 | foreground_color, background_color, text 108 | ) 109 | } 110 | 111 | pub fn styled_text_foreground(foreground_color: u8, text: &str) -> String { 112 | format!("\u{1b}[38;5;{}m{}\u{1b}[m", foreground_color, text) 113 | } 114 | 115 | pub fn styled_text_background(background_color: u8, text: &str) -> String { 116 | format!("\u{1b}[48;5;{}m{}\u{1b}[m", background_color, text) 117 | } 118 | 119 | pub fn color_line_to_end(background_color: u8) -> String { 120 | format!("\u{1b}[48;5;{}m\u{1b}[0K", background_color) 121 | } 122 | 123 | pub fn arrow(foreground: u8, background: u8) -> String { 124 | format!("\u{1b}[38;5;{}m\u{1b}[48;5;{}m", foreground, background) 125 | } 126 | 127 | pub fn dot(foreground: u8, background: u8) -> String { 128 | format!("\u{1b}[38;5;{};48;5;{}m•", foreground, background) 129 | } 130 | -------------------------------------------------------------------------------- /src/ui/selection_controls_area.rs: -------------------------------------------------------------------------------- 1 | use crate::ui::{bold, styled_text_foreground, ORANGE}; 2 | 3 | pub struct SelectionControlsArea { 4 | display_lines: usize, 5 | display_columns: usize, 6 | } 7 | 8 | impl SelectionControlsArea { 9 | pub fn new(display_lines: usize, display_columns: usize) -> Self { 10 | SelectionControlsArea { 11 | display_lines, 12 | display_columns, 13 | } 14 | } 15 | pub fn render(&self, result_count: usize) -> String { 16 | let mut to_render = String::new(); 17 | let padding = self.display_lines.saturating_sub(result_count); 18 | for _ in 0..padding { 19 | to_render.push_str(&self.render_padding_line()); 20 | } 21 | let selection_controls = self.render_selection_controls(); 22 | to_render.push_str(&selection_controls); 23 | to_render 24 | } 25 | pub fn render_empty_lines(&self) -> String { 26 | let mut to_render = String::new(); 27 | for _ in 0..self.display_lines { 28 | to_render.push_str("\n"); 29 | } 30 | to_render 31 | } 32 | fn render_padding_line(&self) -> String { 33 | format!("│\n") 34 | } 35 | fn render_selection_controls(&self) -> String { 36 | if self.display_columns >= self.full_selection_controls_len() { 37 | self.render_full_selection_controls() 38 | } else { 39 | self.render_truncated_selection_controls() 40 | } 41 | } 42 | fn full_selection_controls_len(&self) -> usize { 43 | 62 44 | } 45 | fn render_full_selection_controls(&self) -> String { 46 | let arrow_tail = "└ "; 47 | let enter = styled_text_foreground(ORANGE, &bold("")); 48 | let enter_tip = bold(" - open in editor. "); 49 | let tab = styled_text_foreground(ORANGE, &bold("")); 50 | let tab_tip = bold(" - open terminal at location."); 51 | format!("{}{}{}{}{}", arrow_tail, enter, enter_tip, tab, tab_tip) 52 | } 53 | fn render_truncated_selection_controls(&self) -> String { 54 | let arrow_tail = "└ "; 55 | let enter = styled_text_foreground(ORANGE, &bold("")); 56 | let enter_tip = bold(" - edit. "); 57 | let tab = styled_text_foreground(ORANGE, &bold("")); 58 | let tab_tip = bold(" - terminal."); 59 | format!("{}{}{}{}{}", arrow_tail, enter, enter_tip, tab, tab_tip) 60 | } 61 | } 62 | --------------------------------------------------------------------------------