├── .gitignore ├── CHANGELOG.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── assets ├── FiraSans-Regular.ttf └── OFL.txt ├── rustfmt.toml └── src ├── app.rs ├── config.rs ├── main.rs ├── project.rs ├── style.rs ├── ui.rs └── ui ├── tab.rs ├── tab ├── licenses.rs ├── markdown.rs ├── package_list.rs └── view_single.rs └── widgets.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). 6 | 7 | ## [Unreleased] 8 | 9 | ### Changed 10 | 11 | - Projects are now loaded on a separate thread, and loading doesn't block the ui. 12 | 13 | ### Etc 14 | 15 | - Updated to egui 0.29 16 | 17 | ## [0.2.0] - 2024-06-04 18 | 19 | ### Added 20 | 21 | - Readme viewer: View the readmes of your dependencies, if they exist locally. 22 | 23 | It can also be used to view changelogs. 24 | 25 | - The preferred theme is now saved so you don't have to set it every time you open ecargo. 26 | 27 | - Open in terminal button. Opens the package's working directory in the terminal of your choice. 28 | 29 | - `View Cargo.toml.orig` button. Allows you to view the original `Cargo.toml` file of a package. 30 | 31 | - `--no-default-features` and `--features` command line flags to configure feature set to resolve. 32 | 33 | - `--no-deps` flag to skip resolving dependencies. 34 | 35 | - `--version` command line flag 36 | 37 | ### Changed 38 | 39 | - In the main view, the link containing the source folder location was removed in favor of a 40 | folder button that shows the location when hovered, and opens it when clicked. 41 | 42 | - The folder icon in the sidebar now opens the source folder of the package, instead of 43 | focusing the package in the main view. 44 | 45 | There is an additional eye icon now which focuses the package in the main view. 46 | 47 | - The close button on the sidebar's right side got replaced by a sidebar toggle button 48 | in the top panel's right side. 49 | 50 | - The package list now only shows the first line of a package description. 51 | You can hover the description to get the full text, or click the package to open the 52 | side bar with the detailed view. 53 | 54 | ### Fixed 55 | 56 | - crates.io theme: Make selected text more legible (higher color contrast) 57 | - Allow packages to be explored even when there is no root package detected in a workspace. 58 | - Very bad performance on package list tab, if there are a lot of packages. 59 | 60 | Now only the visible packages are rendered, vastly improving performance. 61 | 62 | ## [0.1.0] - 2024-04-25 63 | Initial release 64 | -------------------------------------------------------------------------------- /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 = "ab_glyph" 7 | version = "0.2.29" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.8" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 | 21 | [[package]] 22 | name = "accesskit" 23 | version = "0.17.1" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" 26 | 27 | [[package]] 28 | name = "accesskit_atspi_common" 29 | version = "0.10.1" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" 32 | dependencies = [ 33 | "accesskit", 34 | "accesskit_consumer", 35 | "atspi-common", 36 | "serde", 37 | "thiserror 1.0.69", 38 | "zvariant", 39 | ] 40 | 41 | [[package]] 42 | name = "accesskit_consumer" 43 | version = "0.26.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" 46 | dependencies = [ 47 | "accesskit", 48 | "hashbrown", 49 | "immutable-chunkmap", 50 | ] 51 | 52 | [[package]] 53 | name = "accesskit_macos" 54 | version = "0.18.1" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" 57 | dependencies = [ 58 | "accesskit", 59 | "accesskit_consumer", 60 | "hashbrown", 61 | "objc2", 62 | "objc2-app-kit", 63 | "objc2-foundation", 64 | ] 65 | 66 | [[package]] 67 | name = "accesskit_unix" 68 | version = "0.13.1" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" 71 | dependencies = [ 72 | "accesskit", 73 | "accesskit_atspi_common", 74 | "async-channel", 75 | "async-executor", 76 | "async-task", 77 | "atspi", 78 | "futures-lite", 79 | "futures-util", 80 | "serde", 81 | "zbus", 82 | ] 83 | 84 | [[package]] 85 | name = "accesskit_windows" 86 | version = "0.24.1" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" 89 | dependencies = [ 90 | "accesskit", 91 | "accesskit_consumer", 92 | "hashbrown", 93 | "paste", 94 | "static_assertions", 95 | "windows", 96 | "windows-core", 97 | ] 98 | 99 | [[package]] 100 | name = "accesskit_winit" 101 | version = "0.23.1" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" 104 | dependencies = [ 105 | "accesskit", 106 | "accesskit_macos", 107 | "accesskit_unix", 108 | "accesskit_windows", 109 | "raw-window-handle", 110 | "winit", 111 | ] 112 | 113 | [[package]] 114 | name = "adler2" 115 | version = "2.0.0" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 118 | 119 | [[package]] 120 | name = "ahash" 121 | version = "0.8.11" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 124 | dependencies = [ 125 | "cfg-if", 126 | "getrandom 0.2.15", 127 | "once_cell", 128 | "version_check", 129 | "zerocopy", 130 | ] 131 | 132 | [[package]] 133 | name = "aligned-vec" 134 | version = "0.5.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" 137 | 138 | [[package]] 139 | name = "android-activity" 140 | version = "0.6.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 143 | dependencies = [ 144 | "android-properties", 145 | "bitflags 2.8.0", 146 | "cc", 147 | "cesu8", 148 | "jni", 149 | "jni-sys", 150 | "libc", 151 | "log", 152 | "ndk", 153 | "ndk-context", 154 | "ndk-sys 0.6.0+11769913", 155 | "num_enum", 156 | "thiserror 1.0.69", 157 | ] 158 | 159 | [[package]] 160 | name = "android-properties" 161 | version = "0.2.2" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 164 | 165 | [[package]] 166 | name = "android_system_properties" 167 | version = "0.1.5" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 170 | dependencies = [ 171 | "libc", 172 | ] 173 | 174 | [[package]] 175 | name = "anstream" 176 | version = "0.6.18" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 179 | dependencies = [ 180 | "anstyle", 181 | "anstyle-parse", 182 | "anstyle-query", 183 | "anstyle-wincon", 184 | "colorchoice", 185 | "is_terminal_polyfill", 186 | "utf8parse", 187 | ] 188 | 189 | [[package]] 190 | name = "anstyle" 191 | version = "1.0.10" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 194 | 195 | [[package]] 196 | name = "anstyle-parse" 197 | version = "0.2.6" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 200 | dependencies = [ 201 | "utf8parse", 202 | ] 203 | 204 | [[package]] 205 | name = "anstyle-query" 206 | version = "1.1.2" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 209 | dependencies = [ 210 | "windows-sys 0.59.0", 211 | ] 212 | 213 | [[package]] 214 | name = "anstyle-wincon" 215 | version = "3.0.7" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 218 | dependencies = [ 219 | "anstyle", 220 | "once_cell", 221 | "windows-sys 0.59.0", 222 | ] 223 | 224 | [[package]] 225 | name = "anyhow" 226 | version = "1.0.95" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 229 | 230 | [[package]] 231 | name = "arbitrary" 232 | version = "1.4.1" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" 235 | 236 | [[package]] 237 | name = "arboard" 238 | version = "3.4.1" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" 241 | dependencies = [ 242 | "clipboard-win", 243 | "core-graphics", 244 | "image", 245 | "log", 246 | "objc2", 247 | "objc2-app-kit", 248 | "objc2-foundation", 249 | "parking_lot", 250 | "windows-sys 0.48.0", 251 | "x11rb", 252 | ] 253 | 254 | [[package]] 255 | name = "arg_enum_proc_macro" 256 | version = "0.3.4" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" 259 | dependencies = [ 260 | "proc-macro2", 261 | "quote", 262 | "syn", 263 | ] 264 | 265 | [[package]] 266 | name = "arrayref" 267 | version = "0.3.9" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 270 | 271 | [[package]] 272 | name = "arrayvec" 273 | version = "0.7.6" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 276 | 277 | [[package]] 278 | name = "as-raw-xcb-connection" 279 | version = "1.0.1" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 282 | 283 | [[package]] 284 | name = "ash" 285 | version = "0.38.0+1.3.281" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" 288 | dependencies = [ 289 | "libloading", 290 | ] 291 | 292 | [[package]] 293 | name = "async-broadcast" 294 | version = "0.7.2" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 297 | dependencies = [ 298 | "event-listener", 299 | "event-listener-strategy", 300 | "futures-core", 301 | "pin-project-lite", 302 | ] 303 | 304 | [[package]] 305 | name = "async-channel" 306 | version = "2.3.1" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 309 | dependencies = [ 310 | "concurrent-queue", 311 | "event-listener-strategy", 312 | "futures-core", 313 | "pin-project-lite", 314 | ] 315 | 316 | [[package]] 317 | name = "async-executor" 318 | version = "1.13.1" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" 321 | dependencies = [ 322 | "async-task", 323 | "concurrent-queue", 324 | "fastrand", 325 | "futures-lite", 326 | "slab", 327 | ] 328 | 329 | [[package]] 330 | name = "async-fs" 331 | version = "2.1.2" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" 334 | dependencies = [ 335 | "async-lock", 336 | "blocking", 337 | "futures-lite", 338 | ] 339 | 340 | [[package]] 341 | name = "async-io" 342 | version = "2.4.0" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" 345 | dependencies = [ 346 | "async-lock", 347 | "cfg-if", 348 | "concurrent-queue", 349 | "futures-io", 350 | "futures-lite", 351 | "parking", 352 | "polling", 353 | "rustix", 354 | "slab", 355 | "tracing", 356 | "windows-sys 0.59.0", 357 | ] 358 | 359 | [[package]] 360 | name = "async-lock" 361 | version = "3.4.0" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 364 | dependencies = [ 365 | "event-listener", 366 | "event-listener-strategy", 367 | "pin-project-lite", 368 | ] 369 | 370 | [[package]] 371 | name = "async-process" 372 | version = "2.3.0" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" 375 | dependencies = [ 376 | "async-channel", 377 | "async-io", 378 | "async-lock", 379 | "async-signal", 380 | "async-task", 381 | "blocking", 382 | "cfg-if", 383 | "event-listener", 384 | "futures-lite", 385 | "rustix", 386 | "tracing", 387 | ] 388 | 389 | [[package]] 390 | name = "async-recursion" 391 | version = "1.1.1" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 394 | dependencies = [ 395 | "proc-macro2", 396 | "quote", 397 | "syn", 398 | ] 399 | 400 | [[package]] 401 | name = "async-signal" 402 | version = "0.2.10" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" 405 | dependencies = [ 406 | "async-io", 407 | "async-lock", 408 | "atomic-waker", 409 | "cfg-if", 410 | "futures-core", 411 | "futures-io", 412 | "rustix", 413 | "signal-hook-registry", 414 | "slab", 415 | "windows-sys 0.59.0", 416 | ] 417 | 418 | [[package]] 419 | name = "async-task" 420 | version = "4.7.1" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 423 | 424 | [[package]] 425 | name = "async-trait" 426 | version = "0.1.86" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" 429 | dependencies = [ 430 | "proc-macro2", 431 | "quote", 432 | "syn", 433 | ] 434 | 435 | [[package]] 436 | name = "atomic-waker" 437 | version = "1.1.2" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 440 | 441 | [[package]] 442 | name = "atspi" 443 | version = "0.22.0" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" 446 | dependencies = [ 447 | "atspi-common", 448 | "atspi-connection", 449 | "atspi-proxies", 450 | ] 451 | 452 | [[package]] 453 | name = "atspi-common" 454 | version = "0.6.0" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" 457 | dependencies = [ 458 | "enumflags2", 459 | "serde", 460 | "static_assertions", 461 | "zbus", 462 | "zbus-lockstep", 463 | "zbus-lockstep-macros", 464 | "zbus_names", 465 | "zvariant", 466 | ] 467 | 468 | [[package]] 469 | name = "atspi-connection" 470 | version = "0.6.0" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" 473 | dependencies = [ 474 | "atspi-common", 475 | "atspi-proxies", 476 | "futures-lite", 477 | "zbus", 478 | ] 479 | 480 | [[package]] 481 | name = "atspi-proxies" 482 | version = "0.6.0" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" 485 | dependencies = [ 486 | "atspi-common", 487 | "serde", 488 | "zbus", 489 | "zvariant", 490 | ] 491 | 492 | [[package]] 493 | name = "autocfg" 494 | version = "1.4.0" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 497 | 498 | [[package]] 499 | name = "av1-grain" 500 | version = "0.2.3" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" 503 | dependencies = [ 504 | "anyhow", 505 | "arrayvec", 506 | "log", 507 | "nom", 508 | "num-rational", 509 | "v_frame", 510 | ] 511 | 512 | [[package]] 513 | name = "avif-serialize" 514 | version = "0.8.2" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" 517 | dependencies = [ 518 | "arrayvec", 519 | ] 520 | 521 | [[package]] 522 | name = "base64" 523 | version = "0.21.7" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 526 | 527 | [[package]] 528 | name = "base64" 529 | version = "0.22.1" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 532 | 533 | [[package]] 534 | name = "bit-set" 535 | version = "0.8.0" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 538 | dependencies = [ 539 | "bit-vec", 540 | ] 541 | 542 | [[package]] 543 | name = "bit-vec" 544 | version = "0.8.0" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 547 | 548 | [[package]] 549 | name = "bit_field" 550 | version = "0.10.2" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" 553 | 554 | [[package]] 555 | name = "bitflags" 556 | version = "1.3.2" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 559 | 560 | [[package]] 561 | name = "bitflags" 562 | version = "2.8.0" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 565 | dependencies = [ 566 | "serde", 567 | ] 568 | 569 | [[package]] 570 | name = "bitstream-io" 571 | version = "2.6.0" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" 574 | 575 | [[package]] 576 | name = "block" 577 | version = "0.1.6" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 580 | 581 | [[package]] 582 | name = "block-buffer" 583 | version = "0.10.4" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 586 | dependencies = [ 587 | "generic-array", 588 | ] 589 | 590 | [[package]] 591 | name = "block2" 592 | version = "0.5.1" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 595 | dependencies = [ 596 | "objc2", 597 | ] 598 | 599 | [[package]] 600 | name = "blocking" 601 | version = "1.6.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 604 | dependencies = [ 605 | "async-channel", 606 | "async-task", 607 | "futures-io", 608 | "futures-lite", 609 | "piper", 610 | ] 611 | 612 | [[package]] 613 | name = "built" 614 | version = "0.7.5" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" 617 | 618 | [[package]] 619 | name = "bumpalo" 620 | version = "3.17.0" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 623 | 624 | [[package]] 625 | name = "bytemuck" 626 | version = "1.21.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 629 | dependencies = [ 630 | "bytemuck_derive", 631 | ] 632 | 633 | [[package]] 634 | name = "bytemuck_derive" 635 | version = "1.8.1" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" 638 | dependencies = [ 639 | "proc-macro2", 640 | "quote", 641 | "syn", 642 | ] 643 | 644 | [[package]] 645 | name = "byteorder" 646 | version = "1.5.0" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 649 | 650 | [[package]] 651 | name = "byteorder-lite" 652 | version = "0.1.0" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 655 | 656 | [[package]] 657 | name = "bytes" 658 | version = "1.10.0" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 661 | 662 | [[package]] 663 | name = "calloop" 664 | version = "0.13.0" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" 667 | dependencies = [ 668 | "bitflags 2.8.0", 669 | "log", 670 | "polling", 671 | "rustix", 672 | "slab", 673 | "thiserror 1.0.69", 674 | ] 675 | 676 | [[package]] 677 | name = "calloop-wayland-source" 678 | version = "0.3.0" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" 681 | dependencies = [ 682 | "calloop", 683 | "rustix", 684 | "wayland-backend", 685 | "wayland-client", 686 | ] 687 | 688 | [[package]] 689 | name = "camino" 690 | version = "1.1.9" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" 693 | dependencies = [ 694 | "serde", 695 | ] 696 | 697 | [[package]] 698 | name = "cargo-platform" 699 | version = "0.1.9" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" 702 | dependencies = [ 703 | "serde", 704 | ] 705 | 706 | [[package]] 707 | name = "cargo_metadata" 708 | version = "0.19.1" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "8769706aad5d996120af43197bf46ef6ad0fda35216b4505f926a365a232d924" 711 | dependencies = [ 712 | "camino", 713 | "cargo-platform", 714 | "semver", 715 | "serde", 716 | "serde_json", 717 | "thiserror 2.0.11", 718 | ] 719 | 720 | [[package]] 721 | name = "cc" 722 | version = "1.2.13" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" 725 | dependencies = [ 726 | "jobserver", 727 | "libc", 728 | "shlex", 729 | ] 730 | 731 | [[package]] 732 | name = "cesu8" 733 | version = "1.1.0" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 736 | 737 | [[package]] 738 | name = "cfg-expr" 739 | version = "0.15.8" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 742 | dependencies = [ 743 | "smallvec", 744 | "target-lexicon", 745 | ] 746 | 747 | [[package]] 748 | name = "cfg-if" 749 | version = "1.0.0" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 752 | 753 | [[package]] 754 | name = "cfg_aliases" 755 | version = "0.2.1" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 758 | 759 | [[package]] 760 | name = "cgl" 761 | version = "0.3.2" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" 764 | dependencies = [ 765 | "libc", 766 | ] 767 | 768 | [[package]] 769 | name = "clap" 770 | version = "4.5.28" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" 773 | dependencies = [ 774 | "clap_builder", 775 | "clap_derive", 776 | ] 777 | 778 | [[package]] 779 | name = "clap_builder" 780 | version = "4.5.27" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 783 | dependencies = [ 784 | "anstream", 785 | "anstyle", 786 | "clap_lex", 787 | "strsim", 788 | ] 789 | 790 | [[package]] 791 | name = "clap_derive" 792 | version = "4.5.28" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" 795 | dependencies = [ 796 | "heck", 797 | "proc-macro2", 798 | "quote", 799 | "syn", 800 | ] 801 | 802 | [[package]] 803 | name = "clap_lex" 804 | version = "0.7.4" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 807 | 808 | [[package]] 809 | name = "clipboard-win" 810 | version = "5.4.0" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" 813 | dependencies = [ 814 | "error-code", 815 | ] 816 | 817 | [[package]] 818 | name = "codespan-reporting" 819 | version = "0.11.1" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 822 | dependencies = [ 823 | "termcolor", 824 | "unicode-width", 825 | ] 826 | 827 | [[package]] 828 | name = "color_quant" 829 | version = "1.1.0" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 832 | 833 | [[package]] 834 | name = "colorchoice" 835 | version = "1.0.3" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 838 | 839 | [[package]] 840 | name = "combine" 841 | version = "4.6.7" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 844 | dependencies = [ 845 | "bytes", 846 | "memchr", 847 | ] 848 | 849 | [[package]] 850 | name = "concurrent-queue" 851 | version = "2.5.0" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 854 | dependencies = [ 855 | "crossbeam-utils", 856 | ] 857 | 858 | [[package]] 859 | name = "core-foundation" 860 | version = "0.9.4" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 863 | dependencies = [ 864 | "core-foundation-sys", 865 | "libc", 866 | ] 867 | 868 | [[package]] 869 | name = "core-foundation" 870 | version = "0.10.0" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 873 | dependencies = [ 874 | "core-foundation-sys", 875 | "libc", 876 | ] 877 | 878 | [[package]] 879 | name = "core-foundation-sys" 880 | version = "0.8.7" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 883 | 884 | [[package]] 885 | name = "core-graphics" 886 | version = "0.23.2" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 889 | dependencies = [ 890 | "bitflags 1.3.2", 891 | "core-foundation 0.9.4", 892 | "core-graphics-types", 893 | "foreign-types", 894 | "libc", 895 | ] 896 | 897 | [[package]] 898 | name = "core-graphics-types" 899 | version = "0.1.3" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 902 | dependencies = [ 903 | "bitflags 1.3.2", 904 | "core-foundation 0.9.4", 905 | "libc", 906 | ] 907 | 908 | [[package]] 909 | name = "cpufeatures" 910 | version = "0.2.17" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 913 | dependencies = [ 914 | "libc", 915 | ] 916 | 917 | [[package]] 918 | name = "crc32fast" 919 | version = "1.4.2" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 922 | dependencies = [ 923 | "cfg-if", 924 | ] 925 | 926 | [[package]] 927 | name = "crossbeam-deque" 928 | version = "0.8.6" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 931 | dependencies = [ 932 | "crossbeam-epoch", 933 | "crossbeam-utils", 934 | ] 935 | 936 | [[package]] 937 | name = "crossbeam-epoch" 938 | version = "0.9.18" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 941 | dependencies = [ 942 | "crossbeam-utils", 943 | ] 944 | 945 | [[package]] 946 | name = "crossbeam-utils" 947 | version = "0.8.21" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 950 | 951 | [[package]] 952 | name = "crunchy" 953 | version = "0.2.3" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" 956 | 957 | [[package]] 958 | name = "crypto-common" 959 | version = "0.1.6" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 962 | dependencies = [ 963 | "generic-array", 964 | "typenum", 965 | ] 966 | 967 | [[package]] 968 | name = "cursor-icon" 969 | version = "1.1.0" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" 972 | 973 | [[package]] 974 | name = "data-url" 975 | version = "0.3.1" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" 978 | 979 | [[package]] 980 | name = "digest" 981 | version = "0.10.7" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 984 | dependencies = [ 985 | "block-buffer", 986 | "crypto-common", 987 | ] 988 | 989 | [[package]] 990 | name = "directories" 991 | version = "6.0.0" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" 994 | dependencies = [ 995 | "dirs-sys", 996 | ] 997 | 998 | [[package]] 999 | name = "dirs-sys" 1000 | version = "0.5.0" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" 1003 | dependencies = [ 1004 | "libc", 1005 | "option-ext", 1006 | "redox_users", 1007 | "windows-sys 0.59.0", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "dispatch" 1012 | version = "0.2.0" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 1015 | 1016 | [[package]] 1017 | name = "displaydoc" 1018 | version = "0.2.5" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 1021 | dependencies = [ 1022 | "proc-macro2", 1023 | "quote", 1024 | "syn", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "dlib" 1029 | version = "0.5.2" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 1032 | dependencies = [ 1033 | "libloading", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "document-features" 1038 | version = "0.2.10" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" 1041 | dependencies = [ 1042 | "litrs", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "downcast-rs" 1047 | version = "1.2.1" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 1050 | 1051 | [[package]] 1052 | name = "dpi" 1053 | version = "0.1.1" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" 1056 | 1057 | [[package]] 1058 | name = "ecargo" 1059 | version = "0.3.0-dev" 1060 | dependencies = [ 1061 | "anyhow", 1062 | "cargo-platform", 1063 | "cargo_metadata", 1064 | "clap", 1065 | "directories", 1066 | "eframe", 1067 | "egui_commonmark", 1068 | "egui_extras", 1069 | "image", 1070 | "open", 1071 | "serde", 1072 | "slotmap", 1073 | "toml", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "ecolor" 1078 | version = "0.31.0" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "878e9005799dd739e5d5d89ff7480491c12d0af571d44399bcaefa1ee172dd76" 1081 | dependencies = [ 1082 | "bytemuck", 1083 | "emath", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "eframe" 1088 | version = "0.31.0" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "eba4c50d905804fe9ec4e159fde06b9d38f9440228617ab64a03d7a2091ece63" 1091 | dependencies = [ 1092 | "ahash", 1093 | "bytemuck", 1094 | "document-features", 1095 | "egui", 1096 | "egui-wgpu", 1097 | "egui-winit", 1098 | "egui_glow", 1099 | "glow", 1100 | "glutin", 1101 | "glutin-winit", 1102 | "image", 1103 | "js-sys", 1104 | "log", 1105 | "objc2", 1106 | "objc2-app-kit", 1107 | "objc2-foundation", 1108 | "parking_lot", 1109 | "percent-encoding", 1110 | "profiling", 1111 | "raw-window-handle", 1112 | "static_assertions", 1113 | "wasm-bindgen", 1114 | "wasm-bindgen-futures", 1115 | "web-sys", 1116 | "web-time", 1117 | "winapi", 1118 | "windows-sys 0.59.0", 1119 | "winit", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "egui" 1124 | version = "0.31.0" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "7d2768eaa6d5c80a6e2a008da1f0e062dff3c83eb2b28605ea2d0732d46e74d6" 1127 | dependencies = [ 1128 | "accesskit", 1129 | "ahash", 1130 | "bitflags 2.8.0", 1131 | "emath", 1132 | "epaint", 1133 | "log", 1134 | "nohash-hasher", 1135 | "profiling", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "egui-wgpu" 1140 | version = "0.31.0" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "6d8151704bcef6271bec1806c51544d70e79ef20e8616e5eac01facfd9c8c54a" 1143 | dependencies = [ 1144 | "ahash", 1145 | "bytemuck", 1146 | "document-features", 1147 | "egui", 1148 | "epaint", 1149 | "log", 1150 | "profiling", 1151 | "thiserror 1.0.69", 1152 | "type-map", 1153 | "web-time", 1154 | "wgpu", 1155 | "winit", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "egui-winit" 1160 | version = "0.31.0" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "ace791b367c1f63e6044aef2f3834904509d1d1a6912fd23ebf3f6a9af92cd84" 1163 | dependencies = [ 1164 | "accesskit_winit", 1165 | "ahash", 1166 | "arboard", 1167 | "bytemuck", 1168 | "egui", 1169 | "log", 1170 | "profiling", 1171 | "raw-window-handle", 1172 | "smithay-clipboard", 1173 | "web-time", 1174 | "webbrowser", 1175 | "winit", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "egui_commonmark" 1180 | version = "0.20.0" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "4a1e5d9a91b1b7a320c9b7f56d1878416d7c9bab3eaf337b036e0ddfabf58623" 1183 | dependencies = [ 1184 | "egui", 1185 | "egui_commonmark_backend", 1186 | "egui_extras", 1187 | "pulldown-cmark", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "egui_commonmark_backend" 1192 | version = "0.20.0" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "efb41b6833a6aaa99ca5c4f8e75b2410d69a7b3e30148d413f541147404a0dfa" 1195 | dependencies = [ 1196 | "egui", 1197 | "egui_extras", 1198 | "pulldown-cmark", 1199 | ] 1200 | 1201 | [[package]] 1202 | name = "egui_extras" 1203 | version = "0.31.0" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "b5b5cf69510eb3d19211fc0c062fb90524f43fe8e2c012967dcf0e2d81cb040f" 1206 | dependencies = [ 1207 | "ahash", 1208 | "egui", 1209 | "ehttp", 1210 | "enum-map", 1211 | "image", 1212 | "log", 1213 | "mime_guess2", 1214 | "profiling", 1215 | "resvg", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "egui_glow" 1220 | version = "0.31.0" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "9a53e2374a964c3c793cb0b8ead81bca631f24974bc0b747d1a5622f4e39fdd0" 1223 | dependencies = [ 1224 | "ahash", 1225 | "bytemuck", 1226 | "egui", 1227 | "glow", 1228 | "log", 1229 | "memoffset", 1230 | "profiling", 1231 | "wasm-bindgen", 1232 | "web-sys", 1233 | "winit", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "ehttp" 1238 | version = "0.5.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "59a81c221a1e4dad06cb9c9deb19aea1193a5eea084e8cd42d869068132bf876" 1241 | dependencies = [ 1242 | "document-features", 1243 | "js-sys", 1244 | "ureq", 1245 | "wasm-bindgen", 1246 | "wasm-bindgen-futures", 1247 | "web-sys", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "either" 1252 | version = "1.13.0" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 1255 | 1256 | [[package]] 1257 | name = "emath" 1258 | version = "0.31.0" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "55b7b6be5ad1d247f11738b0e4699d9c20005ed366f2c29f5ec1f8e1de180bc2" 1261 | dependencies = [ 1262 | "bytemuck", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "endi" 1267 | version = "1.1.0" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 1270 | 1271 | [[package]] 1272 | name = "enum-map" 1273 | version = "2.7.3" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" 1276 | dependencies = [ 1277 | "enum-map-derive", 1278 | "serde", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "enum-map-derive" 1283 | version = "0.17.0" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" 1286 | dependencies = [ 1287 | "proc-macro2", 1288 | "quote", 1289 | "syn", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "enumflags2" 1294 | version = "0.7.11" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" 1297 | dependencies = [ 1298 | "enumflags2_derive", 1299 | "serde", 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "enumflags2_derive" 1304 | version = "0.7.11" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" 1307 | dependencies = [ 1308 | "proc-macro2", 1309 | "quote", 1310 | "syn", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "epaint" 1315 | version = "0.31.0" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "275b665a7b9611d8317485187e5458750850f9e64604d3c58434bb3fc1d22915" 1318 | dependencies = [ 1319 | "ab_glyph", 1320 | "ahash", 1321 | "bytemuck", 1322 | "ecolor", 1323 | "emath", 1324 | "epaint_default_fonts", 1325 | "log", 1326 | "nohash-hasher", 1327 | "parking_lot", 1328 | "profiling", 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "epaint_default_fonts" 1333 | version = "0.31.0" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "9343d356d7cac894dacafc161b4654e0881301097bdf32a122ed503d97cb94b6" 1336 | 1337 | [[package]] 1338 | name = "equivalent" 1339 | version = "1.0.1" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1342 | 1343 | [[package]] 1344 | name = "errno" 1345 | version = "0.3.10" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 1348 | dependencies = [ 1349 | "libc", 1350 | "windows-sys 0.59.0", 1351 | ] 1352 | 1353 | [[package]] 1354 | name = "error-code" 1355 | version = "3.3.1" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" 1358 | 1359 | [[package]] 1360 | name = "event-listener" 1361 | version = "5.4.0" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1364 | dependencies = [ 1365 | "concurrent-queue", 1366 | "parking", 1367 | "pin-project-lite", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "event-listener-strategy" 1372 | version = "0.5.3" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 1375 | dependencies = [ 1376 | "event-listener", 1377 | "pin-project-lite", 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "exr" 1382 | version = "1.73.0" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" 1385 | dependencies = [ 1386 | "bit_field", 1387 | "half", 1388 | "lebe", 1389 | "miniz_oxide", 1390 | "rayon-core", 1391 | "smallvec", 1392 | "zune-inflate", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "fastrand" 1397 | version = "2.3.0" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1400 | 1401 | [[package]] 1402 | name = "fdeflate" 1403 | version = "0.3.7" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 1406 | dependencies = [ 1407 | "simd-adler32", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "flate2" 1412 | version = "1.0.35" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 1415 | dependencies = [ 1416 | "crc32fast", 1417 | "miniz_oxide", 1418 | ] 1419 | 1420 | [[package]] 1421 | name = "float-cmp" 1422 | version = "0.9.0" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 1425 | 1426 | [[package]] 1427 | name = "foldhash" 1428 | version = "0.1.4" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 1431 | 1432 | [[package]] 1433 | name = "foreign-types" 1434 | version = "0.5.0" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 1437 | dependencies = [ 1438 | "foreign-types-macros", 1439 | "foreign-types-shared", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "foreign-types-macros" 1444 | version = "0.2.3" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 1447 | dependencies = [ 1448 | "proc-macro2", 1449 | "quote", 1450 | "syn", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "foreign-types-shared" 1455 | version = "0.3.1" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 1458 | 1459 | [[package]] 1460 | name = "form_urlencoded" 1461 | version = "1.2.1" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1464 | dependencies = [ 1465 | "percent-encoding", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "futures-core" 1470 | version = "0.3.31" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1473 | 1474 | [[package]] 1475 | name = "futures-io" 1476 | version = "0.3.31" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1479 | 1480 | [[package]] 1481 | name = "futures-lite" 1482 | version = "2.6.0" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1485 | dependencies = [ 1486 | "fastrand", 1487 | "futures-core", 1488 | "futures-io", 1489 | "parking", 1490 | "pin-project-lite", 1491 | ] 1492 | 1493 | [[package]] 1494 | name = "futures-macro" 1495 | version = "0.3.31" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1498 | dependencies = [ 1499 | "proc-macro2", 1500 | "quote", 1501 | "syn", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "futures-sink" 1506 | version = "0.3.31" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1509 | 1510 | [[package]] 1511 | name = "futures-task" 1512 | version = "0.3.31" 1513 | source = "registry+https://github.com/rust-lang/crates.io-index" 1514 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1515 | 1516 | [[package]] 1517 | name = "futures-util" 1518 | version = "0.3.31" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1521 | dependencies = [ 1522 | "futures-core", 1523 | "futures-io", 1524 | "futures-macro", 1525 | "futures-sink", 1526 | "futures-task", 1527 | "memchr", 1528 | "pin-project-lite", 1529 | "pin-utils", 1530 | "slab", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "generic-array" 1535 | version = "0.14.7" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1538 | dependencies = [ 1539 | "typenum", 1540 | "version_check", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "gethostname" 1545 | version = "0.4.3" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 1548 | dependencies = [ 1549 | "libc", 1550 | "windows-targets 0.48.5", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "getrandom" 1555 | version = "0.2.15" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 1558 | dependencies = [ 1559 | "cfg-if", 1560 | "libc", 1561 | "wasi 0.11.0+wasi-snapshot-preview1", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "getrandom" 1566 | version = "0.3.1" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 1569 | dependencies = [ 1570 | "cfg-if", 1571 | "libc", 1572 | "wasi 0.13.3+wasi-0.2.2", 1573 | "windows-targets 0.52.6", 1574 | ] 1575 | 1576 | [[package]] 1577 | name = "gif" 1578 | version = "0.13.1" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" 1581 | dependencies = [ 1582 | "color_quant", 1583 | "weezl", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "gl_generator" 1588 | version = "0.14.0" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 1591 | dependencies = [ 1592 | "khronos_api", 1593 | "log", 1594 | "xml-rs", 1595 | ] 1596 | 1597 | [[package]] 1598 | name = "glow" 1599 | version = "0.16.0" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" 1602 | dependencies = [ 1603 | "js-sys", 1604 | "slotmap", 1605 | "wasm-bindgen", 1606 | "web-sys", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "glutin" 1611 | version = "0.32.2" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "03642b8b0cce622392deb0ee3e88511f75df2daac806102597905c3ea1974848" 1614 | dependencies = [ 1615 | "bitflags 2.8.0", 1616 | "cfg_aliases", 1617 | "cgl", 1618 | "core-foundation 0.9.4", 1619 | "dispatch", 1620 | "glutin_egl_sys", 1621 | "glutin_glx_sys", 1622 | "glutin_wgl_sys", 1623 | "libloading", 1624 | "objc2", 1625 | "objc2-app-kit", 1626 | "objc2-foundation", 1627 | "once_cell", 1628 | "raw-window-handle", 1629 | "wayland-sys", 1630 | "windows-sys 0.52.0", 1631 | "x11-dl", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "glutin-winit" 1636 | version = "0.5.0" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" 1639 | dependencies = [ 1640 | "cfg_aliases", 1641 | "glutin", 1642 | "raw-window-handle", 1643 | "winit", 1644 | ] 1645 | 1646 | [[package]] 1647 | name = "glutin_egl_sys" 1648 | version = "0.7.1" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" 1651 | dependencies = [ 1652 | "gl_generator", 1653 | "windows-sys 0.52.0", 1654 | ] 1655 | 1656 | [[package]] 1657 | name = "glutin_glx_sys" 1658 | version = "0.6.1" 1659 | source = "registry+https://github.com/rust-lang/crates.io-index" 1660 | checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" 1661 | dependencies = [ 1662 | "gl_generator", 1663 | "x11-dl", 1664 | ] 1665 | 1666 | [[package]] 1667 | name = "glutin_wgl_sys" 1668 | version = "0.6.1" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" 1671 | dependencies = [ 1672 | "gl_generator", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "gpu-alloc" 1677 | version = "0.6.0" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 1680 | dependencies = [ 1681 | "bitflags 2.8.0", 1682 | "gpu-alloc-types", 1683 | ] 1684 | 1685 | [[package]] 1686 | name = "gpu-alloc-types" 1687 | version = "0.3.0" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 1690 | dependencies = [ 1691 | "bitflags 2.8.0", 1692 | ] 1693 | 1694 | [[package]] 1695 | name = "gpu-descriptor" 1696 | version = "0.3.1" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" 1699 | dependencies = [ 1700 | "bitflags 2.8.0", 1701 | "gpu-descriptor-types", 1702 | "hashbrown", 1703 | ] 1704 | 1705 | [[package]] 1706 | name = "gpu-descriptor-types" 1707 | version = "0.2.0" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 1710 | dependencies = [ 1711 | "bitflags 2.8.0", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "half" 1716 | version = "2.4.1" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 1719 | dependencies = [ 1720 | "cfg-if", 1721 | "crunchy", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "hashbrown" 1726 | version = "0.15.2" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1729 | dependencies = [ 1730 | "foldhash", 1731 | ] 1732 | 1733 | [[package]] 1734 | name = "heck" 1735 | version = "0.5.0" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1738 | 1739 | [[package]] 1740 | name = "hermit-abi" 1741 | version = "0.4.0" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 1744 | 1745 | [[package]] 1746 | name = "hex" 1747 | version = "0.4.3" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1750 | 1751 | [[package]] 1752 | name = "hexf-parse" 1753 | version = "0.2.1" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 1756 | 1757 | [[package]] 1758 | name = "home" 1759 | version = "0.5.11" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1762 | dependencies = [ 1763 | "windows-sys 0.59.0", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "icu_collections" 1768 | version = "1.5.0" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1771 | dependencies = [ 1772 | "displaydoc", 1773 | "yoke", 1774 | "zerofrom", 1775 | "zerovec", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "icu_locid" 1780 | version = "1.5.0" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1783 | dependencies = [ 1784 | "displaydoc", 1785 | "litemap", 1786 | "tinystr", 1787 | "writeable", 1788 | "zerovec", 1789 | ] 1790 | 1791 | [[package]] 1792 | name = "icu_locid_transform" 1793 | version = "1.5.0" 1794 | source = "registry+https://github.com/rust-lang/crates.io-index" 1795 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1796 | dependencies = [ 1797 | "displaydoc", 1798 | "icu_locid", 1799 | "icu_locid_transform_data", 1800 | "icu_provider", 1801 | "tinystr", 1802 | "zerovec", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "icu_locid_transform_data" 1807 | version = "1.5.0" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1810 | 1811 | [[package]] 1812 | name = "icu_normalizer" 1813 | version = "1.5.0" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1816 | dependencies = [ 1817 | "displaydoc", 1818 | "icu_collections", 1819 | "icu_normalizer_data", 1820 | "icu_properties", 1821 | "icu_provider", 1822 | "smallvec", 1823 | "utf16_iter", 1824 | "utf8_iter", 1825 | "write16", 1826 | "zerovec", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "icu_normalizer_data" 1831 | version = "1.5.0" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1834 | 1835 | [[package]] 1836 | name = "icu_properties" 1837 | version = "1.5.1" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1840 | dependencies = [ 1841 | "displaydoc", 1842 | "icu_collections", 1843 | "icu_locid_transform", 1844 | "icu_properties_data", 1845 | "icu_provider", 1846 | "tinystr", 1847 | "zerovec", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "icu_properties_data" 1852 | version = "1.5.0" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1855 | 1856 | [[package]] 1857 | name = "icu_provider" 1858 | version = "1.5.0" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1861 | dependencies = [ 1862 | "displaydoc", 1863 | "icu_locid", 1864 | "icu_provider_macros", 1865 | "stable_deref_trait", 1866 | "tinystr", 1867 | "writeable", 1868 | "yoke", 1869 | "zerofrom", 1870 | "zerovec", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "icu_provider_macros" 1875 | version = "1.5.0" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1878 | dependencies = [ 1879 | "proc-macro2", 1880 | "quote", 1881 | "syn", 1882 | ] 1883 | 1884 | [[package]] 1885 | name = "idna" 1886 | version = "1.0.3" 1887 | source = "registry+https://github.com/rust-lang/crates.io-index" 1888 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1889 | dependencies = [ 1890 | "idna_adapter", 1891 | "smallvec", 1892 | "utf8_iter", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "idna_adapter" 1897 | version = "1.2.0" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1900 | dependencies = [ 1901 | "icu_normalizer", 1902 | "icu_properties", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "image" 1907 | version = "0.25.5" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" 1910 | dependencies = [ 1911 | "bytemuck", 1912 | "byteorder-lite", 1913 | "color_quant", 1914 | "exr", 1915 | "gif", 1916 | "image-webp", 1917 | "num-traits", 1918 | "png", 1919 | "qoi", 1920 | "ravif", 1921 | "rayon", 1922 | "rgb", 1923 | "tiff", 1924 | "zune-core", 1925 | "zune-jpeg", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "image-webp" 1930 | version = "0.2.1" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" 1933 | dependencies = [ 1934 | "byteorder-lite", 1935 | "quick-error", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "imagesize" 1940 | version = "0.12.0" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" 1943 | 1944 | [[package]] 1945 | name = "imgref" 1946 | version = "1.11.0" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" 1949 | 1950 | [[package]] 1951 | name = "immutable-chunkmap" 1952 | version = "2.0.6" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" 1955 | dependencies = [ 1956 | "arrayvec", 1957 | ] 1958 | 1959 | [[package]] 1960 | name = "indexmap" 1961 | version = "2.7.1" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 1964 | dependencies = [ 1965 | "equivalent", 1966 | "hashbrown", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "interpolate_name" 1971 | version = "0.2.4" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" 1974 | dependencies = [ 1975 | "proc-macro2", 1976 | "quote", 1977 | "syn", 1978 | ] 1979 | 1980 | [[package]] 1981 | name = "is-docker" 1982 | version = "0.2.0" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" 1985 | dependencies = [ 1986 | "once_cell", 1987 | ] 1988 | 1989 | [[package]] 1990 | name = "is-wsl" 1991 | version = "0.4.0" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" 1994 | dependencies = [ 1995 | "is-docker", 1996 | "once_cell", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "is_terminal_polyfill" 2001 | version = "1.70.1" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 2004 | 2005 | [[package]] 2006 | name = "itertools" 2007 | version = "0.12.1" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 2010 | dependencies = [ 2011 | "either", 2012 | ] 2013 | 2014 | [[package]] 2015 | name = "itoa" 2016 | version = "1.0.14" 2017 | source = "registry+https://github.com/rust-lang/crates.io-index" 2018 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 2019 | 2020 | [[package]] 2021 | name = "jni" 2022 | version = "0.21.1" 2023 | source = "registry+https://github.com/rust-lang/crates.io-index" 2024 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 2025 | dependencies = [ 2026 | "cesu8", 2027 | "cfg-if", 2028 | "combine", 2029 | "jni-sys", 2030 | "log", 2031 | "thiserror 1.0.69", 2032 | "walkdir", 2033 | "windows-sys 0.45.0", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "jni-sys" 2038 | version = "0.3.0" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 2041 | 2042 | [[package]] 2043 | name = "jobserver" 2044 | version = "0.1.32" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 2047 | dependencies = [ 2048 | "libc", 2049 | ] 2050 | 2051 | [[package]] 2052 | name = "jpeg-decoder" 2053 | version = "0.3.1" 2054 | source = "registry+https://github.com/rust-lang/crates.io-index" 2055 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 2056 | 2057 | [[package]] 2058 | name = "js-sys" 2059 | version = "0.3.77" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 2062 | dependencies = [ 2063 | "once_cell", 2064 | "wasm-bindgen", 2065 | ] 2066 | 2067 | [[package]] 2068 | name = "khronos-egl" 2069 | version = "6.0.0" 2070 | source = "registry+https://github.com/rust-lang/crates.io-index" 2071 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 2072 | dependencies = [ 2073 | "libc", 2074 | "libloading", 2075 | "pkg-config", 2076 | ] 2077 | 2078 | [[package]] 2079 | name = "khronos_api" 2080 | version = "3.1.0" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 2083 | 2084 | [[package]] 2085 | name = "kurbo" 2086 | version = "0.9.5" 2087 | source = "registry+https://github.com/rust-lang/crates.io-index" 2088 | checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" 2089 | dependencies = [ 2090 | "arrayvec", 2091 | ] 2092 | 2093 | [[package]] 2094 | name = "lebe" 2095 | version = "0.5.2" 2096 | source = "registry+https://github.com/rust-lang/crates.io-index" 2097 | checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" 2098 | 2099 | [[package]] 2100 | name = "libc" 2101 | version = "0.2.169" 2102 | source = "registry+https://github.com/rust-lang/crates.io-index" 2103 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 2104 | 2105 | [[package]] 2106 | name = "libfuzzer-sys" 2107 | version = "0.4.9" 2108 | source = "registry+https://github.com/rust-lang/crates.io-index" 2109 | checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" 2110 | dependencies = [ 2111 | "arbitrary", 2112 | "cc", 2113 | ] 2114 | 2115 | [[package]] 2116 | name = "libloading" 2117 | version = "0.8.6" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 2120 | dependencies = [ 2121 | "cfg-if", 2122 | "windows-targets 0.52.6", 2123 | ] 2124 | 2125 | [[package]] 2126 | name = "libredox" 2127 | version = "0.1.3" 2128 | source = "registry+https://github.com/rust-lang/crates.io-index" 2129 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 2130 | dependencies = [ 2131 | "bitflags 2.8.0", 2132 | "libc", 2133 | "redox_syscall 0.5.8", 2134 | ] 2135 | 2136 | [[package]] 2137 | name = "linux-raw-sys" 2138 | version = "0.4.15" 2139 | source = "registry+https://github.com/rust-lang/crates.io-index" 2140 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2141 | 2142 | [[package]] 2143 | name = "litemap" 2144 | version = "0.7.4" 2145 | source = "registry+https://github.com/rust-lang/crates.io-index" 2146 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 2147 | 2148 | [[package]] 2149 | name = "litrs" 2150 | version = "0.4.1" 2151 | source = "registry+https://github.com/rust-lang/crates.io-index" 2152 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 2153 | 2154 | [[package]] 2155 | name = "lock_api" 2156 | version = "0.4.12" 2157 | source = "registry+https://github.com/rust-lang/crates.io-index" 2158 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 2159 | dependencies = [ 2160 | "autocfg", 2161 | "scopeguard", 2162 | ] 2163 | 2164 | [[package]] 2165 | name = "log" 2166 | version = "0.4.25" 2167 | source = "registry+https://github.com/rust-lang/crates.io-index" 2168 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 2169 | 2170 | [[package]] 2171 | name = "loop9" 2172 | version = "0.1.5" 2173 | source = "registry+https://github.com/rust-lang/crates.io-index" 2174 | checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" 2175 | dependencies = [ 2176 | "imgref", 2177 | ] 2178 | 2179 | [[package]] 2180 | name = "malloc_buf" 2181 | version = "0.0.6" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 2184 | dependencies = [ 2185 | "libc", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "maybe-rayon" 2190 | version = "0.1.1" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" 2193 | dependencies = [ 2194 | "cfg-if", 2195 | "rayon", 2196 | ] 2197 | 2198 | [[package]] 2199 | name = "memchr" 2200 | version = "2.7.4" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 2203 | 2204 | [[package]] 2205 | name = "memmap2" 2206 | version = "0.9.5" 2207 | source = "registry+https://github.com/rust-lang/crates.io-index" 2208 | checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 2209 | dependencies = [ 2210 | "libc", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "memoffset" 2215 | version = "0.9.1" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 2218 | dependencies = [ 2219 | "autocfg", 2220 | ] 2221 | 2222 | [[package]] 2223 | name = "metal" 2224 | version = "0.31.0" 2225 | source = "registry+https://github.com/rust-lang/crates.io-index" 2226 | checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" 2227 | dependencies = [ 2228 | "bitflags 2.8.0", 2229 | "block", 2230 | "core-graphics-types", 2231 | "foreign-types", 2232 | "log", 2233 | "objc", 2234 | "paste", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "mime" 2239 | version = "0.3.17" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2242 | 2243 | [[package]] 2244 | name = "mime_guess2" 2245 | version = "2.0.5" 2246 | source = "registry+https://github.com/rust-lang/crates.io-index" 2247 | checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41" 2248 | dependencies = [ 2249 | "mime", 2250 | "unicase", 2251 | ] 2252 | 2253 | [[package]] 2254 | name = "minimal-lexical" 2255 | version = "0.2.1" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2258 | 2259 | [[package]] 2260 | name = "miniz_oxide" 2261 | version = "0.8.3" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 2264 | dependencies = [ 2265 | "adler2", 2266 | "simd-adler32", 2267 | ] 2268 | 2269 | [[package]] 2270 | name = "naga" 2271 | version = "24.0.0" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" 2274 | dependencies = [ 2275 | "arrayvec", 2276 | "bit-set", 2277 | "bitflags 2.8.0", 2278 | "cfg_aliases", 2279 | "codespan-reporting", 2280 | "hexf-parse", 2281 | "indexmap", 2282 | "log", 2283 | "rustc-hash", 2284 | "spirv", 2285 | "strum", 2286 | "termcolor", 2287 | "thiserror 2.0.11", 2288 | "unicode-xid", 2289 | ] 2290 | 2291 | [[package]] 2292 | name = "ndk" 2293 | version = "0.9.0" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2296 | dependencies = [ 2297 | "bitflags 2.8.0", 2298 | "jni-sys", 2299 | "log", 2300 | "ndk-sys 0.6.0+11769913", 2301 | "num_enum", 2302 | "raw-window-handle", 2303 | "thiserror 1.0.69", 2304 | ] 2305 | 2306 | [[package]] 2307 | name = "ndk-context" 2308 | version = "0.1.1" 2309 | source = "registry+https://github.com/rust-lang/crates.io-index" 2310 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 2311 | 2312 | [[package]] 2313 | name = "ndk-sys" 2314 | version = "0.5.0+25.2.9519653" 2315 | source = "registry+https://github.com/rust-lang/crates.io-index" 2316 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 2317 | dependencies = [ 2318 | "jni-sys", 2319 | ] 2320 | 2321 | [[package]] 2322 | name = "ndk-sys" 2323 | version = "0.6.0+11769913" 2324 | source = "registry+https://github.com/rust-lang/crates.io-index" 2325 | checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" 2326 | dependencies = [ 2327 | "jni-sys", 2328 | ] 2329 | 2330 | [[package]] 2331 | name = "new_debug_unreachable" 2332 | version = "1.0.6" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 2335 | 2336 | [[package]] 2337 | name = "nix" 2338 | version = "0.29.0" 2339 | source = "registry+https://github.com/rust-lang/crates.io-index" 2340 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 2341 | dependencies = [ 2342 | "bitflags 2.8.0", 2343 | "cfg-if", 2344 | "cfg_aliases", 2345 | "libc", 2346 | "memoffset", 2347 | ] 2348 | 2349 | [[package]] 2350 | name = "nohash-hasher" 2351 | version = "0.2.0" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 2354 | 2355 | [[package]] 2356 | name = "nom" 2357 | version = "7.1.3" 2358 | source = "registry+https://github.com/rust-lang/crates.io-index" 2359 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2360 | dependencies = [ 2361 | "memchr", 2362 | "minimal-lexical", 2363 | ] 2364 | 2365 | [[package]] 2366 | name = "noop_proc_macro" 2367 | version = "0.3.0" 2368 | source = "registry+https://github.com/rust-lang/crates.io-index" 2369 | checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 2370 | 2371 | [[package]] 2372 | name = "num-bigint" 2373 | version = "0.4.6" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 2376 | dependencies = [ 2377 | "num-integer", 2378 | "num-traits", 2379 | ] 2380 | 2381 | [[package]] 2382 | name = "num-derive" 2383 | version = "0.4.2" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 2386 | dependencies = [ 2387 | "proc-macro2", 2388 | "quote", 2389 | "syn", 2390 | ] 2391 | 2392 | [[package]] 2393 | name = "num-integer" 2394 | version = "0.1.46" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 2397 | dependencies = [ 2398 | "num-traits", 2399 | ] 2400 | 2401 | [[package]] 2402 | name = "num-rational" 2403 | version = "0.4.2" 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" 2405 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 2406 | dependencies = [ 2407 | "num-bigint", 2408 | "num-integer", 2409 | "num-traits", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "num-traits" 2414 | version = "0.2.19" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2417 | dependencies = [ 2418 | "autocfg", 2419 | ] 2420 | 2421 | [[package]] 2422 | name = "num_enum" 2423 | version = "0.7.3" 2424 | source = "registry+https://github.com/rust-lang/crates.io-index" 2425 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 2426 | dependencies = [ 2427 | "num_enum_derive", 2428 | ] 2429 | 2430 | [[package]] 2431 | name = "num_enum_derive" 2432 | version = "0.7.3" 2433 | source = "registry+https://github.com/rust-lang/crates.io-index" 2434 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 2435 | dependencies = [ 2436 | "proc-macro-crate", 2437 | "proc-macro2", 2438 | "quote", 2439 | "syn", 2440 | ] 2441 | 2442 | [[package]] 2443 | name = "objc" 2444 | version = "0.2.7" 2445 | source = "registry+https://github.com/rust-lang/crates.io-index" 2446 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 2447 | dependencies = [ 2448 | "malloc_buf", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "objc-sys" 2453 | version = "0.3.5" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 2456 | 2457 | [[package]] 2458 | name = "objc2" 2459 | version = "0.5.2" 2460 | source = "registry+https://github.com/rust-lang/crates.io-index" 2461 | checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 2462 | dependencies = [ 2463 | "objc-sys", 2464 | "objc2-encode", 2465 | ] 2466 | 2467 | [[package]] 2468 | name = "objc2-app-kit" 2469 | version = "0.2.2" 2470 | source = "registry+https://github.com/rust-lang/crates.io-index" 2471 | checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 2472 | dependencies = [ 2473 | "bitflags 2.8.0", 2474 | "block2", 2475 | "libc", 2476 | "objc2", 2477 | "objc2-core-data", 2478 | "objc2-core-image", 2479 | "objc2-foundation", 2480 | "objc2-quartz-core", 2481 | ] 2482 | 2483 | [[package]] 2484 | name = "objc2-cloud-kit" 2485 | version = "0.2.2" 2486 | source = "registry+https://github.com/rust-lang/crates.io-index" 2487 | checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" 2488 | dependencies = [ 2489 | "bitflags 2.8.0", 2490 | "block2", 2491 | "objc2", 2492 | "objc2-core-location", 2493 | "objc2-foundation", 2494 | ] 2495 | 2496 | [[package]] 2497 | name = "objc2-contacts" 2498 | version = "0.2.2" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" 2501 | dependencies = [ 2502 | "block2", 2503 | "objc2", 2504 | "objc2-foundation", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "objc2-core-data" 2509 | version = "0.2.2" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 2512 | dependencies = [ 2513 | "bitflags 2.8.0", 2514 | "block2", 2515 | "objc2", 2516 | "objc2-foundation", 2517 | ] 2518 | 2519 | [[package]] 2520 | name = "objc2-core-image" 2521 | version = "0.2.2" 2522 | source = "registry+https://github.com/rust-lang/crates.io-index" 2523 | checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 2524 | dependencies = [ 2525 | "block2", 2526 | "objc2", 2527 | "objc2-foundation", 2528 | "objc2-metal", 2529 | ] 2530 | 2531 | [[package]] 2532 | name = "objc2-core-location" 2533 | version = "0.2.2" 2534 | source = "registry+https://github.com/rust-lang/crates.io-index" 2535 | checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" 2536 | dependencies = [ 2537 | "block2", 2538 | "objc2", 2539 | "objc2-contacts", 2540 | "objc2-foundation", 2541 | ] 2542 | 2543 | [[package]] 2544 | name = "objc2-encode" 2545 | version = "4.1.0" 2546 | source = "registry+https://github.com/rust-lang/crates.io-index" 2547 | checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 2548 | 2549 | [[package]] 2550 | name = "objc2-foundation" 2551 | version = "0.2.2" 2552 | source = "registry+https://github.com/rust-lang/crates.io-index" 2553 | checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2554 | dependencies = [ 2555 | "bitflags 2.8.0", 2556 | "block2", 2557 | "dispatch", 2558 | "libc", 2559 | "objc2", 2560 | ] 2561 | 2562 | [[package]] 2563 | name = "objc2-link-presentation" 2564 | version = "0.2.2" 2565 | source = "registry+https://github.com/rust-lang/crates.io-index" 2566 | checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" 2567 | dependencies = [ 2568 | "block2", 2569 | "objc2", 2570 | "objc2-app-kit", 2571 | "objc2-foundation", 2572 | ] 2573 | 2574 | [[package]] 2575 | name = "objc2-metal" 2576 | version = "0.2.2" 2577 | source = "registry+https://github.com/rust-lang/crates.io-index" 2578 | checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2579 | dependencies = [ 2580 | "bitflags 2.8.0", 2581 | "block2", 2582 | "objc2", 2583 | "objc2-foundation", 2584 | ] 2585 | 2586 | [[package]] 2587 | name = "objc2-quartz-core" 2588 | version = "0.2.2" 2589 | source = "registry+https://github.com/rust-lang/crates.io-index" 2590 | checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2591 | dependencies = [ 2592 | "bitflags 2.8.0", 2593 | "block2", 2594 | "objc2", 2595 | "objc2-foundation", 2596 | "objc2-metal", 2597 | ] 2598 | 2599 | [[package]] 2600 | name = "objc2-symbols" 2601 | version = "0.2.2" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" 2604 | dependencies = [ 2605 | "objc2", 2606 | "objc2-foundation", 2607 | ] 2608 | 2609 | [[package]] 2610 | name = "objc2-ui-kit" 2611 | version = "0.2.2" 2612 | source = "registry+https://github.com/rust-lang/crates.io-index" 2613 | checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" 2614 | dependencies = [ 2615 | "bitflags 2.8.0", 2616 | "block2", 2617 | "objc2", 2618 | "objc2-cloud-kit", 2619 | "objc2-core-data", 2620 | "objc2-core-image", 2621 | "objc2-core-location", 2622 | "objc2-foundation", 2623 | "objc2-link-presentation", 2624 | "objc2-quartz-core", 2625 | "objc2-symbols", 2626 | "objc2-uniform-type-identifiers", 2627 | "objc2-user-notifications", 2628 | ] 2629 | 2630 | [[package]] 2631 | name = "objc2-uniform-type-identifiers" 2632 | version = "0.2.2" 2633 | source = "registry+https://github.com/rust-lang/crates.io-index" 2634 | checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" 2635 | dependencies = [ 2636 | "block2", 2637 | "objc2", 2638 | "objc2-foundation", 2639 | ] 2640 | 2641 | [[package]] 2642 | name = "objc2-user-notifications" 2643 | version = "0.2.2" 2644 | source = "registry+https://github.com/rust-lang/crates.io-index" 2645 | checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" 2646 | dependencies = [ 2647 | "bitflags 2.8.0", 2648 | "block2", 2649 | "objc2", 2650 | "objc2-core-location", 2651 | "objc2-foundation", 2652 | ] 2653 | 2654 | [[package]] 2655 | name = "once_cell" 2656 | version = "1.20.3" 2657 | source = "registry+https://github.com/rust-lang/crates.io-index" 2658 | checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 2659 | 2660 | [[package]] 2661 | name = "open" 2662 | version = "5.3.2" 2663 | source = "registry+https://github.com/rust-lang/crates.io-index" 2664 | checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" 2665 | dependencies = [ 2666 | "is-wsl", 2667 | "libc", 2668 | "pathdiff", 2669 | ] 2670 | 2671 | [[package]] 2672 | name = "option-ext" 2673 | version = "0.2.0" 2674 | source = "registry+https://github.com/rust-lang/crates.io-index" 2675 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 2676 | 2677 | [[package]] 2678 | name = "orbclient" 2679 | version = "0.3.48" 2680 | source = "registry+https://github.com/rust-lang/crates.io-index" 2681 | checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" 2682 | dependencies = [ 2683 | "libredox", 2684 | ] 2685 | 2686 | [[package]] 2687 | name = "ordered-float" 2688 | version = "4.6.0" 2689 | source = "registry+https://github.com/rust-lang/crates.io-index" 2690 | checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" 2691 | dependencies = [ 2692 | "num-traits", 2693 | ] 2694 | 2695 | [[package]] 2696 | name = "ordered-stream" 2697 | version = "0.2.0" 2698 | source = "registry+https://github.com/rust-lang/crates.io-index" 2699 | checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 2700 | dependencies = [ 2701 | "futures-core", 2702 | "pin-project-lite", 2703 | ] 2704 | 2705 | [[package]] 2706 | name = "owned_ttf_parser" 2707 | version = "0.25.0" 2708 | source = "registry+https://github.com/rust-lang/crates.io-index" 2709 | checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" 2710 | dependencies = [ 2711 | "ttf-parser", 2712 | ] 2713 | 2714 | [[package]] 2715 | name = "parking" 2716 | version = "2.2.1" 2717 | source = "registry+https://github.com/rust-lang/crates.io-index" 2718 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2719 | 2720 | [[package]] 2721 | name = "parking_lot" 2722 | version = "0.12.3" 2723 | source = "registry+https://github.com/rust-lang/crates.io-index" 2724 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 2725 | dependencies = [ 2726 | "lock_api", 2727 | "parking_lot_core", 2728 | ] 2729 | 2730 | [[package]] 2731 | name = "parking_lot_core" 2732 | version = "0.9.10" 2733 | source = "registry+https://github.com/rust-lang/crates.io-index" 2734 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 2735 | dependencies = [ 2736 | "cfg-if", 2737 | "libc", 2738 | "redox_syscall 0.5.8", 2739 | "smallvec", 2740 | "windows-targets 0.52.6", 2741 | ] 2742 | 2743 | [[package]] 2744 | name = "paste" 2745 | version = "1.0.15" 2746 | source = "registry+https://github.com/rust-lang/crates.io-index" 2747 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 2748 | 2749 | [[package]] 2750 | name = "pathdiff" 2751 | version = "0.2.3" 2752 | source = "registry+https://github.com/rust-lang/crates.io-index" 2753 | checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 2754 | 2755 | [[package]] 2756 | name = "percent-encoding" 2757 | version = "2.3.1" 2758 | source = "registry+https://github.com/rust-lang/crates.io-index" 2759 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2760 | 2761 | [[package]] 2762 | name = "pico-args" 2763 | version = "0.5.0" 2764 | source = "registry+https://github.com/rust-lang/crates.io-index" 2765 | checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 2766 | 2767 | [[package]] 2768 | name = "pin-project" 2769 | version = "1.1.9" 2770 | source = "registry+https://github.com/rust-lang/crates.io-index" 2771 | checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" 2772 | dependencies = [ 2773 | "pin-project-internal", 2774 | ] 2775 | 2776 | [[package]] 2777 | name = "pin-project-internal" 2778 | version = "1.1.9" 2779 | source = "registry+https://github.com/rust-lang/crates.io-index" 2780 | checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" 2781 | dependencies = [ 2782 | "proc-macro2", 2783 | "quote", 2784 | "syn", 2785 | ] 2786 | 2787 | [[package]] 2788 | name = "pin-project-lite" 2789 | version = "0.2.16" 2790 | source = "registry+https://github.com/rust-lang/crates.io-index" 2791 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2792 | 2793 | [[package]] 2794 | name = "pin-utils" 2795 | version = "0.1.0" 2796 | source = "registry+https://github.com/rust-lang/crates.io-index" 2797 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2798 | 2799 | [[package]] 2800 | name = "piper" 2801 | version = "0.2.4" 2802 | source = "registry+https://github.com/rust-lang/crates.io-index" 2803 | checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 2804 | dependencies = [ 2805 | "atomic-waker", 2806 | "fastrand", 2807 | "futures-io", 2808 | ] 2809 | 2810 | [[package]] 2811 | name = "pkg-config" 2812 | version = "0.3.31" 2813 | source = "registry+https://github.com/rust-lang/crates.io-index" 2814 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 2815 | 2816 | [[package]] 2817 | name = "png" 2818 | version = "0.17.16" 2819 | source = "registry+https://github.com/rust-lang/crates.io-index" 2820 | checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 2821 | dependencies = [ 2822 | "bitflags 1.3.2", 2823 | "crc32fast", 2824 | "fdeflate", 2825 | "flate2", 2826 | "miniz_oxide", 2827 | ] 2828 | 2829 | [[package]] 2830 | name = "polling" 2831 | version = "3.7.4" 2832 | source = "registry+https://github.com/rust-lang/crates.io-index" 2833 | checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" 2834 | dependencies = [ 2835 | "cfg-if", 2836 | "concurrent-queue", 2837 | "hermit-abi", 2838 | "pin-project-lite", 2839 | "rustix", 2840 | "tracing", 2841 | "windows-sys 0.59.0", 2842 | ] 2843 | 2844 | [[package]] 2845 | name = "ppv-lite86" 2846 | version = "0.2.20" 2847 | source = "registry+https://github.com/rust-lang/crates.io-index" 2848 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 2849 | dependencies = [ 2850 | "zerocopy", 2851 | ] 2852 | 2853 | [[package]] 2854 | name = "proc-macro-crate" 2855 | version = "3.2.0" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 2858 | dependencies = [ 2859 | "toml_edit", 2860 | ] 2861 | 2862 | [[package]] 2863 | name = "proc-macro2" 2864 | version = "1.0.93" 2865 | source = "registry+https://github.com/rust-lang/crates.io-index" 2866 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 2867 | dependencies = [ 2868 | "unicode-ident", 2869 | ] 2870 | 2871 | [[package]] 2872 | name = "profiling" 2873 | version = "1.0.16" 2874 | source = "registry+https://github.com/rust-lang/crates.io-index" 2875 | checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 2876 | dependencies = [ 2877 | "profiling-procmacros", 2878 | ] 2879 | 2880 | [[package]] 2881 | name = "profiling-procmacros" 2882 | version = "1.0.16" 2883 | source = "registry+https://github.com/rust-lang/crates.io-index" 2884 | checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" 2885 | dependencies = [ 2886 | "quote", 2887 | "syn", 2888 | ] 2889 | 2890 | [[package]] 2891 | name = "pulldown-cmark" 2892 | version = "0.12.2" 2893 | source = "registry+https://github.com/rust-lang/crates.io-index" 2894 | checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14" 2895 | dependencies = [ 2896 | "bitflags 2.8.0", 2897 | "memchr", 2898 | "unicase", 2899 | ] 2900 | 2901 | [[package]] 2902 | name = "qoi" 2903 | version = "0.4.1" 2904 | source = "registry+https://github.com/rust-lang/crates.io-index" 2905 | checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" 2906 | dependencies = [ 2907 | "bytemuck", 2908 | ] 2909 | 2910 | [[package]] 2911 | name = "quick-error" 2912 | version = "2.0.1" 2913 | source = "registry+https://github.com/rust-lang/crates.io-index" 2914 | checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 2915 | 2916 | [[package]] 2917 | name = "quick-xml" 2918 | version = "0.30.0" 2919 | source = "registry+https://github.com/rust-lang/crates.io-index" 2920 | checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" 2921 | dependencies = [ 2922 | "memchr", 2923 | "serde", 2924 | ] 2925 | 2926 | [[package]] 2927 | name = "quick-xml" 2928 | version = "0.37.2" 2929 | source = "registry+https://github.com/rust-lang/crates.io-index" 2930 | checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" 2931 | dependencies = [ 2932 | "memchr", 2933 | ] 2934 | 2935 | [[package]] 2936 | name = "quote" 2937 | version = "1.0.38" 2938 | source = "registry+https://github.com/rust-lang/crates.io-index" 2939 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 2940 | dependencies = [ 2941 | "proc-macro2", 2942 | ] 2943 | 2944 | [[package]] 2945 | name = "rand" 2946 | version = "0.8.5" 2947 | source = "registry+https://github.com/rust-lang/crates.io-index" 2948 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2949 | dependencies = [ 2950 | "libc", 2951 | "rand_chacha", 2952 | "rand_core", 2953 | ] 2954 | 2955 | [[package]] 2956 | name = "rand_chacha" 2957 | version = "0.3.1" 2958 | source = "registry+https://github.com/rust-lang/crates.io-index" 2959 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2960 | dependencies = [ 2961 | "ppv-lite86", 2962 | "rand_core", 2963 | ] 2964 | 2965 | [[package]] 2966 | name = "rand_core" 2967 | version = "0.6.4" 2968 | source = "registry+https://github.com/rust-lang/crates.io-index" 2969 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2970 | dependencies = [ 2971 | "getrandom 0.2.15", 2972 | ] 2973 | 2974 | [[package]] 2975 | name = "rav1e" 2976 | version = "0.7.1" 2977 | source = "registry+https://github.com/rust-lang/crates.io-index" 2978 | checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" 2979 | dependencies = [ 2980 | "arbitrary", 2981 | "arg_enum_proc_macro", 2982 | "arrayvec", 2983 | "av1-grain", 2984 | "bitstream-io", 2985 | "built", 2986 | "cfg-if", 2987 | "interpolate_name", 2988 | "itertools", 2989 | "libc", 2990 | "libfuzzer-sys", 2991 | "log", 2992 | "maybe-rayon", 2993 | "new_debug_unreachable", 2994 | "noop_proc_macro", 2995 | "num-derive", 2996 | "num-traits", 2997 | "once_cell", 2998 | "paste", 2999 | "profiling", 3000 | "rand", 3001 | "rand_chacha", 3002 | "simd_helpers", 3003 | "system-deps", 3004 | "thiserror 1.0.69", 3005 | "v_frame", 3006 | "wasm-bindgen", 3007 | ] 3008 | 3009 | [[package]] 3010 | name = "ravif" 3011 | version = "0.11.11" 3012 | source = "registry+https://github.com/rust-lang/crates.io-index" 3013 | checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" 3014 | dependencies = [ 3015 | "avif-serialize", 3016 | "imgref", 3017 | "loop9", 3018 | "quick-error", 3019 | "rav1e", 3020 | "rayon", 3021 | "rgb", 3022 | ] 3023 | 3024 | [[package]] 3025 | name = "raw-window-handle" 3026 | version = "0.6.2" 3027 | source = "registry+https://github.com/rust-lang/crates.io-index" 3028 | checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 3029 | 3030 | [[package]] 3031 | name = "rayon" 3032 | version = "1.10.0" 3033 | source = "registry+https://github.com/rust-lang/crates.io-index" 3034 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 3035 | dependencies = [ 3036 | "either", 3037 | "rayon-core", 3038 | ] 3039 | 3040 | [[package]] 3041 | name = "rayon-core" 3042 | version = "1.12.1" 3043 | source = "registry+https://github.com/rust-lang/crates.io-index" 3044 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 3045 | dependencies = [ 3046 | "crossbeam-deque", 3047 | "crossbeam-utils", 3048 | ] 3049 | 3050 | [[package]] 3051 | name = "rctree" 3052 | version = "0.5.0" 3053 | source = "registry+https://github.com/rust-lang/crates.io-index" 3054 | checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" 3055 | 3056 | [[package]] 3057 | name = "redox_syscall" 3058 | version = "0.4.1" 3059 | source = "registry+https://github.com/rust-lang/crates.io-index" 3060 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 3061 | dependencies = [ 3062 | "bitflags 1.3.2", 3063 | ] 3064 | 3065 | [[package]] 3066 | name = "redox_syscall" 3067 | version = "0.5.8" 3068 | source = "registry+https://github.com/rust-lang/crates.io-index" 3069 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 3070 | dependencies = [ 3071 | "bitflags 2.8.0", 3072 | ] 3073 | 3074 | [[package]] 3075 | name = "redox_users" 3076 | version = "0.5.0" 3077 | source = "registry+https://github.com/rust-lang/crates.io-index" 3078 | checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3079 | dependencies = [ 3080 | "getrandom 0.2.15", 3081 | "libredox", 3082 | "thiserror 2.0.11", 3083 | ] 3084 | 3085 | [[package]] 3086 | name = "renderdoc-sys" 3087 | version = "1.1.0" 3088 | source = "registry+https://github.com/rust-lang/crates.io-index" 3089 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 3090 | 3091 | [[package]] 3092 | name = "resvg" 3093 | version = "0.37.0" 3094 | source = "registry+https://github.com/rust-lang/crates.io-index" 3095 | checksum = "cadccb3d99a9efb8e5e00c16fbb732cbe400db2ec7fc004697ee7d97d86cf1f4" 3096 | dependencies = [ 3097 | "log", 3098 | "pico-args", 3099 | "rgb", 3100 | "svgtypes", 3101 | "tiny-skia", 3102 | "usvg", 3103 | ] 3104 | 3105 | [[package]] 3106 | name = "rgb" 3107 | version = "0.8.50" 3108 | source = "registry+https://github.com/rust-lang/crates.io-index" 3109 | checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" 3110 | dependencies = [ 3111 | "bytemuck", 3112 | ] 3113 | 3114 | [[package]] 3115 | name = "ring" 3116 | version = "0.17.8" 3117 | source = "registry+https://github.com/rust-lang/crates.io-index" 3118 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 3119 | dependencies = [ 3120 | "cc", 3121 | "cfg-if", 3122 | "getrandom 0.2.15", 3123 | "libc", 3124 | "spin", 3125 | "untrusted", 3126 | "windows-sys 0.52.0", 3127 | ] 3128 | 3129 | [[package]] 3130 | name = "roxmltree" 3131 | version = "0.19.0" 3132 | source = "registry+https://github.com/rust-lang/crates.io-index" 3133 | checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" 3134 | 3135 | [[package]] 3136 | name = "rustc-hash" 3137 | version = "1.1.0" 3138 | source = "registry+https://github.com/rust-lang/crates.io-index" 3139 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 3140 | 3141 | [[package]] 3142 | name = "rustix" 3143 | version = "0.38.44" 3144 | source = "registry+https://github.com/rust-lang/crates.io-index" 3145 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 3146 | dependencies = [ 3147 | "bitflags 2.8.0", 3148 | "errno", 3149 | "libc", 3150 | "linux-raw-sys", 3151 | "windows-sys 0.59.0", 3152 | ] 3153 | 3154 | [[package]] 3155 | name = "rustls" 3156 | version = "0.23.22" 3157 | source = "registry+https://github.com/rust-lang/crates.io-index" 3158 | checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" 3159 | dependencies = [ 3160 | "log", 3161 | "once_cell", 3162 | "ring", 3163 | "rustls-pki-types", 3164 | "rustls-webpki", 3165 | "subtle", 3166 | "zeroize", 3167 | ] 3168 | 3169 | [[package]] 3170 | name = "rustls-pki-types" 3171 | version = "1.11.0" 3172 | source = "registry+https://github.com/rust-lang/crates.io-index" 3173 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 3174 | 3175 | [[package]] 3176 | name = "rustls-webpki" 3177 | version = "0.102.8" 3178 | source = "registry+https://github.com/rust-lang/crates.io-index" 3179 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 3180 | dependencies = [ 3181 | "ring", 3182 | "rustls-pki-types", 3183 | "untrusted", 3184 | ] 3185 | 3186 | [[package]] 3187 | name = "rustversion" 3188 | version = "1.0.19" 3189 | source = "registry+https://github.com/rust-lang/crates.io-index" 3190 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 3191 | 3192 | [[package]] 3193 | name = "ryu" 3194 | version = "1.0.19" 3195 | source = "registry+https://github.com/rust-lang/crates.io-index" 3196 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 3197 | 3198 | [[package]] 3199 | name = "same-file" 3200 | version = "1.0.6" 3201 | source = "registry+https://github.com/rust-lang/crates.io-index" 3202 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 3203 | dependencies = [ 3204 | "winapi-util", 3205 | ] 3206 | 3207 | [[package]] 3208 | name = "scoped-tls" 3209 | version = "1.0.1" 3210 | source = "registry+https://github.com/rust-lang/crates.io-index" 3211 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 3212 | 3213 | [[package]] 3214 | name = "scopeguard" 3215 | version = "1.2.0" 3216 | source = "registry+https://github.com/rust-lang/crates.io-index" 3217 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 3218 | 3219 | [[package]] 3220 | name = "sctk-adwaita" 3221 | version = "0.10.1" 3222 | source = "registry+https://github.com/rust-lang/crates.io-index" 3223 | checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" 3224 | dependencies = [ 3225 | "ab_glyph", 3226 | "log", 3227 | "memmap2", 3228 | "smithay-client-toolkit", 3229 | "tiny-skia", 3230 | ] 3231 | 3232 | [[package]] 3233 | name = "semver" 3234 | version = "1.0.25" 3235 | source = "registry+https://github.com/rust-lang/crates.io-index" 3236 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 3237 | dependencies = [ 3238 | "serde", 3239 | ] 3240 | 3241 | [[package]] 3242 | name = "serde" 3243 | version = "1.0.217" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 3246 | dependencies = [ 3247 | "serde_derive", 3248 | ] 3249 | 3250 | [[package]] 3251 | name = "serde_derive" 3252 | version = "1.0.217" 3253 | source = "registry+https://github.com/rust-lang/crates.io-index" 3254 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 3255 | dependencies = [ 3256 | "proc-macro2", 3257 | "quote", 3258 | "syn", 3259 | ] 3260 | 3261 | [[package]] 3262 | name = "serde_json" 3263 | version = "1.0.138" 3264 | source = "registry+https://github.com/rust-lang/crates.io-index" 3265 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" 3266 | dependencies = [ 3267 | "itoa", 3268 | "memchr", 3269 | "ryu", 3270 | "serde", 3271 | ] 3272 | 3273 | [[package]] 3274 | name = "serde_repr" 3275 | version = "0.1.19" 3276 | source = "registry+https://github.com/rust-lang/crates.io-index" 3277 | checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" 3278 | dependencies = [ 3279 | "proc-macro2", 3280 | "quote", 3281 | "syn", 3282 | ] 3283 | 3284 | [[package]] 3285 | name = "serde_spanned" 3286 | version = "0.6.8" 3287 | source = "registry+https://github.com/rust-lang/crates.io-index" 3288 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 3289 | dependencies = [ 3290 | "serde", 3291 | ] 3292 | 3293 | [[package]] 3294 | name = "sha1" 3295 | version = "0.10.6" 3296 | source = "registry+https://github.com/rust-lang/crates.io-index" 3297 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3298 | dependencies = [ 3299 | "cfg-if", 3300 | "cpufeatures", 3301 | "digest", 3302 | ] 3303 | 3304 | [[package]] 3305 | name = "shlex" 3306 | version = "1.3.0" 3307 | source = "registry+https://github.com/rust-lang/crates.io-index" 3308 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 3309 | 3310 | [[package]] 3311 | name = "signal-hook-registry" 3312 | version = "1.4.2" 3313 | source = "registry+https://github.com/rust-lang/crates.io-index" 3314 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 3315 | dependencies = [ 3316 | "libc", 3317 | ] 3318 | 3319 | [[package]] 3320 | name = "simd-adler32" 3321 | version = "0.3.7" 3322 | source = "registry+https://github.com/rust-lang/crates.io-index" 3323 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 3324 | 3325 | [[package]] 3326 | name = "simd_helpers" 3327 | version = "0.1.0" 3328 | source = "registry+https://github.com/rust-lang/crates.io-index" 3329 | checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" 3330 | dependencies = [ 3331 | "quote", 3332 | ] 3333 | 3334 | [[package]] 3335 | name = "simplecss" 3336 | version = "0.2.2" 3337 | source = "registry+https://github.com/rust-lang/crates.io-index" 3338 | checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" 3339 | dependencies = [ 3340 | "log", 3341 | ] 3342 | 3343 | [[package]] 3344 | name = "siphasher" 3345 | version = "0.3.11" 3346 | source = "registry+https://github.com/rust-lang/crates.io-index" 3347 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 3348 | 3349 | [[package]] 3350 | name = "slab" 3351 | version = "0.4.9" 3352 | source = "registry+https://github.com/rust-lang/crates.io-index" 3353 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 3354 | dependencies = [ 3355 | "autocfg", 3356 | ] 3357 | 3358 | [[package]] 3359 | name = "slotmap" 3360 | version = "1.0.7" 3361 | source = "registry+https://github.com/rust-lang/crates.io-index" 3362 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 3363 | dependencies = [ 3364 | "version_check", 3365 | ] 3366 | 3367 | [[package]] 3368 | name = "smallvec" 3369 | version = "1.13.2" 3370 | source = "registry+https://github.com/rust-lang/crates.io-index" 3371 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 3372 | 3373 | [[package]] 3374 | name = "smithay-client-toolkit" 3375 | version = "0.19.2" 3376 | source = "registry+https://github.com/rust-lang/crates.io-index" 3377 | checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" 3378 | dependencies = [ 3379 | "bitflags 2.8.0", 3380 | "calloop", 3381 | "calloop-wayland-source", 3382 | "cursor-icon", 3383 | "libc", 3384 | "log", 3385 | "memmap2", 3386 | "rustix", 3387 | "thiserror 1.0.69", 3388 | "wayland-backend", 3389 | "wayland-client", 3390 | "wayland-csd-frame", 3391 | "wayland-cursor", 3392 | "wayland-protocols", 3393 | "wayland-protocols-wlr", 3394 | "wayland-scanner", 3395 | "xkeysym", 3396 | ] 3397 | 3398 | [[package]] 3399 | name = "smithay-clipboard" 3400 | version = "0.7.2" 3401 | source = "registry+https://github.com/rust-lang/crates.io-index" 3402 | checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" 3403 | dependencies = [ 3404 | "libc", 3405 | "smithay-client-toolkit", 3406 | "wayland-backend", 3407 | ] 3408 | 3409 | [[package]] 3410 | name = "smol_str" 3411 | version = "0.2.2" 3412 | source = "registry+https://github.com/rust-lang/crates.io-index" 3413 | checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" 3414 | dependencies = [ 3415 | "serde", 3416 | ] 3417 | 3418 | [[package]] 3419 | name = "spin" 3420 | version = "0.9.8" 3421 | source = "registry+https://github.com/rust-lang/crates.io-index" 3422 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3423 | 3424 | [[package]] 3425 | name = "spirv" 3426 | version = "0.3.0+sdk-1.3.268.0" 3427 | source = "registry+https://github.com/rust-lang/crates.io-index" 3428 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 3429 | dependencies = [ 3430 | "bitflags 2.8.0", 3431 | ] 3432 | 3433 | [[package]] 3434 | name = "stable_deref_trait" 3435 | version = "1.2.0" 3436 | source = "registry+https://github.com/rust-lang/crates.io-index" 3437 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3438 | 3439 | [[package]] 3440 | name = "static_assertions" 3441 | version = "1.1.0" 3442 | source = "registry+https://github.com/rust-lang/crates.io-index" 3443 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3444 | 3445 | [[package]] 3446 | name = "strict-num" 3447 | version = "0.1.1" 3448 | source = "registry+https://github.com/rust-lang/crates.io-index" 3449 | checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 3450 | dependencies = [ 3451 | "float-cmp", 3452 | ] 3453 | 3454 | [[package]] 3455 | name = "strsim" 3456 | version = "0.11.1" 3457 | source = "registry+https://github.com/rust-lang/crates.io-index" 3458 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3459 | 3460 | [[package]] 3461 | name = "strum" 3462 | version = "0.26.3" 3463 | source = "registry+https://github.com/rust-lang/crates.io-index" 3464 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 3465 | dependencies = [ 3466 | "strum_macros", 3467 | ] 3468 | 3469 | [[package]] 3470 | name = "strum_macros" 3471 | version = "0.26.4" 3472 | source = "registry+https://github.com/rust-lang/crates.io-index" 3473 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 3474 | dependencies = [ 3475 | "heck", 3476 | "proc-macro2", 3477 | "quote", 3478 | "rustversion", 3479 | "syn", 3480 | ] 3481 | 3482 | [[package]] 3483 | name = "subtle" 3484 | version = "2.6.1" 3485 | source = "registry+https://github.com/rust-lang/crates.io-index" 3486 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3487 | 3488 | [[package]] 3489 | name = "svgtypes" 3490 | version = "0.13.0" 3491 | source = "registry+https://github.com/rust-lang/crates.io-index" 3492 | checksum = "6e44e288cd960318917cbd540340968b90becc8bc81f171345d706e7a89d9d70" 3493 | dependencies = [ 3494 | "kurbo", 3495 | "siphasher", 3496 | ] 3497 | 3498 | [[package]] 3499 | name = "syn" 3500 | version = "2.0.98" 3501 | source = "registry+https://github.com/rust-lang/crates.io-index" 3502 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 3503 | dependencies = [ 3504 | "proc-macro2", 3505 | "quote", 3506 | "unicode-ident", 3507 | ] 3508 | 3509 | [[package]] 3510 | name = "synstructure" 3511 | version = "0.13.1" 3512 | source = "registry+https://github.com/rust-lang/crates.io-index" 3513 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 3514 | dependencies = [ 3515 | "proc-macro2", 3516 | "quote", 3517 | "syn", 3518 | ] 3519 | 3520 | [[package]] 3521 | name = "system-deps" 3522 | version = "6.2.2" 3523 | source = "registry+https://github.com/rust-lang/crates.io-index" 3524 | checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 3525 | dependencies = [ 3526 | "cfg-expr", 3527 | "heck", 3528 | "pkg-config", 3529 | "toml", 3530 | "version-compare", 3531 | ] 3532 | 3533 | [[package]] 3534 | name = "target-lexicon" 3535 | version = "0.12.16" 3536 | source = "registry+https://github.com/rust-lang/crates.io-index" 3537 | checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 3538 | 3539 | [[package]] 3540 | name = "tempfile" 3541 | version = "3.16.0" 3542 | source = "registry+https://github.com/rust-lang/crates.io-index" 3543 | checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" 3544 | dependencies = [ 3545 | "cfg-if", 3546 | "fastrand", 3547 | "getrandom 0.3.1", 3548 | "once_cell", 3549 | "rustix", 3550 | "windows-sys 0.59.0", 3551 | ] 3552 | 3553 | [[package]] 3554 | name = "termcolor" 3555 | version = "1.4.1" 3556 | source = "registry+https://github.com/rust-lang/crates.io-index" 3557 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 3558 | dependencies = [ 3559 | "winapi-util", 3560 | ] 3561 | 3562 | [[package]] 3563 | name = "thiserror" 3564 | version = "1.0.69" 3565 | source = "registry+https://github.com/rust-lang/crates.io-index" 3566 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 3567 | dependencies = [ 3568 | "thiserror-impl 1.0.69", 3569 | ] 3570 | 3571 | [[package]] 3572 | name = "thiserror" 3573 | version = "2.0.11" 3574 | source = "registry+https://github.com/rust-lang/crates.io-index" 3575 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 3576 | dependencies = [ 3577 | "thiserror-impl 2.0.11", 3578 | ] 3579 | 3580 | [[package]] 3581 | name = "thiserror-impl" 3582 | version = "1.0.69" 3583 | source = "registry+https://github.com/rust-lang/crates.io-index" 3584 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 3585 | dependencies = [ 3586 | "proc-macro2", 3587 | "quote", 3588 | "syn", 3589 | ] 3590 | 3591 | [[package]] 3592 | name = "thiserror-impl" 3593 | version = "2.0.11" 3594 | source = "registry+https://github.com/rust-lang/crates.io-index" 3595 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 3596 | dependencies = [ 3597 | "proc-macro2", 3598 | "quote", 3599 | "syn", 3600 | ] 3601 | 3602 | [[package]] 3603 | name = "tiff" 3604 | version = "0.9.1" 3605 | source = "registry+https://github.com/rust-lang/crates.io-index" 3606 | checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 3607 | dependencies = [ 3608 | "flate2", 3609 | "jpeg-decoder", 3610 | "weezl", 3611 | ] 3612 | 3613 | [[package]] 3614 | name = "tiny-skia" 3615 | version = "0.11.4" 3616 | source = "registry+https://github.com/rust-lang/crates.io-index" 3617 | checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" 3618 | dependencies = [ 3619 | "arrayref", 3620 | "arrayvec", 3621 | "bytemuck", 3622 | "cfg-if", 3623 | "log", 3624 | "png", 3625 | "tiny-skia-path", 3626 | ] 3627 | 3628 | [[package]] 3629 | name = "tiny-skia-path" 3630 | version = "0.11.4" 3631 | source = "registry+https://github.com/rust-lang/crates.io-index" 3632 | checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 3633 | dependencies = [ 3634 | "arrayref", 3635 | "bytemuck", 3636 | "strict-num", 3637 | ] 3638 | 3639 | [[package]] 3640 | name = "tinystr" 3641 | version = "0.7.6" 3642 | source = "registry+https://github.com/rust-lang/crates.io-index" 3643 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 3644 | dependencies = [ 3645 | "displaydoc", 3646 | "zerovec", 3647 | ] 3648 | 3649 | [[package]] 3650 | name = "toml" 3651 | version = "0.8.20" 3652 | source = "registry+https://github.com/rust-lang/crates.io-index" 3653 | checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" 3654 | dependencies = [ 3655 | "serde", 3656 | "serde_spanned", 3657 | "toml_datetime", 3658 | "toml_edit", 3659 | ] 3660 | 3661 | [[package]] 3662 | name = "toml_datetime" 3663 | version = "0.6.8" 3664 | source = "registry+https://github.com/rust-lang/crates.io-index" 3665 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 3666 | dependencies = [ 3667 | "serde", 3668 | ] 3669 | 3670 | [[package]] 3671 | name = "toml_edit" 3672 | version = "0.22.23" 3673 | source = "registry+https://github.com/rust-lang/crates.io-index" 3674 | checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" 3675 | dependencies = [ 3676 | "indexmap", 3677 | "serde", 3678 | "serde_spanned", 3679 | "toml_datetime", 3680 | "winnow", 3681 | ] 3682 | 3683 | [[package]] 3684 | name = "tracing" 3685 | version = "0.1.41" 3686 | source = "registry+https://github.com/rust-lang/crates.io-index" 3687 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 3688 | dependencies = [ 3689 | "pin-project-lite", 3690 | "tracing-attributes", 3691 | "tracing-core", 3692 | ] 3693 | 3694 | [[package]] 3695 | name = "tracing-attributes" 3696 | version = "0.1.28" 3697 | source = "registry+https://github.com/rust-lang/crates.io-index" 3698 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 3699 | dependencies = [ 3700 | "proc-macro2", 3701 | "quote", 3702 | "syn", 3703 | ] 3704 | 3705 | [[package]] 3706 | name = "tracing-core" 3707 | version = "0.1.33" 3708 | source = "registry+https://github.com/rust-lang/crates.io-index" 3709 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 3710 | dependencies = [ 3711 | "once_cell", 3712 | ] 3713 | 3714 | [[package]] 3715 | name = "ttf-parser" 3716 | version = "0.25.1" 3717 | source = "registry+https://github.com/rust-lang/crates.io-index" 3718 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 3719 | 3720 | [[package]] 3721 | name = "type-map" 3722 | version = "0.5.0" 3723 | source = "registry+https://github.com/rust-lang/crates.io-index" 3724 | checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" 3725 | dependencies = [ 3726 | "rustc-hash", 3727 | ] 3728 | 3729 | [[package]] 3730 | name = "typenum" 3731 | version = "1.17.0" 3732 | source = "registry+https://github.com/rust-lang/crates.io-index" 3733 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 3734 | 3735 | [[package]] 3736 | name = "uds_windows" 3737 | version = "1.1.0" 3738 | source = "registry+https://github.com/rust-lang/crates.io-index" 3739 | checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" 3740 | dependencies = [ 3741 | "memoffset", 3742 | "tempfile", 3743 | "winapi", 3744 | ] 3745 | 3746 | [[package]] 3747 | name = "unicase" 3748 | version = "2.8.1" 3749 | source = "registry+https://github.com/rust-lang/crates.io-index" 3750 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 3751 | 3752 | [[package]] 3753 | name = "unicode-ident" 3754 | version = "1.0.16" 3755 | source = "registry+https://github.com/rust-lang/crates.io-index" 3756 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 3757 | 3758 | [[package]] 3759 | name = "unicode-segmentation" 3760 | version = "1.12.0" 3761 | source = "registry+https://github.com/rust-lang/crates.io-index" 3762 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 3763 | 3764 | [[package]] 3765 | name = "unicode-width" 3766 | version = "0.1.14" 3767 | source = "registry+https://github.com/rust-lang/crates.io-index" 3768 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 3769 | 3770 | [[package]] 3771 | name = "unicode-xid" 3772 | version = "0.2.6" 3773 | source = "registry+https://github.com/rust-lang/crates.io-index" 3774 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 3775 | 3776 | [[package]] 3777 | name = "untrusted" 3778 | version = "0.9.0" 3779 | source = "registry+https://github.com/rust-lang/crates.io-index" 3780 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 3781 | 3782 | [[package]] 3783 | name = "ureq" 3784 | version = "2.12.1" 3785 | source = "registry+https://github.com/rust-lang/crates.io-index" 3786 | checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" 3787 | dependencies = [ 3788 | "base64 0.22.1", 3789 | "flate2", 3790 | "log", 3791 | "once_cell", 3792 | "rustls", 3793 | "rustls-pki-types", 3794 | "url", 3795 | "webpki-roots", 3796 | ] 3797 | 3798 | [[package]] 3799 | name = "url" 3800 | version = "2.5.4" 3801 | source = "registry+https://github.com/rust-lang/crates.io-index" 3802 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 3803 | dependencies = [ 3804 | "form_urlencoded", 3805 | "idna", 3806 | "percent-encoding", 3807 | ] 3808 | 3809 | [[package]] 3810 | name = "usvg" 3811 | version = "0.37.0" 3812 | source = "registry+https://github.com/rust-lang/crates.io-index" 3813 | checksum = "38b0a51b72ab80ca511d126b77feeeb4fb1e972764653e61feac30adc161a756" 3814 | dependencies = [ 3815 | "base64 0.21.7", 3816 | "log", 3817 | "pico-args", 3818 | "usvg-parser", 3819 | "usvg-tree", 3820 | "xmlwriter", 3821 | ] 3822 | 3823 | [[package]] 3824 | name = "usvg-parser" 3825 | version = "0.37.0" 3826 | source = "registry+https://github.com/rust-lang/crates.io-index" 3827 | checksum = "9bd4e3c291f45d152929a31f0f6c819245e2921bfd01e7bd91201a9af39a2bdc" 3828 | dependencies = [ 3829 | "data-url", 3830 | "flate2", 3831 | "imagesize", 3832 | "kurbo", 3833 | "log", 3834 | "roxmltree", 3835 | "simplecss", 3836 | "siphasher", 3837 | "svgtypes", 3838 | "usvg-tree", 3839 | ] 3840 | 3841 | [[package]] 3842 | name = "usvg-tree" 3843 | version = "0.37.0" 3844 | source = "registry+https://github.com/rust-lang/crates.io-index" 3845 | checksum = "8ee3d202ebdb97a6215604b8f5b4d6ef9024efd623cf2e373a6416ba976ec7d3" 3846 | dependencies = [ 3847 | "rctree", 3848 | "strict-num", 3849 | "svgtypes", 3850 | "tiny-skia-path", 3851 | ] 3852 | 3853 | [[package]] 3854 | name = "utf16_iter" 3855 | version = "1.0.5" 3856 | source = "registry+https://github.com/rust-lang/crates.io-index" 3857 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 3858 | 3859 | [[package]] 3860 | name = "utf8_iter" 3861 | version = "1.0.4" 3862 | source = "registry+https://github.com/rust-lang/crates.io-index" 3863 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3864 | 3865 | [[package]] 3866 | name = "utf8parse" 3867 | version = "0.2.2" 3868 | source = "registry+https://github.com/rust-lang/crates.io-index" 3869 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3870 | 3871 | [[package]] 3872 | name = "v_frame" 3873 | version = "0.3.8" 3874 | source = "registry+https://github.com/rust-lang/crates.io-index" 3875 | checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" 3876 | dependencies = [ 3877 | "aligned-vec", 3878 | "num-traits", 3879 | "wasm-bindgen", 3880 | ] 3881 | 3882 | [[package]] 3883 | name = "version-compare" 3884 | version = "0.2.0" 3885 | source = "registry+https://github.com/rust-lang/crates.io-index" 3886 | checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 3887 | 3888 | [[package]] 3889 | name = "version_check" 3890 | version = "0.9.5" 3891 | source = "registry+https://github.com/rust-lang/crates.io-index" 3892 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3893 | 3894 | [[package]] 3895 | name = "walkdir" 3896 | version = "2.5.0" 3897 | source = "registry+https://github.com/rust-lang/crates.io-index" 3898 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3899 | dependencies = [ 3900 | "same-file", 3901 | "winapi-util", 3902 | ] 3903 | 3904 | [[package]] 3905 | name = "wasi" 3906 | version = "0.11.0+wasi-snapshot-preview1" 3907 | source = "registry+https://github.com/rust-lang/crates.io-index" 3908 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3909 | 3910 | [[package]] 3911 | name = "wasi" 3912 | version = "0.13.3+wasi-0.2.2" 3913 | source = "registry+https://github.com/rust-lang/crates.io-index" 3914 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 3915 | dependencies = [ 3916 | "wit-bindgen-rt", 3917 | ] 3918 | 3919 | [[package]] 3920 | name = "wasm-bindgen" 3921 | version = "0.2.100" 3922 | source = "registry+https://github.com/rust-lang/crates.io-index" 3923 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 3924 | dependencies = [ 3925 | "cfg-if", 3926 | "once_cell", 3927 | "rustversion", 3928 | "wasm-bindgen-macro", 3929 | ] 3930 | 3931 | [[package]] 3932 | name = "wasm-bindgen-backend" 3933 | version = "0.2.100" 3934 | source = "registry+https://github.com/rust-lang/crates.io-index" 3935 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 3936 | dependencies = [ 3937 | "bumpalo", 3938 | "log", 3939 | "proc-macro2", 3940 | "quote", 3941 | "syn", 3942 | "wasm-bindgen-shared", 3943 | ] 3944 | 3945 | [[package]] 3946 | name = "wasm-bindgen-futures" 3947 | version = "0.4.50" 3948 | source = "registry+https://github.com/rust-lang/crates.io-index" 3949 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 3950 | dependencies = [ 3951 | "cfg-if", 3952 | "js-sys", 3953 | "once_cell", 3954 | "wasm-bindgen", 3955 | "web-sys", 3956 | ] 3957 | 3958 | [[package]] 3959 | name = "wasm-bindgen-macro" 3960 | version = "0.2.100" 3961 | source = "registry+https://github.com/rust-lang/crates.io-index" 3962 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 3963 | dependencies = [ 3964 | "quote", 3965 | "wasm-bindgen-macro-support", 3966 | ] 3967 | 3968 | [[package]] 3969 | name = "wasm-bindgen-macro-support" 3970 | version = "0.2.100" 3971 | source = "registry+https://github.com/rust-lang/crates.io-index" 3972 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 3973 | dependencies = [ 3974 | "proc-macro2", 3975 | "quote", 3976 | "syn", 3977 | "wasm-bindgen-backend", 3978 | "wasm-bindgen-shared", 3979 | ] 3980 | 3981 | [[package]] 3982 | name = "wasm-bindgen-shared" 3983 | version = "0.2.100" 3984 | source = "registry+https://github.com/rust-lang/crates.io-index" 3985 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 3986 | dependencies = [ 3987 | "unicode-ident", 3988 | ] 3989 | 3990 | [[package]] 3991 | name = "wayland-backend" 3992 | version = "0.3.8" 3993 | source = "registry+https://github.com/rust-lang/crates.io-index" 3994 | checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" 3995 | dependencies = [ 3996 | "cc", 3997 | "downcast-rs", 3998 | "rustix", 3999 | "scoped-tls", 4000 | "smallvec", 4001 | "wayland-sys", 4002 | ] 4003 | 4004 | [[package]] 4005 | name = "wayland-client" 4006 | version = "0.31.8" 4007 | source = "registry+https://github.com/rust-lang/crates.io-index" 4008 | checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" 4009 | dependencies = [ 4010 | "bitflags 2.8.0", 4011 | "rustix", 4012 | "wayland-backend", 4013 | "wayland-scanner", 4014 | ] 4015 | 4016 | [[package]] 4017 | name = "wayland-csd-frame" 4018 | version = "0.3.0" 4019 | source = "registry+https://github.com/rust-lang/crates.io-index" 4020 | checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" 4021 | dependencies = [ 4022 | "bitflags 2.8.0", 4023 | "cursor-icon", 4024 | "wayland-backend", 4025 | ] 4026 | 4027 | [[package]] 4028 | name = "wayland-cursor" 4029 | version = "0.31.8" 4030 | source = "registry+https://github.com/rust-lang/crates.io-index" 4031 | checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" 4032 | dependencies = [ 4033 | "rustix", 4034 | "wayland-client", 4035 | "xcursor", 4036 | ] 4037 | 4038 | [[package]] 4039 | name = "wayland-protocols" 4040 | version = "0.32.6" 4041 | source = "registry+https://github.com/rust-lang/crates.io-index" 4042 | checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" 4043 | dependencies = [ 4044 | "bitflags 2.8.0", 4045 | "wayland-backend", 4046 | "wayland-client", 4047 | "wayland-scanner", 4048 | ] 4049 | 4050 | [[package]] 4051 | name = "wayland-protocols-plasma" 4052 | version = "0.3.6" 4053 | source = "registry+https://github.com/rust-lang/crates.io-index" 4054 | checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" 4055 | dependencies = [ 4056 | "bitflags 2.8.0", 4057 | "wayland-backend", 4058 | "wayland-client", 4059 | "wayland-protocols", 4060 | "wayland-scanner", 4061 | ] 4062 | 4063 | [[package]] 4064 | name = "wayland-protocols-wlr" 4065 | version = "0.3.6" 4066 | source = "registry+https://github.com/rust-lang/crates.io-index" 4067 | checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" 4068 | dependencies = [ 4069 | "bitflags 2.8.0", 4070 | "wayland-backend", 4071 | "wayland-client", 4072 | "wayland-protocols", 4073 | "wayland-scanner", 4074 | ] 4075 | 4076 | [[package]] 4077 | name = "wayland-scanner" 4078 | version = "0.31.6" 4079 | source = "registry+https://github.com/rust-lang/crates.io-index" 4080 | checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" 4081 | dependencies = [ 4082 | "proc-macro2", 4083 | "quick-xml 0.37.2", 4084 | "quote", 4085 | ] 4086 | 4087 | [[package]] 4088 | name = "wayland-sys" 4089 | version = "0.31.6" 4090 | source = "registry+https://github.com/rust-lang/crates.io-index" 4091 | checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" 4092 | dependencies = [ 4093 | "dlib", 4094 | "log", 4095 | "once_cell", 4096 | "pkg-config", 4097 | ] 4098 | 4099 | [[package]] 4100 | name = "web-sys" 4101 | version = "0.3.77" 4102 | source = "registry+https://github.com/rust-lang/crates.io-index" 4103 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 4104 | dependencies = [ 4105 | "js-sys", 4106 | "wasm-bindgen", 4107 | ] 4108 | 4109 | [[package]] 4110 | name = "web-time" 4111 | version = "1.1.0" 4112 | source = "registry+https://github.com/rust-lang/crates.io-index" 4113 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 4114 | dependencies = [ 4115 | "js-sys", 4116 | "wasm-bindgen", 4117 | ] 4118 | 4119 | [[package]] 4120 | name = "webbrowser" 4121 | version = "1.0.3" 4122 | source = "registry+https://github.com/rust-lang/crates.io-index" 4123 | checksum = "ea9fe1ebb156110ff855242c1101df158b822487e4957b0556d9ffce9db0f535" 4124 | dependencies = [ 4125 | "block2", 4126 | "core-foundation 0.10.0", 4127 | "home", 4128 | "jni", 4129 | "log", 4130 | "ndk-context", 4131 | "objc2", 4132 | "objc2-foundation", 4133 | "url", 4134 | "web-sys", 4135 | ] 4136 | 4137 | [[package]] 4138 | name = "webpki-roots" 4139 | version = "0.26.8" 4140 | source = "registry+https://github.com/rust-lang/crates.io-index" 4141 | checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" 4142 | dependencies = [ 4143 | "rustls-pki-types", 4144 | ] 4145 | 4146 | [[package]] 4147 | name = "weezl" 4148 | version = "0.1.8" 4149 | source = "registry+https://github.com/rust-lang/crates.io-index" 4150 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 4151 | 4152 | [[package]] 4153 | name = "wgpu" 4154 | version = "24.0.1" 4155 | source = "registry+https://github.com/rust-lang/crates.io-index" 4156 | checksum = "47f55718f85c2fa756edffa0e7f0e0a60aba463d1362b57e23123c58f035e4b6" 4157 | dependencies = [ 4158 | "arrayvec", 4159 | "bitflags 2.8.0", 4160 | "cfg_aliases", 4161 | "document-features", 4162 | "js-sys", 4163 | "log", 4164 | "parking_lot", 4165 | "profiling", 4166 | "raw-window-handle", 4167 | "smallvec", 4168 | "static_assertions", 4169 | "wasm-bindgen", 4170 | "wasm-bindgen-futures", 4171 | "web-sys", 4172 | "wgpu-core", 4173 | "wgpu-hal", 4174 | "wgpu-types", 4175 | ] 4176 | 4177 | [[package]] 4178 | name = "wgpu-core" 4179 | version = "24.0.0" 4180 | source = "registry+https://github.com/rust-lang/crates.io-index" 4181 | checksum = "82a39b8842dc9ffcbe34346e3ab6d496b32a47f6497e119d762c97fcaae3cb37" 4182 | dependencies = [ 4183 | "arrayvec", 4184 | "bit-vec", 4185 | "bitflags 2.8.0", 4186 | "cfg_aliases", 4187 | "document-features", 4188 | "indexmap", 4189 | "log", 4190 | "naga", 4191 | "once_cell", 4192 | "parking_lot", 4193 | "profiling", 4194 | "raw-window-handle", 4195 | "rustc-hash", 4196 | "smallvec", 4197 | "thiserror 2.0.11", 4198 | "wgpu-hal", 4199 | "wgpu-types", 4200 | ] 4201 | 4202 | [[package]] 4203 | name = "wgpu-hal" 4204 | version = "24.0.0" 4205 | source = "registry+https://github.com/rust-lang/crates.io-index" 4206 | checksum = "5a782e5056b060b0b4010881d1decddd059e44f2ecd01e2db2971b48ad3627e5" 4207 | dependencies = [ 4208 | "android_system_properties", 4209 | "arrayvec", 4210 | "ash", 4211 | "bitflags 2.8.0", 4212 | "bytemuck", 4213 | "cfg_aliases", 4214 | "core-graphics-types", 4215 | "glow", 4216 | "glutin_wgl_sys", 4217 | "gpu-alloc", 4218 | "gpu-descriptor", 4219 | "js-sys", 4220 | "khronos-egl", 4221 | "libc", 4222 | "libloading", 4223 | "log", 4224 | "metal", 4225 | "naga", 4226 | "ndk-sys 0.5.0+25.2.9519653", 4227 | "objc", 4228 | "once_cell", 4229 | "ordered-float", 4230 | "parking_lot", 4231 | "profiling", 4232 | "raw-window-handle", 4233 | "renderdoc-sys", 4234 | "rustc-hash", 4235 | "smallvec", 4236 | "thiserror 2.0.11", 4237 | "wasm-bindgen", 4238 | "web-sys", 4239 | "wgpu-types", 4240 | "windows", 4241 | ] 4242 | 4243 | [[package]] 4244 | name = "wgpu-types" 4245 | version = "24.0.0" 4246 | source = "registry+https://github.com/rust-lang/crates.io-index" 4247 | checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" 4248 | dependencies = [ 4249 | "bitflags 2.8.0", 4250 | "js-sys", 4251 | "log", 4252 | "web-sys", 4253 | ] 4254 | 4255 | [[package]] 4256 | name = "winapi" 4257 | version = "0.3.9" 4258 | source = "registry+https://github.com/rust-lang/crates.io-index" 4259 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 4260 | dependencies = [ 4261 | "winapi-i686-pc-windows-gnu", 4262 | "winapi-x86_64-pc-windows-gnu", 4263 | ] 4264 | 4265 | [[package]] 4266 | name = "winapi-i686-pc-windows-gnu" 4267 | version = "0.4.0" 4268 | source = "registry+https://github.com/rust-lang/crates.io-index" 4269 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 4270 | 4271 | [[package]] 4272 | name = "winapi-util" 4273 | version = "0.1.9" 4274 | source = "registry+https://github.com/rust-lang/crates.io-index" 4275 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 4276 | dependencies = [ 4277 | "windows-sys 0.59.0", 4278 | ] 4279 | 4280 | [[package]] 4281 | name = "winapi-x86_64-pc-windows-gnu" 4282 | version = "0.4.0" 4283 | source = "registry+https://github.com/rust-lang/crates.io-index" 4284 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 4285 | 4286 | [[package]] 4287 | name = "windows" 4288 | version = "0.58.0" 4289 | source = "registry+https://github.com/rust-lang/crates.io-index" 4290 | checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 4291 | dependencies = [ 4292 | "windows-core", 4293 | "windows-targets 0.52.6", 4294 | ] 4295 | 4296 | [[package]] 4297 | name = "windows-core" 4298 | version = "0.58.0" 4299 | source = "registry+https://github.com/rust-lang/crates.io-index" 4300 | checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 4301 | dependencies = [ 4302 | "windows-implement", 4303 | "windows-interface", 4304 | "windows-result", 4305 | "windows-strings", 4306 | "windows-targets 0.52.6", 4307 | ] 4308 | 4309 | [[package]] 4310 | name = "windows-implement" 4311 | version = "0.58.0" 4312 | source = "registry+https://github.com/rust-lang/crates.io-index" 4313 | checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 4314 | dependencies = [ 4315 | "proc-macro2", 4316 | "quote", 4317 | "syn", 4318 | ] 4319 | 4320 | [[package]] 4321 | name = "windows-interface" 4322 | version = "0.58.0" 4323 | source = "registry+https://github.com/rust-lang/crates.io-index" 4324 | checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" 4325 | dependencies = [ 4326 | "proc-macro2", 4327 | "quote", 4328 | "syn", 4329 | ] 4330 | 4331 | [[package]] 4332 | name = "windows-result" 4333 | version = "0.2.0" 4334 | source = "registry+https://github.com/rust-lang/crates.io-index" 4335 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 4336 | dependencies = [ 4337 | "windows-targets 0.52.6", 4338 | ] 4339 | 4340 | [[package]] 4341 | name = "windows-strings" 4342 | version = "0.1.0" 4343 | source = "registry+https://github.com/rust-lang/crates.io-index" 4344 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 4345 | dependencies = [ 4346 | "windows-result", 4347 | "windows-targets 0.52.6", 4348 | ] 4349 | 4350 | [[package]] 4351 | name = "windows-sys" 4352 | version = "0.45.0" 4353 | source = "registry+https://github.com/rust-lang/crates.io-index" 4354 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 4355 | dependencies = [ 4356 | "windows-targets 0.42.2", 4357 | ] 4358 | 4359 | [[package]] 4360 | name = "windows-sys" 4361 | version = "0.48.0" 4362 | source = "registry+https://github.com/rust-lang/crates.io-index" 4363 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 4364 | dependencies = [ 4365 | "windows-targets 0.48.5", 4366 | ] 4367 | 4368 | [[package]] 4369 | name = "windows-sys" 4370 | version = "0.52.0" 4371 | source = "registry+https://github.com/rust-lang/crates.io-index" 4372 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 4373 | dependencies = [ 4374 | "windows-targets 0.52.6", 4375 | ] 4376 | 4377 | [[package]] 4378 | name = "windows-sys" 4379 | version = "0.59.0" 4380 | source = "registry+https://github.com/rust-lang/crates.io-index" 4381 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 4382 | dependencies = [ 4383 | "windows-targets 0.52.6", 4384 | ] 4385 | 4386 | [[package]] 4387 | name = "windows-targets" 4388 | version = "0.42.2" 4389 | source = "registry+https://github.com/rust-lang/crates.io-index" 4390 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 4391 | dependencies = [ 4392 | "windows_aarch64_gnullvm 0.42.2", 4393 | "windows_aarch64_msvc 0.42.2", 4394 | "windows_i686_gnu 0.42.2", 4395 | "windows_i686_msvc 0.42.2", 4396 | "windows_x86_64_gnu 0.42.2", 4397 | "windows_x86_64_gnullvm 0.42.2", 4398 | "windows_x86_64_msvc 0.42.2", 4399 | ] 4400 | 4401 | [[package]] 4402 | name = "windows-targets" 4403 | version = "0.48.5" 4404 | source = "registry+https://github.com/rust-lang/crates.io-index" 4405 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 4406 | dependencies = [ 4407 | "windows_aarch64_gnullvm 0.48.5", 4408 | "windows_aarch64_msvc 0.48.5", 4409 | "windows_i686_gnu 0.48.5", 4410 | "windows_i686_msvc 0.48.5", 4411 | "windows_x86_64_gnu 0.48.5", 4412 | "windows_x86_64_gnullvm 0.48.5", 4413 | "windows_x86_64_msvc 0.48.5", 4414 | ] 4415 | 4416 | [[package]] 4417 | name = "windows-targets" 4418 | version = "0.52.6" 4419 | source = "registry+https://github.com/rust-lang/crates.io-index" 4420 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 4421 | dependencies = [ 4422 | "windows_aarch64_gnullvm 0.52.6", 4423 | "windows_aarch64_msvc 0.52.6", 4424 | "windows_i686_gnu 0.52.6", 4425 | "windows_i686_gnullvm", 4426 | "windows_i686_msvc 0.52.6", 4427 | "windows_x86_64_gnu 0.52.6", 4428 | "windows_x86_64_gnullvm 0.52.6", 4429 | "windows_x86_64_msvc 0.52.6", 4430 | ] 4431 | 4432 | [[package]] 4433 | name = "windows_aarch64_gnullvm" 4434 | version = "0.42.2" 4435 | source = "registry+https://github.com/rust-lang/crates.io-index" 4436 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 4437 | 4438 | [[package]] 4439 | name = "windows_aarch64_gnullvm" 4440 | version = "0.48.5" 4441 | source = "registry+https://github.com/rust-lang/crates.io-index" 4442 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 4443 | 4444 | [[package]] 4445 | name = "windows_aarch64_gnullvm" 4446 | version = "0.52.6" 4447 | source = "registry+https://github.com/rust-lang/crates.io-index" 4448 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 4449 | 4450 | [[package]] 4451 | name = "windows_aarch64_msvc" 4452 | version = "0.42.2" 4453 | source = "registry+https://github.com/rust-lang/crates.io-index" 4454 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 4455 | 4456 | [[package]] 4457 | name = "windows_aarch64_msvc" 4458 | version = "0.48.5" 4459 | source = "registry+https://github.com/rust-lang/crates.io-index" 4460 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 4461 | 4462 | [[package]] 4463 | name = "windows_aarch64_msvc" 4464 | version = "0.52.6" 4465 | source = "registry+https://github.com/rust-lang/crates.io-index" 4466 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 4467 | 4468 | [[package]] 4469 | name = "windows_i686_gnu" 4470 | version = "0.42.2" 4471 | source = "registry+https://github.com/rust-lang/crates.io-index" 4472 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 4473 | 4474 | [[package]] 4475 | name = "windows_i686_gnu" 4476 | version = "0.48.5" 4477 | source = "registry+https://github.com/rust-lang/crates.io-index" 4478 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4479 | 4480 | [[package]] 4481 | name = "windows_i686_gnu" 4482 | version = "0.52.6" 4483 | source = "registry+https://github.com/rust-lang/crates.io-index" 4484 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 4485 | 4486 | [[package]] 4487 | name = "windows_i686_gnullvm" 4488 | version = "0.52.6" 4489 | source = "registry+https://github.com/rust-lang/crates.io-index" 4490 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 4491 | 4492 | [[package]] 4493 | name = "windows_i686_msvc" 4494 | version = "0.42.2" 4495 | source = "registry+https://github.com/rust-lang/crates.io-index" 4496 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 4497 | 4498 | [[package]] 4499 | name = "windows_i686_msvc" 4500 | version = "0.48.5" 4501 | source = "registry+https://github.com/rust-lang/crates.io-index" 4502 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4503 | 4504 | [[package]] 4505 | name = "windows_i686_msvc" 4506 | version = "0.52.6" 4507 | source = "registry+https://github.com/rust-lang/crates.io-index" 4508 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 4509 | 4510 | [[package]] 4511 | name = "windows_x86_64_gnu" 4512 | version = "0.42.2" 4513 | source = "registry+https://github.com/rust-lang/crates.io-index" 4514 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 4515 | 4516 | [[package]] 4517 | name = "windows_x86_64_gnu" 4518 | version = "0.48.5" 4519 | source = "registry+https://github.com/rust-lang/crates.io-index" 4520 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4521 | 4522 | [[package]] 4523 | name = "windows_x86_64_gnu" 4524 | version = "0.52.6" 4525 | source = "registry+https://github.com/rust-lang/crates.io-index" 4526 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 4527 | 4528 | [[package]] 4529 | name = "windows_x86_64_gnullvm" 4530 | version = "0.42.2" 4531 | source = "registry+https://github.com/rust-lang/crates.io-index" 4532 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 4533 | 4534 | [[package]] 4535 | name = "windows_x86_64_gnullvm" 4536 | version = "0.48.5" 4537 | source = "registry+https://github.com/rust-lang/crates.io-index" 4538 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4539 | 4540 | [[package]] 4541 | name = "windows_x86_64_gnullvm" 4542 | version = "0.52.6" 4543 | source = "registry+https://github.com/rust-lang/crates.io-index" 4544 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 4545 | 4546 | [[package]] 4547 | name = "windows_x86_64_msvc" 4548 | version = "0.42.2" 4549 | source = "registry+https://github.com/rust-lang/crates.io-index" 4550 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 4551 | 4552 | [[package]] 4553 | name = "windows_x86_64_msvc" 4554 | version = "0.48.5" 4555 | source = "registry+https://github.com/rust-lang/crates.io-index" 4556 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4557 | 4558 | [[package]] 4559 | name = "windows_x86_64_msvc" 4560 | version = "0.52.6" 4561 | source = "registry+https://github.com/rust-lang/crates.io-index" 4562 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 4563 | 4564 | [[package]] 4565 | name = "winit" 4566 | version = "0.30.9" 4567 | source = "registry+https://github.com/rust-lang/crates.io-index" 4568 | checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" 4569 | dependencies = [ 4570 | "ahash", 4571 | "android-activity", 4572 | "atomic-waker", 4573 | "bitflags 2.8.0", 4574 | "block2", 4575 | "bytemuck", 4576 | "calloop", 4577 | "cfg_aliases", 4578 | "concurrent-queue", 4579 | "core-foundation 0.9.4", 4580 | "core-graphics", 4581 | "cursor-icon", 4582 | "dpi", 4583 | "js-sys", 4584 | "libc", 4585 | "memmap2", 4586 | "ndk", 4587 | "objc2", 4588 | "objc2-app-kit", 4589 | "objc2-foundation", 4590 | "objc2-ui-kit", 4591 | "orbclient", 4592 | "percent-encoding", 4593 | "pin-project", 4594 | "raw-window-handle", 4595 | "redox_syscall 0.4.1", 4596 | "rustix", 4597 | "sctk-adwaita", 4598 | "smithay-client-toolkit", 4599 | "smol_str", 4600 | "tracing", 4601 | "unicode-segmentation", 4602 | "wasm-bindgen", 4603 | "wasm-bindgen-futures", 4604 | "wayland-backend", 4605 | "wayland-client", 4606 | "wayland-protocols", 4607 | "wayland-protocols-plasma", 4608 | "web-sys", 4609 | "web-time", 4610 | "windows-sys 0.52.0", 4611 | "x11-dl", 4612 | "x11rb", 4613 | "xkbcommon-dl", 4614 | ] 4615 | 4616 | [[package]] 4617 | name = "winnow" 4618 | version = "0.7.1" 4619 | source = "registry+https://github.com/rust-lang/crates.io-index" 4620 | checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" 4621 | dependencies = [ 4622 | "memchr", 4623 | ] 4624 | 4625 | [[package]] 4626 | name = "wit-bindgen-rt" 4627 | version = "0.33.0" 4628 | source = "registry+https://github.com/rust-lang/crates.io-index" 4629 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 4630 | dependencies = [ 4631 | "bitflags 2.8.0", 4632 | ] 4633 | 4634 | [[package]] 4635 | name = "write16" 4636 | version = "1.0.0" 4637 | source = "registry+https://github.com/rust-lang/crates.io-index" 4638 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 4639 | 4640 | [[package]] 4641 | name = "writeable" 4642 | version = "0.5.5" 4643 | source = "registry+https://github.com/rust-lang/crates.io-index" 4644 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 4645 | 4646 | [[package]] 4647 | name = "x11-dl" 4648 | version = "2.21.0" 4649 | source = "registry+https://github.com/rust-lang/crates.io-index" 4650 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 4651 | dependencies = [ 4652 | "libc", 4653 | "once_cell", 4654 | "pkg-config", 4655 | ] 4656 | 4657 | [[package]] 4658 | name = "x11rb" 4659 | version = "0.13.1" 4660 | source = "registry+https://github.com/rust-lang/crates.io-index" 4661 | checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" 4662 | dependencies = [ 4663 | "as-raw-xcb-connection", 4664 | "gethostname", 4665 | "libc", 4666 | "libloading", 4667 | "once_cell", 4668 | "rustix", 4669 | "x11rb-protocol", 4670 | ] 4671 | 4672 | [[package]] 4673 | name = "x11rb-protocol" 4674 | version = "0.13.1" 4675 | source = "registry+https://github.com/rust-lang/crates.io-index" 4676 | checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" 4677 | 4678 | [[package]] 4679 | name = "xcursor" 4680 | version = "0.3.8" 4681 | source = "registry+https://github.com/rust-lang/crates.io-index" 4682 | checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" 4683 | 4684 | [[package]] 4685 | name = "xdg-home" 4686 | version = "1.3.0" 4687 | source = "registry+https://github.com/rust-lang/crates.io-index" 4688 | checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" 4689 | dependencies = [ 4690 | "libc", 4691 | "windows-sys 0.59.0", 4692 | ] 4693 | 4694 | [[package]] 4695 | name = "xkbcommon-dl" 4696 | version = "0.4.2" 4697 | source = "registry+https://github.com/rust-lang/crates.io-index" 4698 | checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 4699 | dependencies = [ 4700 | "bitflags 2.8.0", 4701 | "dlib", 4702 | "log", 4703 | "once_cell", 4704 | "xkeysym", 4705 | ] 4706 | 4707 | [[package]] 4708 | name = "xkeysym" 4709 | version = "0.2.1" 4710 | source = "registry+https://github.com/rust-lang/crates.io-index" 4711 | checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 4712 | 4713 | [[package]] 4714 | name = "xml-rs" 4715 | version = "0.8.25" 4716 | source = "registry+https://github.com/rust-lang/crates.io-index" 4717 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" 4718 | 4719 | [[package]] 4720 | name = "xmlwriter" 4721 | version = "0.1.0" 4722 | source = "registry+https://github.com/rust-lang/crates.io-index" 4723 | checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" 4724 | 4725 | [[package]] 4726 | name = "yoke" 4727 | version = "0.7.5" 4728 | source = "registry+https://github.com/rust-lang/crates.io-index" 4729 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 4730 | dependencies = [ 4731 | "serde", 4732 | "stable_deref_trait", 4733 | "yoke-derive", 4734 | "zerofrom", 4735 | ] 4736 | 4737 | [[package]] 4738 | name = "yoke-derive" 4739 | version = "0.7.5" 4740 | source = "registry+https://github.com/rust-lang/crates.io-index" 4741 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 4742 | dependencies = [ 4743 | "proc-macro2", 4744 | "quote", 4745 | "syn", 4746 | "synstructure", 4747 | ] 4748 | 4749 | [[package]] 4750 | name = "zbus" 4751 | version = "4.4.0" 4752 | source = "registry+https://github.com/rust-lang/crates.io-index" 4753 | checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" 4754 | dependencies = [ 4755 | "async-broadcast", 4756 | "async-executor", 4757 | "async-fs", 4758 | "async-io", 4759 | "async-lock", 4760 | "async-process", 4761 | "async-recursion", 4762 | "async-task", 4763 | "async-trait", 4764 | "blocking", 4765 | "enumflags2", 4766 | "event-listener", 4767 | "futures-core", 4768 | "futures-sink", 4769 | "futures-util", 4770 | "hex", 4771 | "nix", 4772 | "ordered-stream", 4773 | "rand", 4774 | "serde", 4775 | "serde_repr", 4776 | "sha1", 4777 | "static_assertions", 4778 | "tracing", 4779 | "uds_windows", 4780 | "windows-sys 0.52.0", 4781 | "xdg-home", 4782 | "zbus_macros", 4783 | "zbus_names", 4784 | "zvariant", 4785 | ] 4786 | 4787 | [[package]] 4788 | name = "zbus-lockstep" 4789 | version = "0.4.4" 4790 | source = "registry+https://github.com/rust-lang/crates.io-index" 4791 | checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" 4792 | dependencies = [ 4793 | "zbus_xml", 4794 | "zvariant", 4795 | ] 4796 | 4797 | [[package]] 4798 | name = "zbus-lockstep-macros" 4799 | version = "0.4.4" 4800 | source = "registry+https://github.com/rust-lang/crates.io-index" 4801 | checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" 4802 | dependencies = [ 4803 | "proc-macro2", 4804 | "quote", 4805 | "syn", 4806 | "zbus-lockstep", 4807 | "zbus_xml", 4808 | "zvariant", 4809 | ] 4810 | 4811 | [[package]] 4812 | name = "zbus_macros" 4813 | version = "4.4.0" 4814 | source = "registry+https://github.com/rust-lang/crates.io-index" 4815 | checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" 4816 | dependencies = [ 4817 | "proc-macro-crate", 4818 | "proc-macro2", 4819 | "quote", 4820 | "syn", 4821 | "zvariant_utils", 4822 | ] 4823 | 4824 | [[package]] 4825 | name = "zbus_names" 4826 | version = "3.0.0" 4827 | source = "registry+https://github.com/rust-lang/crates.io-index" 4828 | checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" 4829 | dependencies = [ 4830 | "serde", 4831 | "static_assertions", 4832 | "zvariant", 4833 | ] 4834 | 4835 | [[package]] 4836 | name = "zbus_xml" 4837 | version = "4.0.0" 4838 | source = "registry+https://github.com/rust-lang/crates.io-index" 4839 | checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" 4840 | dependencies = [ 4841 | "quick-xml 0.30.0", 4842 | "serde", 4843 | "static_assertions", 4844 | "zbus_names", 4845 | "zvariant", 4846 | ] 4847 | 4848 | [[package]] 4849 | name = "zerocopy" 4850 | version = "0.7.35" 4851 | source = "registry+https://github.com/rust-lang/crates.io-index" 4852 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 4853 | dependencies = [ 4854 | "byteorder", 4855 | "zerocopy-derive", 4856 | ] 4857 | 4858 | [[package]] 4859 | name = "zerocopy-derive" 4860 | version = "0.7.35" 4861 | source = "registry+https://github.com/rust-lang/crates.io-index" 4862 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 4863 | dependencies = [ 4864 | "proc-macro2", 4865 | "quote", 4866 | "syn", 4867 | ] 4868 | 4869 | [[package]] 4870 | name = "zerofrom" 4871 | version = "0.1.5" 4872 | source = "registry+https://github.com/rust-lang/crates.io-index" 4873 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 4874 | dependencies = [ 4875 | "zerofrom-derive", 4876 | ] 4877 | 4878 | [[package]] 4879 | name = "zerofrom-derive" 4880 | version = "0.1.5" 4881 | source = "registry+https://github.com/rust-lang/crates.io-index" 4882 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 4883 | dependencies = [ 4884 | "proc-macro2", 4885 | "quote", 4886 | "syn", 4887 | "synstructure", 4888 | ] 4889 | 4890 | [[package]] 4891 | name = "zeroize" 4892 | version = "1.8.1" 4893 | source = "registry+https://github.com/rust-lang/crates.io-index" 4894 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 4895 | 4896 | [[package]] 4897 | name = "zerovec" 4898 | version = "0.10.4" 4899 | source = "registry+https://github.com/rust-lang/crates.io-index" 4900 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 4901 | dependencies = [ 4902 | "yoke", 4903 | "zerofrom", 4904 | "zerovec-derive", 4905 | ] 4906 | 4907 | [[package]] 4908 | name = "zerovec-derive" 4909 | version = "0.10.3" 4910 | source = "registry+https://github.com/rust-lang/crates.io-index" 4911 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 4912 | dependencies = [ 4913 | "proc-macro2", 4914 | "quote", 4915 | "syn", 4916 | ] 4917 | 4918 | [[package]] 4919 | name = "zune-core" 4920 | version = "0.4.12" 4921 | source = "registry+https://github.com/rust-lang/crates.io-index" 4922 | checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 4923 | 4924 | [[package]] 4925 | name = "zune-inflate" 4926 | version = "0.2.54" 4927 | source = "registry+https://github.com/rust-lang/crates.io-index" 4928 | checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" 4929 | dependencies = [ 4930 | "simd-adler32", 4931 | ] 4932 | 4933 | [[package]] 4934 | name = "zune-jpeg" 4935 | version = "0.4.14" 4936 | source = "registry+https://github.com/rust-lang/crates.io-index" 4937 | checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" 4938 | dependencies = [ 4939 | "zune-core", 4940 | ] 4941 | 4942 | [[package]] 4943 | name = "zvariant" 4944 | version = "4.2.0" 4945 | source = "registry+https://github.com/rust-lang/crates.io-index" 4946 | checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" 4947 | dependencies = [ 4948 | "endi", 4949 | "enumflags2", 4950 | "serde", 4951 | "static_assertions", 4952 | "zvariant_derive", 4953 | ] 4954 | 4955 | [[package]] 4956 | name = "zvariant_derive" 4957 | version = "4.2.0" 4958 | source = "registry+https://github.com/rust-lang/crates.io-index" 4959 | checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" 4960 | dependencies = [ 4961 | "proc-macro-crate", 4962 | "proc-macro2", 4963 | "quote", 4964 | "syn", 4965 | "zvariant_utils", 4966 | ] 4967 | 4968 | [[package]] 4969 | name = "zvariant_utils" 4970 | version = "2.1.0" 4971 | source = "registry+https://github.com/rust-lang/crates.io-index" 4972 | checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" 4973 | dependencies = [ 4974 | "proc-macro2", 4975 | "quote", 4976 | "syn", 4977 | ] 4978 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ecargo" 3 | description = "Cargo metadata viewer using egui" 4 | version = "0.3.0-dev" 5 | edition = "2021" 6 | license = "MIT OR Apache-2.0" 7 | repository = "https://github.com/crumblingstatue/ecargo" 8 | 9 | [dependencies] 10 | anyhow = "1.0.82" 11 | cargo_metadata = "0.19.1" 12 | eframe = "0.31" 13 | egui_commonmark = "0.20" 14 | slotmap = "1.0.7" 15 | cargo-platform = "0.1.5" 16 | open = "5.1.2" 17 | directories = "6.0.0" 18 | toml = "0.8.12" 19 | serde = { version = "1.0.199", features = ["derive"] } 20 | egui_extras = { version = "0.31", features = ["file", "http", "svg"] } 21 | image = { version = "0.25.1", features = ["png"] } 22 | clap = { version = "4.5.4", features = ["derive"] } 23 | 24 | [profile.release] 25 | panic = "abort" 26 | strip = true 27 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Copyright 2024 crumblingstatue 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright 2024 crumblingstatue 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ecargo 2 | 3 | Cargo metadata viewer using egui. 4 | 5 | Every time you add a dependency, Cargo dumps a huge amount of data into your home directory. 6 | Wouldn't it be nice to be able to utilize this data to get a better overview of your 7 | dependencies? This is what Ecargo sets out to accomplish. 8 | 9 | ## Features 10 | 11 | ### Filterable package list 12 | ![image](https://github.com/crumblingstatue/ecargo/assets/1521976/49379563-bd33-4920-8d94-90ce02dbc162) 13 | 14 | Lists all the packages related to your crate. The filter searches the package name, description, 15 | and keywords. 16 | 17 | ### Clickable links 18 | ![image](https://github.com/crumblingstatue/ecargo/assets/1521976/a480b16d-9dd5-48fe-8e99-e4945ad4a263) 19 | 20 | All the relevant links, without needing to hop between websites to get the links you want. 21 | 22 | ### Dependency info 23 | ![image](https://github.com/crumblingstatue/ecargo/assets/1521976/8f984c2a-6505-4fc0-a7b5-a789b7c56a5b) 24 | 25 | Get a good idea for how a package fits into your dependency chain, including: 26 | - List of dependencies for each package 27 | - What features are enabled? 28 | - Which packages depend on this package? 29 | 30 | 31 | ### Glorious crates.io theme 32 | What more do you need? 33 | 34 | Don't worry, you can also use the vanilla dark and light egui themes. 35 | 36 | ## Installation 37 | `cargo install ecargo` 38 | 39 | There are no pre-built artifacts at the moment, but that may change. 40 | 41 | ## Usage 42 | Ecargo requires a path to a cargo project to work with, so you need to run `ecargo` in 43 | one of the following two ways: 44 | 1. In the working directory of a cargo project, just run `ecargo` 45 | 2. You can give `ecargo` a path to a cargo project: `ecargo /path/to/my/project` 46 | 47 | ## Credits 48 | All the heavy lifting is done by the [cargo-metadata](https://github.com/oli-obk/cargo_metadata) and [eframe](https://github.com/emilk/egui) crates (and their dependencies, of course). -------------------------------------------------------------------------------- /assets/FiraSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/ecargo/8ec2967036b7fb5abbab77218daad3d1f39361e9/assets/FiraSans-Regular.ttf -------------------------------------------------------------------------------- /assets/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | https://openfontlicense.org 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | imports_granularity = "One" 2 | group_imports = "One" 3 | chain_width = 80 -------------------------------------------------------------------------------- /src/app.rs: -------------------------------------------------------------------------------- 1 | use { 2 | crate::{config::Config, project::Project, ui::Gui}, 3 | anyhow::Context, 4 | directories::ProjectDirs, 5 | eframe::egui, 6 | std::{path::PathBuf, sync::mpsc}, 7 | }; 8 | 9 | pub struct App { 10 | pub project: Option, 11 | pub gui: Gui, 12 | pub dirs: ProjectDirs, 13 | pub config: Config, 14 | pub load: Option, 15 | } 16 | 17 | pub enum LoadStage { 18 | MetadataQuery, 19 | Finished(Project), 20 | Error(anyhow::Error), 21 | PkgInfoCollect, 22 | Resolve, 23 | GenDepGraph, 24 | } 25 | 26 | pub(crate) type LoadRecv = mpsc::Receiver; 27 | pub(crate) type LoadSend = mpsc::Sender; 28 | 29 | pub struct LoadState { 30 | pub(crate) recv: LoadRecv, 31 | pub(crate) path: PathBuf, 32 | /// User-facing load status message 33 | pub(crate) msg: String, 34 | } 35 | 36 | impl App { 37 | pub fn new(egui_ctx: &egui::Context) -> anyhow::Result { 38 | let dirs = ProjectDirs::from("", "crumblingstatue", "ecargo") 39 | .context("Could not determine project dirs")?; 40 | let config = Config::load_or_default(dirs.config_dir()); 41 | let style_name = config.style_name.clone(); 42 | let mut app = App { 43 | project: None, 44 | gui: Gui::new(egui_ctx), 45 | dirs, 46 | config, 47 | load: None, 48 | }; 49 | match crate::style::style_fun_by_name(&style_name) { 50 | Some(fun) => { 51 | let style = fun(); 52 | crate::style::apply_style(egui_ctx, style.clone()); 53 | app.gui.style = style; 54 | } 55 | None => eprintln!("No such style: {}", style_name), 56 | } 57 | Ok(app) 58 | } 59 | 60 | pub(crate) fn load_project_async(&mut self, path: PathBuf, args: crate::Args) { 61 | let (tx, rx) = mpsc::channel(); 62 | self.load = Some(LoadState { 63 | recv: rx, 64 | path: path.clone(), 65 | msg: "Preparing...".into(), 66 | }); 67 | std::thread::spawn(move || { 68 | if let Err(e) = Project::load(&path, &args, tx.clone()) { 69 | tx.send(LoadStage::Error(e)).unwrap(); 70 | } 71 | }); 72 | } 73 | } 74 | 75 | impl Drop for App { 76 | fn drop(&mut self) { 77 | if let Err(e) = self.config.save(self.dirs.config_dir()) { 78 | eprintln!("Failed to save config: {e}"); 79 | } 80 | } 81 | } 82 | 83 | impl eframe::App for App { 84 | fn update(&mut self, ctx: &eframe::egui::Context, _frame: &mut eframe::Frame) { 85 | crate::ui::do_ui(self, ctx); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | 3 | #[derive(serde::Serialize, serde::Deserialize)] 4 | pub struct Config { 5 | pub style_name: String, 6 | pub terminal_app: String, 7 | } 8 | 9 | impl Default for Config { 10 | fn default() -> Self { 11 | Self { 12 | style_name: "crates.io".into(), 13 | terminal_app: String::new(), 14 | } 15 | } 16 | } 17 | 18 | const FILENAME: &str = "config.toml"; 19 | 20 | impl Config { 21 | fn load(dir: &Path) -> anyhow::Result { 22 | let path = dir.join(FILENAME); 23 | let data = std::fs::read_to_string(path)?; 24 | Ok(toml::from_str(&data)?) 25 | } 26 | pub fn load_or_default(dir: &Path) -> Self { 27 | match Self::load(dir) { 28 | Ok(cfg) => cfg, 29 | Err(e) => { 30 | eprintln!("Error loading config: {e}. Using default."); 31 | Self::default() 32 | } 33 | } 34 | } 35 | pub fn save(&self, dir: &Path) -> anyhow::Result<()> { 36 | if !dir.exists() { 37 | std::fs::create_dir_all(dir)?; 38 | } 39 | let path = dir.join(FILENAME); 40 | Ok(std::fs::write(path, toml::to_string_pretty(self)?)?) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod app; 2 | mod config; 3 | mod project; 4 | mod style; 5 | mod ui; 6 | 7 | use { 8 | app::App, 9 | clap::Parser, 10 | eframe::{egui, NativeOptions}, 11 | std::path::PathBuf, 12 | }; 13 | 14 | #[derive(clap::Parser)] 15 | struct Args { 16 | /// Resolve without default features 17 | #[arg(long)] 18 | no_default_features: bool, 19 | /// Add features to the list of features to resolve 20 | #[arg(long)] 21 | features: Vec, 22 | /// Use this manifest path instead of the current working directory 23 | manifest_path: Option, 24 | /// Don't resolve dependencies 25 | #[arg(long)] 26 | no_deps: bool, 27 | /// Show version information and exit 28 | #[arg(long)] 29 | version: bool, 30 | } 31 | 32 | fn main() { 33 | let args = Args::parse(); 34 | if args.version { 35 | println!("ecargo version {}", env!("CARGO_PKG_VERSION")); 36 | return; 37 | } 38 | eframe::run_native( 39 | "ecargo", 40 | NativeOptions::default(), 41 | Box::new(move |cc| { 42 | Ok(Box::new({ 43 | egui_extras::install_image_loaders(&cc.egui_ctx); 44 | cc.egui_ctx 45 | .send_viewport_cmd(egui::ViewportCommand::InnerSize(egui::vec2(1280., 720.))); 46 | let mut app = App::new(&cc.egui_ctx).unwrap(); 47 | if let Some(path) = &args.manifest_path { 48 | app.load_project_async(path.to_owned(), args); 49 | } else { 50 | match std::env::current_dir() { 51 | Ok(cwd) => app.load_project_async(cwd, args), 52 | Err(e) => eprintln!("Could not determine cwd: {e}"), 53 | } 54 | } 55 | app 56 | })) 57 | }), 58 | ) 59 | .unwrap(); 60 | } 61 | -------------------------------------------------------------------------------- /src/project.rs: -------------------------------------------------------------------------------- 1 | use { 2 | crate::app::{LoadSend, LoadStage}, 3 | cargo_metadata::{camino::Utf8PathBuf, CargoOpt, DependencyKind, MetadataCommand, Package}, 4 | cargo_platform::Platform, 5 | slotmap::{new_key_type, SlotMap}, 6 | std::{collections::HashMap, path::Path}, 7 | }; 8 | 9 | pub struct DepLink { 10 | pub pkg_key: PkgKey, 11 | pub kind: DependencyKind, 12 | pub target: Option, 13 | } 14 | 15 | pub struct Pkg { 16 | pub cm_pkg: Package, 17 | pub key: PkgKey, 18 | pub dependents: Vec, 19 | pub dependencies: Vec, 20 | pub enabled_features: Vec, 21 | pub manifest_dir: Utf8PathBuf, 22 | pub readme_path: Option, 23 | pub changelog_path: Option, 24 | } 25 | 26 | pub type PkgSlotMap = SlotMap; 27 | 28 | pub struct Project { 29 | pub packages: PkgSlotMap, 30 | pub root: Option, 31 | pub license_map: HashMap>, 32 | } 33 | 34 | new_key_type! { 35 | pub struct PkgKey; 36 | } 37 | 38 | impl Project { 39 | pub fn load(path: &Path, args: &crate::Args, sender: LoadSend) -> anyhow::Result<()> { 40 | let mut cmd = MetadataCommand::new(); 41 | cmd.manifest_path(path.join("Cargo.toml")); 42 | if args.no_default_features { 43 | cmd.features(CargoOpt::NoDefaultFeatures); 44 | } 45 | if !args.features.is_empty() { 46 | cmd.features(CargoOpt::SomeFeatures(args.features.to_owned())); 47 | } 48 | if args.no_deps { 49 | cmd.no_deps(); 50 | } 51 | sender.send(LoadStage::MetadataQuery)?; 52 | let metadata = cmd.exec()?; 53 | sender.send(LoadStage::PkgInfoCollect)?; 54 | let mut packages = SlotMap::with_key(); 55 | let mut pkgid_key_mappings = HashMap::new(); 56 | for package in &metadata.packages { 57 | packages.insert_with_key(|key| { 58 | pkgid_key_mappings.insert(package.id.clone(), key); 59 | let manifest_dir = package.manifest_path.parent().unwrap().to_owned(); 60 | let readme_path = manifest_dir.join("README.md"); 61 | let changelog_path = manifest_dir.join("CHANGELOG.md"); 62 | Pkg { 63 | cm_pkg: package.clone(), 64 | key, 65 | dependents: Vec::new(), 66 | dependencies: Vec::new(), 67 | enabled_features: Vec::new(), 68 | manifest_dir, 69 | readme_path: readme_path.exists().then_some(readme_path), 70 | changelog_path: changelog_path.exists().then_some(changelog_path), 71 | } 72 | }); 73 | } 74 | sender.send(LoadStage::Resolve)?; 75 | if let Some(resolve) = metadata.resolve.as_ref() { 76 | for node in &resolve.nodes { 77 | let pkg_key = pkgid_key_mappings[&node.id]; 78 | packages[pkg_key].enabled_features.clone_from(&node.features); 79 | } 80 | } 81 | // Collect dependents 82 | sender.send(LoadStage::GenDepGraph)?; 83 | gen_dep_graph_info(&mut packages); 84 | let root; 85 | match metadata.root_package() { 86 | Some(pkg) => { 87 | if let Some(pkg) = packages.values().find(|pkg_inner| pkg_inner.cm_pkg == *pkg) { 88 | root = Some(pkg.key); 89 | } else { 90 | root = None; 91 | } 92 | } 93 | None => root = None, 94 | } 95 | sender.send(LoadStage::Finished(Project { 96 | packages, 97 | root, 98 | license_map: HashMap::new(), 99 | }))?; 100 | Ok(()) 101 | } 102 | } 103 | 104 | pub fn dep_matches_pkg(dep: &cargo_metadata::Dependency, pkg: &Pkg) -> bool { 105 | pkg.cm_pkg.name == dep.name && dep.req.matches(&pkg.cm_pkg.version) 106 | } 107 | 108 | // When I made this I didn't realize `cargo_metadata` supplied this information through `resolve`, 109 | // but I don't feel like rewriting it right now. 110 | fn gen_dep_graph_info(pkgs: &mut PkgSlotMap) { 111 | let keys: Vec = pkgs.keys().collect(); 112 | for a in &keys { 113 | for b in &keys { 114 | // Don't do anything for self 115 | if a == b { 116 | continue; 117 | } 118 | let [pkg_a, pkg_b] = pkgs.get_disjoint_mut([*a, *b]).unwrap(); 119 | for dep in &pkg_a.cm_pkg.dependencies { 120 | if dep_matches_pkg(dep, pkg_b) { 121 | pkg_a.dependencies.push(DepLink { 122 | pkg_key: *b, 123 | kind: dep.kind, 124 | target: dep.target.clone(), 125 | }); 126 | pkg_b.dependents.push(DepLink { 127 | pkg_key: *a, 128 | kind: dep.kind, 129 | target: dep.target.clone(), 130 | }); 131 | } 132 | } 133 | } 134 | } 135 | for pkg in pkgs.values_mut() { 136 | pkg.dependencies.dedup_by_key(|link| link.pkg_key); 137 | pkg.dependents.dedup_by_key(|link| link.pkg_key); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /src/style.rs: -------------------------------------------------------------------------------- 1 | use { 2 | eframe::egui::{self, Color32, FontData, FontDefinitions}, 3 | std::sync::Arc, 4 | }; 5 | 6 | type StyleFn = fn() -> Style; 7 | 8 | pub const STYLE_LIST: &[(&str, StyleFn); 3] = &[ 9 | ("crates.io", crates_io), 10 | ("egui dark", egui_dark), 11 | ("egui light", egui_light), 12 | ]; 13 | 14 | pub fn style_fun_by_name(name: &str) -> Option { 15 | STYLE_LIST 16 | .iter() 17 | .find_map(|(style_name, f)| (*style_name == name).then_some(*f)) 18 | } 19 | 20 | #[derive(Clone)] 21 | pub struct Font { 22 | pub name: String, 23 | pub data: FontData, 24 | } 25 | 26 | #[derive(Clone)] 27 | pub struct Style { 28 | pub name: &'static str, 29 | pub font: Option, 30 | pub colors: Colors, 31 | pub icons: Icons, 32 | } 33 | 34 | #[derive(Clone, Copy)] 35 | pub struct Colors { 36 | pub panel_fill: Color32, 37 | pub hyperlink_color: Color32, 38 | pub selected_bg_fill: Color32, 39 | pub hover_weak_bg_fill: Color32, 40 | pub active_weak_bg_fill: Color32, 41 | pub noninteractive_fg: Color32, 42 | pub highlighted_text: Color32, 43 | pub window_fill: Color32, 44 | pub inactive_weak_bg_fill: Color32, 45 | pub inactive_fg_stroke: Color32, 46 | pub open_weak_bg_fill: Color32, 47 | pub hover_fg_stroke: Color32, 48 | pub selection_stroke: Color32, 49 | pub extreme_bg: Color32, 50 | pub text_edit_text: Color32, 51 | pub widgets_active_fg_stroke: Color32, 52 | } 53 | 54 | #[derive(Clone, Copy)] 55 | pub struct Icons { 56 | pub settings: &'static str, 57 | } 58 | 59 | #[allow(dead_code)] 60 | pub const DEBUG_COLOR: Color32 = Color32::from_rgb(255, 0, 255); 61 | 62 | pub fn crates_io() -> Style { 63 | let font_data = egui::FontData::from_static(include_bytes!("../assets/FiraSans-Regular.ttf")); 64 | let font = Font { 65 | name: "firasans".into(), 66 | data: font_data, 67 | }; 68 | Style { 69 | name: STYLE_LIST[0].0, 70 | font: Some(font), 71 | colors: Colors { 72 | panel_fill: Color32::from_rgb(249, 247, 236), 73 | hyperlink_color: Color32::from_rgb(3, 123, 66), 74 | selected_bg_fill: Color32::from_rgb(84, 176, 38), 75 | hover_weak_bg_fill: Color32::from_rgb(206, 247, 197), 76 | active_weak_bg_fill: Color32::from_rgb(47, 155, 23), 77 | noninteractive_fg: Color32::from_rgb(101, 114, 120), 78 | highlighted_text: Color32::BLACK, 79 | window_fill: Color32::from_rgb(206, 197, 139), 80 | inactive_weak_bg_fill: Color32::from_rgb(237, 158, 9), 81 | inactive_fg_stroke: Color32::WHITE, 82 | open_weak_bg_fill: Color32::from_rgb(38, 67, 35), 83 | hover_fg_stroke: Color32::from_rgb(32, 162, 67), 84 | selection_stroke: Color32::from_rgb(213, 167, 42), 85 | extreme_bg: Color32::WHITE, 86 | text_edit_text: Color32::BLACK, 87 | widgets_active_fg_stroke: Color32::from_rgb(115, 0, 0), 88 | }, 89 | icons: Icons { settings: "⚙" }, 90 | } 91 | } 92 | 93 | pub fn egui_dark() -> Style { 94 | vanilla_egui(egui::Visuals::dark(), STYLE_LIST[1].0, Color32::WHITE) 95 | } 96 | 97 | pub fn egui_light() -> Style { 98 | vanilla_egui(egui::Visuals::light(), STYLE_LIST[2].0, Color32::BROWN) 99 | } 100 | 101 | pub fn vanilla_egui( 102 | visuals: egui::Visuals, 103 | name: &'static str, 104 | highlighted_text: Color32, 105 | ) -> Style { 106 | Style { 107 | name, 108 | font: None, 109 | colors: Colors { 110 | panel_fill: visuals.panel_fill, 111 | hyperlink_color: visuals.hyperlink_color, 112 | selected_bg_fill: visuals.selection.bg_fill, 113 | hover_weak_bg_fill: visuals.widgets.hovered.weak_bg_fill, 114 | active_weak_bg_fill: visuals.widgets.active.weak_bg_fill, 115 | noninteractive_fg: visuals.widgets.noninteractive.fg_stroke.color, 116 | highlighted_text, 117 | window_fill: visuals.window_fill, 118 | inactive_weak_bg_fill: visuals.widgets.inactive.weak_bg_fill, 119 | inactive_fg_stroke: visuals.widgets.inactive.fg_stroke.color, 120 | open_weak_bg_fill: visuals.widgets.open.weak_bg_fill, 121 | hover_fg_stroke: visuals.widgets.hovered.fg_stroke.color, 122 | selection_stroke: visuals.selection.stroke.color, 123 | extreme_bg: visuals.extreme_bg_color, 124 | text_edit_text: visuals.widgets.inactive.text_color(), 125 | widgets_active_fg_stroke: visuals.widgets.active.fg_stroke.color, 126 | }, 127 | icons: Icons { settings: "⚙" }, 128 | } 129 | } 130 | 131 | pub fn apply_style(egui_ctx: &egui::Context, style: Style) { 132 | let mut font_defs = FontDefinitions::default(); 133 | if let Some(font) = style.font { 134 | font_defs.font_data.insert(font.name.clone(), Arc::new(font.data)); 135 | if let Some(fam) = font_defs.families.get_mut(&egui::FontFamily::Proportional) { 136 | fam.insert(0, font.name); 137 | } 138 | } 139 | egui_ctx.set_fonts(font_defs); 140 | egui_ctx.style_mut(|egui_style| { 141 | egui_style.text_styles.get_mut(&egui::TextStyle::Heading).unwrap().size = 24.0; 142 | egui_style.text_styles.get_mut(&egui::TextStyle::Body).unwrap().size = 16.0; 143 | egui_style.text_styles.get_mut(&egui::TextStyle::Button).unwrap().size = 16.0; 144 | egui_style.visuals.panel_fill = style.colors.panel_fill; 145 | egui_style.visuals.widgets.noninteractive.fg_stroke.color = style.colors.noninteractive_fg; 146 | egui_style.visuals.selection.bg_fill = style.colors.selected_bg_fill; 147 | egui_style.visuals.hyperlink_color = style.colors.hyperlink_color; 148 | egui_style.visuals.widgets.hovered.weak_bg_fill = style.colors.hover_weak_bg_fill; 149 | egui_style.visuals.widgets.active.weak_bg_fill = style.colors.active_weak_bg_fill; 150 | egui_style.visuals.window_fill = style.colors.window_fill; 151 | egui_style.visuals.widgets.inactive.weak_bg_fill = style.colors.inactive_weak_bg_fill; 152 | egui_style.visuals.widgets.inactive.fg_stroke.color = style.colors.inactive_fg_stroke; 153 | egui_style.visuals.widgets.open.weak_bg_fill = style.colors.open_weak_bg_fill; 154 | egui_style.visuals.widgets.hovered.fg_stroke.color = style.colors.hover_fg_stroke; 155 | egui_style.visuals.selection.stroke.color = style.colors.selection_stroke; 156 | egui_style.visuals.extreme_bg_color = style.colors.extreme_bg; 157 | egui_style.visuals.widgets.active.fg_stroke.color = style.colors.widgets_active_fg_stroke; 158 | egui_style.url_in_tooltip = true; 159 | }); 160 | } 161 | -------------------------------------------------------------------------------- /src/ui.rs: -------------------------------------------------------------------------------- 1 | use { 2 | self::widgets::{badge, DepkindBadge, VersionBadge}, 3 | crate::{ 4 | app::{App, LoadStage}, 5 | config::Config, 6 | project::{dep_matches_pkg, Pkg, PkgKey, PkgSlotMap, Project}, 7 | style::{Colors, Style}, 8 | }, 9 | eframe::egui::{self, Align2}, 10 | egui_commonmark::CommonMarkCache, 11 | std::fmt::Display, 12 | tab::Tab, 13 | }; 14 | 15 | mod tab; 16 | mod widgets; 17 | 18 | pub struct Gui { 19 | modal_payload: Option, 20 | /// Primarily viewed package (i.e. main view) 21 | pub primary_pkg: Option, 22 | /// Secondarily viewer package (i.e. sidebar) 23 | pub secondary_pkg: Option, 24 | pub settings_window: SettingsWindow, 25 | pub style: Style, 26 | pub tab: Tab, 27 | pub right_panel_left: f32, 28 | pub pkg_list_filter_string: String, 29 | pub pkg_list_compiled_filter: Option, 30 | md: MdContent, 31 | pub cm_cache: CommonMarkCache, 32 | pub show_sidebar: bool, 33 | } 34 | 35 | pub enum PkgFilter { 36 | Simple(String), 37 | Author(String), 38 | } 39 | 40 | impl PkgFilter { 41 | pub fn from_str(src: &str) -> Option { 42 | if src.trim().is_empty() { 43 | return None; 44 | } 45 | match src.split_once(':') { 46 | Some(("auth" | "author" | "Auth" | "Author", query)) => { 47 | Some(Self::Author(query.trim().to_ascii_lowercase())) 48 | } 49 | _ => Some(Self::Simple(src.trim().to_ascii_lowercase())), 50 | } 51 | } 52 | pub fn matches(&self, pkg: &Pkg) -> bool { 53 | match self { 54 | PkgFilter::Simple(query) => { 55 | pkg.cm_pkg.name.contains(query) 56 | || pkg 57 | .cm_pkg 58 | .description 59 | .as_ref() 60 | .is_some_and(|desc| desc.to_ascii_lowercase().contains(query)) 61 | || pkg.cm_pkg.keywords.iter().any(|kw| kw.contains(query)) 62 | } 63 | PkgFilter::Author(query) => { 64 | pkg.cm_pkg.authors.iter().any(|auth| auth.to_ascii_lowercase().contains(query)) 65 | } 66 | } 67 | } 68 | } 69 | 70 | /// Markdown content 71 | #[derive(Default)] 72 | struct MdContent { 73 | md: String, 74 | kind: MdContentKind, 75 | key: PkgKey, 76 | } 77 | 78 | impl MdContent { 79 | fn new(md: String, kind: MdContentKind, key: PkgKey) -> Self { 80 | Self { md, kind, key } 81 | } 82 | } 83 | 84 | #[derive(Default, Clone, Copy)] 85 | enum MdContentKind { 86 | #[default] 87 | Readme, 88 | Changelog, 89 | CargoToml, 90 | } 91 | 92 | #[derive(Default)] 93 | pub struct SettingsWindow { 94 | pub open: bool, 95 | } 96 | 97 | impl SettingsWindow { 98 | fn ui(&mut self, ctx: &egui::Context, style: &mut Style, cfg: &mut Config) { 99 | egui::Window::new("Settings") 100 | .open(&mut self.open) 101 | .anchor(Align2::RIGHT_TOP, egui::vec2(0.0, 0.0)) 102 | .resizable(false) 103 | .collapsible(false) 104 | .show(ctx, |ui| { 105 | egui::Grid::new("settings_grid").show(ui, |ui| { 106 | ui.label("Style"); 107 | egui::ComboBox::new("style_combo", "").selected_text(style.name).show_ui( 108 | ui, 109 | |ui| { 110 | for (name, f) in crate::style::STYLE_LIST { 111 | if ui.selectable_label(style.name == *name, *name).clicked() { 112 | *style = f(); 113 | crate::style::apply_style(ctx, style.clone()); 114 | cfg.style_name = name.to_string(); 115 | } 116 | } 117 | }, 118 | ); 119 | ui.end_row(); 120 | ui.label("Terminal") 121 | .on_hover_text("The terminal to use for \"Open in terminal\" action"); 122 | ui.add( 123 | egui::TextEdit::singleline(&mut cfg.terminal_app) 124 | .text_color(style.colors.text_edit_text), 125 | ); 126 | }); 127 | }); 128 | } 129 | } 130 | 131 | struct ModalPayload { 132 | title: String, 133 | msg: String, 134 | } 135 | 136 | impl Gui { 137 | pub fn new(egui_ctx: &egui::Context) -> Self { 138 | let style = crate::style::crates_io(); 139 | crate::style::apply_style(egui_ctx, style.clone()); 140 | Self { 141 | modal_payload: None, 142 | secondary_pkg: None, 143 | primary_pkg: None, 144 | settings_window: SettingsWindow::default(), 145 | style, 146 | tab: Tab::default(), 147 | // Arbitrary value: Can't be 0., that causes a panic in egui. 148 | // Also can't call `Context::available_width` at this point, also causes panic. 149 | right_panel_left: 100., 150 | pkg_list_filter_string: String::new(), 151 | pkg_list_compiled_filter: None, 152 | md: MdContent::default(), 153 | cm_cache: CommonMarkCache::default(), 154 | show_sidebar: true, 155 | } 156 | } 157 | fn set_modal(&mut self, title: impl Display, msg: impl Display) { 158 | self.modal_payload = Some(ModalPayload { 159 | title: title.to_string(), 160 | msg: msg.to_string(), 161 | }); 162 | } 163 | } 164 | 165 | pub fn do_ui(app: &mut App, ctx: &egui::Context) { 166 | if let Some(payload) = &app.gui.modal_payload { 167 | let mut close = false; 168 | egui::Modal::new("modal_popup".into()).show(ctx, |ui| { 169 | let (enter, esc) = ui.input(|inp| { 170 | ( 171 | inp.key_pressed(egui::Key::Enter), 172 | inp.key_pressed(egui::Key::Escape), 173 | ) 174 | }); 175 | ui.horizontal(|ui| { 176 | ui.label(egui::RichText::new("❗").size(64.0).color(egui::Color32::RED)); 177 | ui.vertical_centered(|ui| { 178 | ui.heading(&payload.title); 179 | ui.separator(); 180 | ui.label(&payload.msg); 181 | ui.separator(); 182 | if ui.button("Ok").clicked() || enter || esc { 183 | close = true; 184 | } 185 | }); 186 | }); 187 | }); 188 | if close { 189 | app.gui.modal_payload = None; 190 | } 191 | } 192 | match &mut app.project { 193 | Some(proj) => project_ui(proj, ctx, &mut app.gui, &mut app.config), 194 | None => { 195 | egui::CentralPanel::default().show(ctx, |ui| match &mut app.load { 196 | Some(load) => { 197 | ui.label(format!("Loading project at \"{}\"...", load.path.display())); 198 | ui.label(&load.msg); 199 | match load.recv.try_recv() { 200 | Ok(stage) => match stage { 201 | LoadStage::Finished(proj) => { 202 | app.gui.primary_pkg = proj.root; 203 | app.project = Some(proj); 204 | app.load = None; 205 | } 206 | LoadStage::Error(err) => { 207 | app.gui.set_modal("Error loading project", err); 208 | app.load = None; 209 | } 210 | LoadStage::MetadataQuery => { 211 | load.msg = "Querying metadata...".into(); 212 | } 213 | LoadStage::PkgInfoCollect => { 214 | load.msg = "Collecting package info...".into() 215 | } 216 | LoadStage::Resolve => load.msg = "Resolving dependencies...".into(), 217 | LoadStage::GenDepGraph => { 218 | load.msg = "Generating dependency graph...".into() 219 | } 220 | }, 221 | Err(e) => match e { 222 | std::sync::mpsc::TryRecvError::Empty => { 223 | ui.spinner(); 224 | } 225 | std::sync::mpsc::TryRecvError::Disconnected => { 226 | ui.label("Error loading: Channel disconnected."); 227 | } 228 | }, 229 | } 230 | ctx.request_repaint(); 231 | } 232 | None => { 233 | ui.label("No project loaded"); 234 | } 235 | }); 236 | } 237 | } 238 | } 239 | 240 | pub fn project_ui(project: &mut Project, ctx: &egui::Context, gui: &mut Gui, cfg: &mut Config) { 241 | egui::CentralPanel::default().show(ctx, |ui| match gui.tab { 242 | Tab::ViewSingle => tab::view_single_ui(ui, gui, project, cfg), 243 | Tab::PackageList => tab::package_list_ui(project, ui, gui), 244 | Tab::Markdown => tab::markdown_ui(ui, gui, project), 245 | Tab::Licenses => tab::licenses_ui(ui, gui, project), 246 | }); 247 | if let (Some(key), true) = (gui.secondary_pkg, gui.show_sidebar) { 248 | let re = egui::SidePanel::right("right_panel") 249 | .max_width(ctx.available_rect().width() / 2.5) 250 | .show(ctx, |ui| { 251 | let pkg = &project.packages[key]; 252 | pkg_info_ui(ui, pkg, &project.packages, gui, cfg); 253 | }); 254 | gui.right_panel_left = re.response.rect.left(); 255 | } else { 256 | gui.right_panel_left = ctx.available_rect().width(); 257 | } 258 | gui.settings_window.ui(ctx, &mut gui.style, cfg); 259 | } 260 | 261 | fn markdown_tab_label(kind: MdContentKind, pkgname: &str) -> String { 262 | let tabkind = match kind { 263 | MdContentKind::Readme => "Readme", 264 | MdContentKind::Changelog => "Changelog", 265 | MdContentKind::CargoToml => "Cargo.toml", 266 | }; 267 | format!("{tabkind} - {pkgname}") 268 | } 269 | 270 | fn central_top_bar(ui: &mut egui::Ui, gui: &mut Gui, project: &Project) { 271 | ui.horizontal(|ui| { 272 | ui.set_width(gui.right_panel_left - 16.0); 273 | let active_pkg = gui.primary_pkg.map(|key| &project.packages[key]); 274 | let tab_str_buf; 275 | for (tab, tabname) in [ 276 | ( 277 | Tab::ViewSingle, 278 | active_pkg.map(|pkg| pkg.cm_pkg.name.as_str()).unwrap_or("Single view"), 279 | ), 280 | (Tab::PackageList, "Packages"), 281 | (Tab::Markdown, { 282 | if gui.md.md.is_empty() { 283 | "Markdown" 284 | } else { 285 | tab_str_buf = markdown_tab_label( 286 | gui.md.kind, 287 | project 288 | .packages 289 | .get(gui.md.key) 290 | .map(|pkg| pkg.cm_pkg.name.as_str()) 291 | .unwrap_or("Unknown"), 292 | ); 293 | &tab_str_buf 294 | } 295 | }), 296 | (Tab::Licenses, "Licenses"), 297 | ] { 298 | if ui 299 | .selectable_label( 300 | gui.tab == tab, 301 | egui::RichText::new(tabname).color(gui.style.colors.highlighted_text), 302 | ) 303 | .clicked() 304 | { 305 | gui.tab = tab; 306 | } 307 | } 308 | ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { 309 | let [icon, tooltip] = if gui.show_sidebar { 310 | ["⏵", "Hide sidebar"] 311 | } else { 312 | ["⏴", "Show sidebar"] 313 | }; 314 | if ui.button(icon).on_hover_text(tooltip).clicked() { 315 | gui.show_sidebar ^= true; 316 | } 317 | if ui.button(gui.style.icons.settings).on_hover_text("Settings").clicked() { 318 | gui.settings_window.open ^= true; 319 | } 320 | match project.root { 321 | Some(root) => { 322 | let pkg = &project.packages[root]; 323 | if ui.link(format!("go to root ({})", pkg.cm_pkg.name)).clicked() { 324 | gui.primary_pkg = Some(pkg.key); 325 | gui.tab = Tab::ViewSingle; 326 | } 327 | } 328 | None => { 329 | ui.add_enabled(false, egui::Link::new("root")); 330 | } 331 | } 332 | }); 333 | }); 334 | } 335 | 336 | fn additional_dep_info_ui(dep: &cargo_metadata::Dependency, ui: &mut egui::Ui) { 337 | if let Some(source) = &dep.source { 338 | if let Some(suffix) = source.strip_prefix("git+") { 339 | badge(ui, "git", egui::Color32::DARK_GREEN, egui::Color32::YELLOW) 340 | .on_hover_text(suffix); 341 | } 342 | } 343 | if let Some(target) = &dep.target { 344 | ui.label(target.to_string()); 345 | } 346 | if dep.optional { 347 | badge( 348 | ui, 349 | "optional", 350 | egui::Color32::DARK_GREEN, 351 | egui::Color32::LIGHT_GREEN, 352 | ); 353 | } 354 | } 355 | 356 | fn pkg_info_ui(ui: &mut egui::Ui, pkg: &Pkg, packages: &PkgSlotMap, gui: &mut Gui, cfg: &Config) { 357 | ui.horizontal(|ui| { 358 | ui.label( 359 | egui::RichText::new(&pkg.cm_pkg.name) 360 | .heading() 361 | .color(gui.style.colors.highlighted_text), 362 | ); 363 | if gui.primary_pkg != Some(pkg.key) 364 | && ui.button("👁").on_hover_text("Open in main view").clicked() 365 | { 366 | gui.primary_pkg = Some(pkg.key); 367 | gui.secondary_pkg = None; 368 | gui.tab = Tab::ViewSingle; 369 | } 370 | if ui.button("🖹").on_hover_text("View Cargo.toml.orig").clicked() { 371 | match std::fs::read_to_string(pkg.manifest_dir.join("Cargo.toml.orig")) { 372 | Ok(data) => { 373 | gui.md = MdContent::new( 374 | format!("```toml\n{data}\n```"), 375 | MdContentKind::CargoToml, 376 | pkg.key, 377 | ); 378 | gui.tab = Tab::Markdown; 379 | } 380 | Err(e) => { 381 | gui.set_modal("Error", format!("Could not open Cargo.toml.orig: {e}")); 382 | } 383 | } 384 | } 385 | if ui 386 | .button("🗁") 387 | .on_hover_text(format!("{}\nOpen directory", pkg.manifest_dir.as_str())) 388 | .clicked() 389 | { 390 | let _ = open::that(&pkg.manifest_dir); 391 | } 392 | if ui 393 | .add_enabled(!cfg.terminal_app.is_empty(), egui::Button::new("🖳")) 394 | .on_hover_text("Open in terminal") 395 | .on_disabled_hover_text("No terminal configured") 396 | .clicked() 397 | { 398 | let result = std::process::Command::new(&cfg.terminal_app) 399 | .current_dir(&pkg.manifest_dir) 400 | .spawn(); 401 | if let Err(e) = result { 402 | gui.set_modal("Error", format!("Error spawning terminal {e}")); 403 | } 404 | } 405 | }); 406 | if let Some(desc) = &pkg.cm_pkg.description { 407 | ui.label(desc); 408 | } 409 | ui.separator(); 410 | ui.horizontal(|ui| { 411 | ui.label("version"); 412 | ui.label( 413 | egui::RichText::new(pkg.cm_pkg.version.to_string()) 414 | .color(gui.style.colors.highlighted_text), 415 | ); 416 | }); 417 | if !pkg.cm_pkg.keywords.is_empty() { 418 | ui.horizontal(|ui| { 419 | ui.label("Keywords"); 420 | for kw in &pkg.cm_pkg.keywords { 421 | badge( 422 | ui, 423 | kw, 424 | gui.style.colors.active_weak_bg_fill, 425 | gui.style.colors.highlighted_text, 426 | ); 427 | } 428 | }); 429 | } 430 | if pkg.cm_pkg.authors.len() == 1 { 431 | ui.label(format!("Author: {}", pkg.cm_pkg.authors.first().unwrap())); 432 | } else if !pkg.cm_pkg.authors.is_empty() { 433 | cheader("Authors", &gui.style).show(ui, |ui| { 434 | for author in &pkg.cm_pkg.authors { 435 | ui.label(author); 436 | } 437 | }); 438 | } 439 | if pkg.cm_pkg.source.as_ref().is_some_and(|src| src.is_crates_io()) { 440 | ui.horizontal(|ui| { 441 | ui.label("crates.io"); 442 | ui.hyperlink(format!("https://crates.io/crates/{}", &pkg.cm_pkg.name)); 443 | }); 444 | ui.horizontal(|ui| { 445 | ui.label("docs.rs"); 446 | ui.hyperlink(format!( 447 | "https://docs.rs/{}/{}", 448 | pkg.cm_pkg.name, pkg.cm_pkg.version 449 | )); 450 | }); 451 | } 452 | if let Some(info) = &pkg.cm_pkg.homepage { 453 | ui.horizontal(|ui| { 454 | ui.label("Homepage"); 455 | ui.hyperlink(info); 456 | }); 457 | } 458 | if let Some(info) = &pkg.cm_pkg.repository { 459 | ui.horizontal(|ui| { 460 | ui.label("Repository"); 461 | ui.hyperlink(info); 462 | }); 463 | } 464 | if let Some(info) = &pkg.cm_pkg.documentation { 465 | ui.horizontal(|ui| { 466 | ui.label("Docs link"); 467 | ui.hyperlink(info); 468 | }); 469 | } 470 | if let Some(path) = &pkg.readme_path { 471 | ui.horizontal(|ui| { 472 | if ui.link("Readme").clicked() { 473 | gui.md = MdContent::new( 474 | std::fs::read_to_string(path).unwrap(), 475 | MdContentKind::Readme, 476 | pkg.key, 477 | ); 478 | gui.tab = Tab::Markdown; 479 | } 480 | }); 481 | } 482 | if let Some(path) = &pkg.changelog_path { 483 | ui.horizontal(|ui| { 484 | if ui.link("Changelog").clicked() { 485 | gui.md = MdContent::new( 486 | std::fs::read_to_string(path).unwrap(), 487 | MdContentKind::Changelog, 488 | pkg.key, 489 | ); 490 | gui.tab = Tab::Markdown; 491 | } 492 | }); 493 | } 494 | ui.horizontal(|ui| { 495 | ui.label("License"); 496 | match &pkg.cm_pkg.license { 497 | Some(license) => ui.label(license), 498 | None => ui.label("Unknown"), 499 | }; 500 | }); 501 | ui.separator(); 502 | egui::ScrollArea::vertical().show(ui, |ui| { 503 | pkg_info_collapsibles_ui(pkg, gui, ui, packages); 504 | }); 505 | } 506 | 507 | fn pkg_info_collapsibles_ui(pkg: &Pkg, gui: &mut Gui, ui: &mut egui::Ui, packages: &PkgSlotMap) { 508 | if !pkg.cm_pkg.features.is_empty() { 509 | cheader("Features", &gui.style).show(ui, |ui| { 510 | egui::Grid::new("feat_grid").striped(true).show(ui, |ui| { 511 | for (name, reqs) in &pkg.cm_pkg.features { 512 | let enabled = pkg.enabled_features.contains(name); 513 | if enabled { 514 | ui.label("☑").on_hover_text("enabled"); 515 | } else { 516 | ui.label("☐").on_hover_text("disabled"); 517 | } 518 | ui.label(name); 519 | ui.scope(|ui| { 520 | for req in reqs { 521 | ui.label(req); 522 | } 523 | }); 524 | ui.end_row(); 525 | } 526 | }); 527 | }); 528 | } 529 | if !pkg.dependents.is_empty() { 530 | cheader("Dependents", &gui.style).show(ui, |ui| { 531 | for link in &pkg.dependents { 532 | ui.horizontal(|ui| { 533 | let dpkg = &packages[link.pkg_key]; 534 | let re = ui.selectable_label( 535 | false, 536 | egui::RichText::new(&dpkg.cm_pkg.name) 537 | .color(gui.style.colors.highlighted_text), 538 | ); 539 | if re.clicked() { 540 | gui.secondary_pkg = Some(link.pkg_key); 541 | gui.show_sidebar = true; 542 | } 543 | if re.double_clicked() { 544 | gui.primary_pkg = Some(link.pkg_key); 545 | gui.show_sidebar = false; 546 | } 547 | ui.add(VersionBadge::new(&dpkg.cm_pkg.version, &gui.style)); 548 | ui.add(DepkindBadge::new(link.kind, &gui.style)); 549 | if let Some(platform) = &link.target { 550 | ui.label(platform.to_string()); 551 | } 552 | }); 553 | } 554 | }); 555 | } 556 | if !pkg.dependencies.is_empty() { 557 | cheader("Dependencies", &gui.style).show(ui, |ui| { 558 | egui::Grid::new("deps_grid").striped(true).show(ui, |ui| { 559 | for dep in pkg.cm_pkg.dependencies.iter() { 560 | ui.add(DepkindBadge::new(dep.kind, &gui.style)); 561 | if let Some(pkg) = packages.values().find(|pkg| dep_matches_pkg(dep, pkg)) { 562 | ui.scope(|ui| { 563 | let re = ui.selectable_label( 564 | gui.secondary_pkg == Some(pkg.key), 565 | egui::RichText::new(&pkg.cm_pkg.name) 566 | .color(gui.style.colors.highlighted_text) 567 | .strong(), 568 | ); 569 | re.context_menu(|ui| { 570 | if ui 571 | .button("Focus") 572 | .on_hover_text( 573 | "Focus in main view.\nDouble clicking has same effect.", 574 | ) 575 | .clicked() 576 | { 577 | gui.primary_pkg = Some(pkg.key); 578 | ui.close_menu(); 579 | } 580 | }); 581 | if re.clicked() { 582 | gui.secondary_pkg = Some(pkg.key); 583 | gui.show_sidebar = true; 584 | } 585 | if re.double_clicked() { 586 | gui.primary_pkg = Some(pkg.key); 587 | gui.show_sidebar = false; 588 | } 589 | ui.add(VersionBadge::new(&pkg.cm_pkg.version, &gui.style)); 590 | additional_dep_info_ui(dep, ui); 591 | }); 592 | if let Some(info) = &pkg.cm_pkg.description { 593 | ui.label(info); 594 | } 595 | ui.end_row(); 596 | } else { 597 | ui.scope(|ui| { 598 | ui.label(format!("{} {}", dep.name, dep.req)); 599 | additional_dep_info_ui(dep, ui); 600 | }); 601 | ui.label(egui::RichText::new("Unresolved").italics()) 602 | .on_hover_text("Couldn't find a package for this dependency."); 603 | ui.end_row(); 604 | } 605 | } 606 | }); 607 | }); 608 | } 609 | } 610 | 611 | fn cheader(label: &str, style: &crate::style::Style) -> egui::CollapsingHeader { 612 | let colors = style.colors; 613 | egui::CollapsingHeader::new(egui::RichText::new(label).color(style.colors.highlighted_text)) 614 | .icon(move |ui, openness, re| header_icon(ui, openness, re, colors)) 615 | } 616 | 617 | // Stolen code from egui, because I need to specify the right color for the icon 618 | fn header_icon(ui: &mut egui::Ui, openness: f32, response: &egui::Response, colors: Colors) { 619 | let visuals = ui.style().interact(response); 620 | 621 | let rect = response.rect; 622 | 623 | // Draw a pointy triangle arrow: 624 | let rect = egui::Rect::from_center_size( 625 | rect.center(), 626 | egui::vec2(rect.width(), rect.height()) * 0.75, 627 | ); 628 | let rect = rect.expand(visuals.expansion); 629 | let mut points = vec![rect.left_top(), rect.right_top(), rect.center_bottom()]; 630 | use std::f32::consts::TAU; 631 | let rotation = 632 | egui::emath::Rot2::from_angle(egui::remap(openness, 0.0..=1.0, -TAU / 4.0..=0.0)); 633 | for p in &mut points { 634 | *p = rect.center() + rotation * (*p - rect.center()); 635 | } 636 | 637 | ui.painter().add(egui::Shape::convex_polygon( 638 | points, 639 | colors.highlighted_text, 640 | egui::Stroke::NONE, 641 | )); 642 | } 643 | -------------------------------------------------------------------------------- /src/ui/tab.rs: -------------------------------------------------------------------------------- 1 | mod licenses; 2 | mod markdown; 3 | mod package_list; 4 | mod view_single; 5 | 6 | pub(crate) use self::{ 7 | licenses::licenses_ui, markdown::markdown_ui, package_list::package_list_ui, 8 | view_single::view_single_ui, 9 | }; 10 | 11 | #[derive(Default, PartialEq)] 12 | pub enum Tab { 13 | #[default] 14 | ViewSingle, 15 | PackageList, 16 | Markdown, 17 | Licenses, 18 | } 19 | -------------------------------------------------------------------------------- /src/ui/tab/licenses.rs: -------------------------------------------------------------------------------- 1 | use { 2 | crate::{ 3 | project::Project, 4 | ui::{central_top_bar, Gui}, 5 | }, 6 | eframe::egui, 7 | std::collections::hash_map::Entry, 8 | }; 9 | 10 | fn compute_license_hashmap(project: &mut Project) { 11 | for (key, pkg) in &project.packages { 12 | let license = pkg.cm_pkg.license.clone().unwrap_or_else(|| "".into()); 13 | match project.license_map.entry(license) { 14 | Entry::Occupied(mut occupied) => { 15 | occupied.get_mut().push(key); 16 | } 17 | Entry::Vacant(vacant) => { 18 | vacant.insert(vec![key]); 19 | } 20 | } 21 | } 22 | } 23 | 24 | pub(crate) fn licenses_ui(ui: &mut egui::Ui, gui: &mut Gui, project: &mut Project) { 25 | central_top_bar(ui, gui, project); 26 | if project.license_map.is_empty() { 27 | compute_license_hashmap(project); 28 | } 29 | egui::ScrollArea::vertical().auto_shrink(false).show(ui, |ui| { 30 | ui.style_mut().visuals.widgets.inactive.fg_stroke = 31 | egui::Stroke::new(2.0, egui::Color32::BLACK); 32 | for (license, pkgs) in &project.license_map { 33 | ui.collapsing(format!("{license} ({})", pkgs.len()), |ui| { 34 | for pkg in pkgs { 35 | let selected = gui.secondary_pkg == Some(*pkg); 36 | let cm_pkg = &project.packages[*pkg].cm_pkg; 37 | if ui 38 | .selectable_label(selected, format!("{} {}", cm_pkg.name, cm_pkg.version)) 39 | .clicked() 40 | { 41 | gui.secondary_pkg = Some(*pkg); 42 | } 43 | } 44 | }); 45 | } 46 | }); 47 | } 48 | -------------------------------------------------------------------------------- /src/ui/tab/markdown.rs: -------------------------------------------------------------------------------- 1 | use { 2 | crate::{ 3 | project::Project, 4 | ui::{central_top_bar, Gui}, 5 | }, 6 | eframe::egui, 7 | egui_commonmark::CommonMarkViewer, 8 | }; 9 | 10 | pub(crate) fn markdown_ui(ui: &mut egui::Ui, gui: &mut Gui, project: &Project) { 11 | central_top_bar(ui, gui, project); 12 | egui::ScrollArea::vertical().show(ui, |ui| { 13 | ui.set_max_width(gui.right_panel_left - 14.0); 14 | if gui.style.name == "crates.io" { 15 | // Hack to make things more legible 16 | ui.style_mut().visuals = egui::Visuals::light(); 17 | } 18 | CommonMarkViewer::new().show(ui, &mut gui.cm_cache, &gui.md.md); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/tab/package_list.rs: -------------------------------------------------------------------------------- 1 | use { 2 | super::Tab, 3 | crate::{ 4 | project::Project, 5 | ui::{central_top_bar, widgets::VersionBadge, Gui, PkgFilter}, 6 | }, 7 | eframe::egui, 8 | }; 9 | 10 | pub(crate) fn package_list_ui(project: &Project, ui: &mut egui::Ui, gui: &mut Gui) { 11 | central_top_bar(ui, gui, project); 12 | let mut filtered: Vec<_> = project.packages.keys().collect(); 13 | ui.horizontal(|ui| { 14 | if ui 15 | .add( 16 | egui::TextEdit::singleline(&mut gui.pkg_list_filter_string) 17 | .text_color(gui.style.colors.text_edit_text) 18 | .hint_text("Filter"), 19 | ) 20 | .changed() 21 | { 22 | gui.pkg_list_compiled_filter = PkgFilter::from_str(&gui.pkg_list_filter_string); 23 | } 24 | filtered.retain(|key| { 25 | let pkg = &project.packages[*key]; 26 | match &gui.pkg_list_compiled_filter { 27 | Some(filt) => filt.matches(pkg), 28 | None => true, 29 | } 30 | }); 31 | ui.label(format!( 32 | "{}/{} packages", 33 | filtered.len(), 34 | project.packages.len() 35 | )); 36 | }); 37 | ui.separator(); 38 | egui::ScrollArea::vertical().auto_shrink(false).show_rows( 39 | ui, 40 | 22.0, 41 | filtered.len(), 42 | |ui, range| { 43 | egui::Grid::new("pkg_list_grid").show(ui, |ui| { 44 | for &key in &filtered[range] { 45 | let pkg = &project.packages[key]; 46 | ui.scope(|ui| { 47 | let re = ui.selectable_label( 48 | gui.secondary_pkg == Some(key), 49 | egui::RichText::new(&pkg.cm_pkg.name) 50 | .color(gui.style.colors.highlighted_text), 51 | ); 52 | if re.clicked() { 53 | gui.secondary_pkg = Some(key); 54 | } 55 | if re.double_clicked() { 56 | gui.primary_pkg = Some(key); 57 | gui.secondary_pkg = None; 58 | gui.tab = Tab::ViewSingle; 59 | } 60 | ui.add(VersionBadge::new(&pkg.cm_pkg.version, &gui.style)); 61 | }); 62 | if let Some(info) = &pkg.cm_pkg.description { 63 | if let Some(fst_line) = info.lines().next() { 64 | ui.label(fst_line).on_hover_text(info); 65 | } 66 | } 67 | ui.end_row(); 68 | } 69 | }); 70 | }, 71 | ); 72 | } 73 | -------------------------------------------------------------------------------- /src/ui/tab/view_single.rs: -------------------------------------------------------------------------------- 1 | use { 2 | crate::{ 3 | config::Config, 4 | project::{Pkg, Project}, 5 | ui::{central_top_bar, pkg_info_ui, Gui}, 6 | }, 7 | eframe::egui, 8 | }; 9 | 10 | pub(crate) fn view_single_ui(ui: &mut egui::Ui, gui: &mut Gui, project: &Project, cfg: &Config) { 11 | if let Some(id) = gui.primary_pkg { 12 | let pkg = &project.packages[id]; 13 | package_ui(project, pkg, ui, gui, cfg); 14 | } else { 15 | central_top_bar(ui, gui, project); 16 | ui.label("No primary package. Select one from the `Packages` tab."); 17 | } 18 | } 19 | 20 | fn package_ui(project: &Project, pkg: &Pkg, ui: &mut egui::Ui, gui: &mut Gui, cfg: &Config) { 21 | central_top_bar(ui, gui, project); 22 | pkg_info_ui(ui, pkg, &project.packages, gui, cfg); 23 | } 24 | -------------------------------------------------------------------------------- /src/ui/widgets.rs: -------------------------------------------------------------------------------- 1 | use { 2 | crate::style::Style, 3 | cargo_metadata::{semver::Version, DependencyKind}, 4 | eframe::egui, 5 | }; 6 | 7 | pub struct DepkindBadge<'s> { 8 | kind: DependencyKind, 9 | style: &'s Style, 10 | } 11 | 12 | impl egui::Widget for DepkindBadge<'_> { 13 | fn ui(self, ui: &mut egui::Ui) -> egui::Response { 14 | let (text, bg_color, text_color) = match self.kind { 15 | DependencyKind::Normal => ( 16 | "normal", 17 | self.style.colors.inactive_weak_bg_fill, 18 | self.style.colors.inactive_fg_stroke, 19 | ), 20 | DependencyKind::Development => ( 21 | "dev", 22 | egui::Color32::from_rgb(32, 60, 18), 23 | egui::Color32::YELLOW, 24 | ), 25 | DependencyKind::Build => ( 26 | "build", 27 | egui::Color32::from_rgb(78, 40, 25), 28 | egui::Color32::YELLOW, 29 | ), 30 | DependencyKind::Unknown => ( 31 | "unknown", 32 | egui::Color32::from_rgb(115, 115, 115), 33 | egui::Color32::YELLOW, 34 | ), 35 | }; 36 | badge(ui, text, bg_color, text_color) 37 | } 38 | } 39 | 40 | impl<'a> DepkindBadge<'a> { 41 | pub fn new(kind: DependencyKind, style: &'a crate::style::Style) -> Self { 42 | Self { kind, style } 43 | } 44 | } 45 | 46 | pub fn badge( 47 | ui: &mut egui::Ui, 48 | text: &str, 49 | bg_color: egui::Color32, 50 | text_color: egui::Color32, 51 | ) -> egui::Response { 52 | let label = egui::Label::new(egui::RichText::new(text).size(13.0)); 53 | let (pos, galley, re) = label.layout_in_ui(ui); 54 | let painter = ui.painter(); 55 | let rect = re.rect.expand(2.0); 56 | painter.rect_filled(rect, 2.0, bg_color); 57 | painter.galley(pos, galley, text_color); 58 | re.with_new_rect(rect) 59 | } 60 | 61 | pub struct VersionBadge<'a> { 62 | ver: &'a Version, 63 | bg_color: egui::Color32, 64 | text_color: egui::Color32, 65 | } 66 | 67 | impl<'a> VersionBadge<'a> { 68 | pub fn new(ver: &'a Version, style: &crate::style::Style) -> Self { 69 | Self { 70 | ver, 71 | bg_color: style.colors.inactive_weak_bg_fill, 72 | text_color: style.colors.inactive_fg_stroke, 73 | } 74 | } 75 | } 76 | 77 | impl egui::Widget for VersionBadge<'_> { 78 | fn ui(self, ui: &mut egui::Ui) -> egui::Response { 79 | badge(ui, &self.ver.to_string(), self.bg_color, self.text_color) 80 | } 81 | } 82 | --------------------------------------------------------------------------------