├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── build.rs └── src ├── commands_generated.rs ├── hasher.rs ├── hashers_generated.rs ├── lib.rs └── main.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target -------------------------------------------------------------------------------- /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 = "adler2" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "1.1.3" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "alloc-no-stdlib" 22 | version = "2.0.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 25 | 26 | [[package]] 27 | name = "alloc-stdlib" 28 | version = "0.2.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 31 | dependencies = [ 32 | "alloc-no-stdlib", 33 | ] 34 | 35 | [[package]] 36 | name = "allocator-api2" 37 | version = "0.2.21" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 40 | 41 | [[package]] 42 | name = "android-tzdata" 43 | version = "0.1.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 46 | 47 | [[package]] 48 | name = "android_system_properties" 49 | version = "0.1.5" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 52 | dependencies = [ 53 | "libc", 54 | ] 55 | 56 | [[package]] 57 | name = "arrayref" 58 | version = "0.3.9" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 61 | 62 | [[package]] 63 | name = "arrayvec" 64 | version = "0.7.6" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 67 | 68 | [[package]] 69 | name = "ascon" 70 | version = "0.3.1" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "9fe9a0cff241855e9166670d259192aacf1e9a81b865dc9905afbbab31a9d2c1" 73 | 74 | [[package]] 75 | name = "ascon-hash" 76 | version = "0.2.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "d629b6e580029d416158998cf0ae2d355d68cde3ed25715549533b0de9fd90b6" 79 | dependencies = [ 80 | "ascon", 81 | "digest", 82 | ] 83 | 84 | [[package]] 85 | name = "autocfg" 86 | version = "1.4.0" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 89 | 90 | [[package]] 91 | name = "belt-block" 92 | version = "0.1.2" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "d9aa1eef3994e2ccd304a78fe3fea4a73e5792007f85f09b79bb82143ca5f82b" 95 | 96 | [[package]] 97 | name = "belt-hash" 98 | version = "0.1.1" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "fbc405b3b8472f6e019aedf942fdee9516a0546d12e053d3744416e8f21ddb8a" 101 | dependencies = [ 102 | "belt-block", 103 | "digest", 104 | ] 105 | 106 | [[package]] 107 | name = "bindgen" 108 | version = "0.70.1" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 111 | dependencies = [ 112 | "bitflags", 113 | "cexpr", 114 | "clang-sys", 115 | "itertools", 116 | "proc-macro2", 117 | "quote", 118 | "regex", 119 | "rustc-hash", 120 | "shlex", 121 | "syn", 122 | ] 123 | 124 | [[package]] 125 | name = "bit-set" 126 | version = "0.8.0" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 129 | dependencies = [ 130 | "bit-vec", 131 | ] 132 | 133 | [[package]] 134 | name = "bit-vec" 135 | version = "0.8.0" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 138 | 139 | [[package]] 140 | name = "bitflags" 141 | version = "2.8.0" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 144 | 145 | [[package]] 146 | name = "blake2" 147 | version = "0.10.6" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" 150 | dependencies = [ 151 | "digest", 152 | ] 153 | 154 | [[package]] 155 | name = "blake3" 156 | version = "1.6.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "675f87afced0413c9bb02843499dbbd3882a237645883f71a2b59644a6d2f753" 159 | dependencies = [ 160 | "arrayref", 161 | "arrayvec", 162 | "cc", 163 | "cfg-if", 164 | "constant_time_eq", 165 | "digest", 166 | ] 167 | 168 | [[package]] 169 | name = "block-buffer" 170 | version = "0.10.4" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 173 | dependencies = [ 174 | "generic-array", 175 | ] 176 | 177 | [[package]] 178 | name = "brotli" 179 | version = "7.0.0" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" 182 | dependencies = [ 183 | "alloc-no-stdlib", 184 | "alloc-stdlib", 185 | "brotli-decompressor", 186 | ] 187 | 188 | [[package]] 189 | name = "brotli-decompressor" 190 | version = "4.0.2" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" 193 | dependencies = [ 194 | "alloc-no-stdlib", 195 | "alloc-stdlib", 196 | ] 197 | 198 | [[package]] 199 | name = "bumpalo" 200 | version = "3.17.0" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 203 | 204 | [[package]] 205 | name = "byteorder" 206 | version = "1.5.0" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 209 | 210 | [[package]] 211 | name = "bytes" 212 | version = "1.10.0" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 215 | 216 | [[package]] 217 | name = "bytesize" 218 | version = "1.3.3" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" 221 | 222 | [[package]] 223 | name = "cc" 224 | version = "1.2.12" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" 227 | dependencies = [ 228 | "shlex", 229 | ] 230 | 231 | [[package]] 232 | name = "cexpr" 233 | version = "0.6.0" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 236 | dependencies = [ 237 | "nom", 238 | ] 239 | 240 | [[package]] 241 | name = "cfg-if" 242 | version = "1.0.0" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 245 | 246 | [[package]] 247 | name = "cfg_aliases" 248 | version = "0.2.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 251 | 252 | [[package]] 253 | name = "chrono" 254 | version = "0.4.39" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 257 | dependencies = [ 258 | "android-tzdata", 259 | "iana-time-zone", 260 | "num-traits", 261 | "pure-rust-locales", 262 | "serde", 263 | "windows-targets 0.52.6", 264 | ] 265 | 266 | [[package]] 267 | name = "chrono-humanize" 268 | version = "0.2.3" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" 271 | dependencies = [ 272 | "chrono", 273 | ] 274 | 275 | [[package]] 276 | name = "clang-sys" 277 | version = "1.8.1" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 280 | dependencies = [ 281 | "glob", 282 | "libc", 283 | "libloading", 284 | ] 285 | 286 | [[package]] 287 | name = "const_format" 288 | version = "0.2.34" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" 291 | dependencies = [ 292 | "const_format_proc_macros", 293 | ] 294 | 295 | [[package]] 296 | name = "const_format_proc_macros" 297 | version = "0.2.34" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" 300 | dependencies = [ 301 | "proc-macro2", 302 | "quote", 303 | "unicode-xid", 304 | ] 305 | 306 | [[package]] 307 | name = "constant_time_eq" 308 | version = "0.3.1" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 311 | 312 | [[package]] 313 | name = "core-foundation-sys" 314 | version = "0.8.7" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 317 | 318 | [[package]] 319 | name = "cpufeatures" 320 | version = "0.2.17" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 323 | dependencies = [ 324 | "libc", 325 | ] 326 | 327 | [[package]] 328 | name = "crc32fast" 329 | version = "1.4.2" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 332 | dependencies = [ 333 | "cfg-if", 334 | ] 335 | 336 | [[package]] 337 | name = "crossbeam-deque" 338 | version = "0.8.6" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 341 | dependencies = [ 342 | "crossbeam-epoch", 343 | "crossbeam-utils", 344 | ] 345 | 346 | [[package]] 347 | name = "crossbeam-epoch" 348 | version = "0.9.18" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 351 | dependencies = [ 352 | "crossbeam-utils", 353 | ] 354 | 355 | [[package]] 356 | name = "crossbeam-utils" 357 | version = "0.8.21" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 360 | 361 | [[package]] 362 | name = "crossterm" 363 | version = "0.28.1" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 366 | dependencies = [ 367 | "bitflags", 368 | "crossterm_winapi", 369 | "mio", 370 | "parking_lot", 371 | "rustix", 372 | "signal-hook", 373 | "signal-hook-mio", 374 | "winapi", 375 | ] 376 | 377 | [[package]] 378 | name = "crossterm_winapi" 379 | version = "0.9.1" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 382 | dependencies = [ 383 | "winapi", 384 | ] 385 | 386 | [[package]] 387 | name = "crypto-common" 388 | version = "0.1.6" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 391 | dependencies = [ 392 | "generic-array", 393 | "typenum", 394 | ] 395 | 396 | [[package]] 397 | name = "deranged" 398 | version = "0.3.11" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 401 | dependencies = [ 402 | "powerfmt", 403 | ] 404 | 405 | [[package]] 406 | name = "digest" 407 | version = "0.10.7" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 410 | dependencies = [ 411 | "block-buffer", 412 | "crypto-common", 413 | "subtle", 414 | ] 415 | 416 | [[package]] 417 | name = "dirs" 418 | version = "5.0.1" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 421 | dependencies = [ 422 | "dirs-sys", 423 | ] 424 | 425 | [[package]] 426 | name = "dirs-sys" 427 | version = "0.4.1" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 430 | dependencies = [ 431 | "libc", 432 | "option-ext", 433 | "redox_users", 434 | "windows-sys 0.48.0", 435 | ] 436 | 437 | [[package]] 438 | name = "doctest-file" 439 | version = "1.0.0" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" 442 | 443 | [[package]] 444 | name = "either" 445 | version = "1.13.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 448 | 449 | [[package]] 450 | name = "equivalent" 451 | version = "1.0.1" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 454 | 455 | [[package]] 456 | name = "erased-serde" 457 | version = "0.4.5" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" 460 | dependencies = [ 461 | "serde", 462 | "typeid", 463 | ] 464 | 465 | [[package]] 466 | name = "errno" 467 | version = "0.3.10" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 470 | dependencies = [ 471 | "libc", 472 | "windows-sys 0.59.0", 473 | ] 474 | 475 | [[package]] 476 | name = "fancy-regex" 477 | version = "0.14.0" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" 480 | dependencies = [ 481 | "bit-set", 482 | "regex-automata", 483 | "regex-syntax", 484 | ] 485 | 486 | [[package]] 487 | name = "flate2" 488 | version = "1.0.35" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 491 | dependencies = [ 492 | "crc32fast", 493 | "miniz_oxide", 494 | ] 495 | 496 | [[package]] 497 | name = "foldhash" 498 | version = "0.1.4" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 501 | 502 | [[package]] 503 | name = "fsb" 504 | version = "0.1.3" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "e54a22467e3d3e1b2d014c67cb074fe361d80e3293ffab4128918313eaf737c8" 507 | dependencies = [ 508 | "digest", 509 | "whirlpool", 510 | ] 511 | 512 | [[package]] 513 | name = "generic-array" 514 | version = "0.14.7" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 517 | dependencies = [ 518 | "typenum", 519 | "version_check", 520 | ] 521 | 522 | [[package]] 523 | name = "getrandom" 524 | version = "0.2.15" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 527 | dependencies = [ 528 | "cfg-if", 529 | "libc", 530 | "wasi", 531 | ] 532 | 533 | [[package]] 534 | name = "glob" 535 | version = "0.3.2" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 538 | 539 | [[package]] 540 | name = "gost94" 541 | version = "0.10.4" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "2f960e0ba8eb5e47a7d45097dc4159b5ef63d82e62dc85894bfcfd8e6b85526c" 544 | dependencies = [ 545 | "digest", 546 | ] 547 | 548 | [[package]] 549 | name = "groestl" 550 | version = "0.10.1" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "343cfc165f92a988fd60292f7a0bfde4352a5a0beff9fbec29251ca4e9676e4d" 553 | dependencies = [ 554 | "digest", 555 | ] 556 | 557 | [[package]] 558 | name = "hashbrown" 559 | version = "0.15.2" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 562 | dependencies = [ 563 | "allocator-api2", 564 | "equivalent", 565 | "foldhash", 566 | ] 567 | 568 | [[package]] 569 | name = "heck" 570 | version = "0.5.0" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 573 | 574 | [[package]] 575 | name = "hex" 576 | version = "0.4.3" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 579 | 580 | [[package]] 581 | name = "hex-literal" 582 | version = "0.4.1" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" 585 | 586 | [[package]] 587 | name = "iana-time-zone" 588 | version = "0.1.61" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 591 | dependencies = [ 592 | "android_system_properties", 593 | "core-foundation-sys", 594 | "iana-time-zone-haiku", 595 | "js-sys", 596 | "wasm-bindgen", 597 | "windows-core 0.52.0", 598 | ] 599 | 600 | [[package]] 601 | name = "iana-time-zone-haiku" 602 | version = "0.1.2" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 605 | dependencies = [ 606 | "cc", 607 | ] 608 | 609 | [[package]] 610 | name = "indexmap" 611 | version = "2.9.0" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 614 | dependencies = [ 615 | "equivalent", 616 | "hashbrown", 617 | ] 618 | 619 | [[package]] 620 | name = "interprocess" 621 | version = "2.2.2" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" 624 | dependencies = [ 625 | "doctest-file", 626 | "libc", 627 | "recvmsg", 628 | "widestring", 629 | "windows-sys 0.52.0", 630 | ] 631 | 632 | [[package]] 633 | name = "inventory" 634 | version = "0.3.19" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "54b12ebb6799019b044deaf431eadfe23245b259bba5a2c0796acec3943a3cdb" 637 | dependencies = [ 638 | "rustversion", 639 | ] 640 | 641 | [[package]] 642 | name = "is_ci" 643 | version = "1.2.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" 646 | 647 | [[package]] 648 | name = "is_debug" 649 | version = "1.1.0" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" 652 | 653 | [[package]] 654 | name = "itertools" 655 | version = "0.13.0" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 658 | dependencies = [ 659 | "either", 660 | ] 661 | 662 | [[package]] 663 | name = "itoa" 664 | version = "1.0.14" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 667 | 668 | [[package]] 669 | name = "jh" 670 | version = "0.1.0" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "f65735f9e73adc203417d2e05352aef71d7e832ec090f65de26c96c9ec563aa5" 673 | dependencies = [ 674 | "digest", 675 | "hex-literal", 676 | "ppv-lite86", 677 | ] 678 | 679 | [[package]] 680 | name = "js-sys" 681 | version = "0.3.77" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 684 | dependencies = [ 685 | "once_cell", 686 | "wasm-bindgen", 687 | ] 688 | 689 | [[package]] 690 | name = "keccak" 691 | version = "0.1.5" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" 694 | dependencies = [ 695 | "cpufeatures", 696 | ] 697 | 698 | [[package]] 699 | name = "libc" 700 | version = "0.2.169" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 703 | 704 | [[package]] 705 | name = "libloading" 706 | version = "0.8.6" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 709 | dependencies = [ 710 | "cfg-if", 711 | "windows-targets 0.52.6", 712 | ] 713 | 714 | [[package]] 715 | name = "libproc" 716 | version = "0.14.10" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" 719 | dependencies = [ 720 | "bindgen", 721 | "errno", 722 | "libc", 723 | ] 724 | 725 | [[package]] 726 | name = "libredox" 727 | version = "0.1.3" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 730 | dependencies = [ 731 | "bitflags", 732 | "libc", 733 | ] 734 | 735 | [[package]] 736 | name = "linux-raw-sys" 737 | version = "0.4.15" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 740 | 741 | [[package]] 742 | name = "lock_api" 743 | version = "0.4.12" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 746 | dependencies = [ 747 | "autocfg", 748 | "scopeguard", 749 | ] 750 | 751 | [[package]] 752 | name = "log" 753 | version = "0.4.25" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 756 | 757 | [[package]] 758 | name = "lru" 759 | version = "0.12.5" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 762 | dependencies = [ 763 | "hashbrown", 764 | ] 765 | 766 | [[package]] 767 | name = "lscolors" 768 | version = "0.17.0" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "53304fff6ab1e597661eee37e42ea8c47a146fca280af902bb76bff8a896e523" 771 | dependencies = [ 772 | "nu-ansi-term", 773 | ] 774 | 775 | [[package]] 776 | name = "mach2" 777 | version = "0.4.2" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 780 | dependencies = [ 781 | "libc", 782 | ] 783 | 784 | [[package]] 785 | name = "md2" 786 | version = "0.10.2" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "1f4f0f3ed25ff4f8d8d102288d92f900efc202661c884cf67dfe4f0d07c43d1f" 789 | dependencies = [ 790 | "digest", 791 | ] 792 | 793 | [[package]] 794 | name = "md4" 795 | version = "0.10.2" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | checksum = "7da5ac363534dce5fabf69949225e174fbf111a498bf0ff794c8ea1fba9f3dda" 798 | dependencies = [ 799 | "digest", 800 | ] 801 | 802 | [[package]] 803 | name = "memchr" 804 | version = "2.7.4" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 807 | 808 | [[package]] 809 | name = "miette" 810 | version = "7.5.0" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "1a955165f87b37fd1862df2a59547ac542c77ef6d17c666f619d1ad22dd89484" 813 | dependencies = [ 814 | "cfg-if", 815 | "miette-derive", 816 | "owo-colors", 817 | "supports-color", 818 | "supports-hyperlinks", 819 | "supports-unicode", 820 | "terminal_size", 821 | "textwrap", 822 | "thiserror 1.0.69", 823 | "unicode-width", 824 | ] 825 | 826 | [[package]] 827 | name = "miette-derive" 828 | version = "7.5.0" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "bf45bf44ab49be92fd1227a3be6fc6f617f1a337c06af54981048574d8783147" 831 | dependencies = [ 832 | "proc-macro2", 833 | "quote", 834 | "syn", 835 | ] 836 | 837 | [[package]] 838 | name = "minimal-lexical" 839 | version = "0.2.1" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 842 | 843 | [[package]] 844 | name = "miniz_oxide" 845 | version = "0.8.3" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 848 | dependencies = [ 849 | "adler2", 850 | ] 851 | 852 | [[package]] 853 | name = "mio" 854 | version = "1.0.3" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 857 | dependencies = [ 858 | "libc", 859 | "log", 860 | "wasi", 861 | "windows-sys 0.52.0", 862 | ] 863 | 864 | [[package]] 865 | name = "nix" 866 | version = "0.29.0" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 869 | dependencies = [ 870 | "bitflags", 871 | "cfg-if", 872 | "cfg_aliases", 873 | "libc", 874 | ] 875 | 876 | [[package]] 877 | name = "nom" 878 | version = "7.1.3" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 881 | dependencies = [ 882 | "memchr", 883 | "minimal-lexical", 884 | ] 885 | 886 | [[package]] 887 | name = "ntapi" 888 | version = "0.4.1" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 891 | dependencies = [ 892 | "winapi", 893 | ] 894 | 895 | [[package]] 896 | name = "nu-ansi-term" 897 | version = "0.50.1" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 900 | dependencies = [ 901 | "windows-sys 0.52.0", 902 | ] 903 | 904 | [[package]] 905 | name = "nu-cmd-base" 906 | version = "0.104.0" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "1ae53525607e64c6c51ca3f217cd94d793f2553e728c0e0c38ac7daa1066dd96" 909 | dependencies = [ 910 | "indexmap", 911 | "miette", 912 | "nu-engine", 913 | "nu-parser", 914 | "nu-path", 915 | "nu-protocol", 916 | ] 917 | 918 | [[package]] 919 | name = "nu-cmd-lang" 920 | version = "0.104.0" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "e66adfeda88f8e27bcb25d068d9e6e8b3a94c2bf988a9c30e8e3b2045867aefe" 923 | dependencies = [ 924 | "itertools", 925 | "nu-engine", 926 | "nu-parser", 927 | "nu-protocol", 928 | "nu-utils", 929 | "shadow-rs", 930 | ] 931 | 932 | [[package]] 933 | name = "nu-derive-value" 934 | version = "0.104.0" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "5fd0d8e358b6440d01fe4e617f180aea826bade72efb54f5dc1c22e0e8038b6f" 937 | dependencies = [ 938 | "heck", 939 | "proc-macro-error2", 940 | "proc-macro2", 941 | "quote", 942 | "syn", 943 | ] 944 | 945 | [[package]] 946 | name = "nu-engine" 947 | version = "0.104.0" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "0c2b01483e3d09460375f0c0da7a83b6dc26fb319ca09c55d0665087b2d587c7" 950 | dependencies = [ 951 | "log", 952 | "nu-glob", 953 | "nu-path", 954 | "nu-protocol", 955 | "nu-utils", 956 | ] 957 | 958 | [[package]] 959 | name = "nu-glob" 960 | version = "0.104.0" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "202ce25889336061efea24e69d4e0de7147c15fd9892cdd70533500d47db8364" 963 | 964 | [[package]] 965 | name = "nu-parser" 966 | version = "0.104.0" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "cb0591ef4d4989c1930863d9d17d8fd2d70b03ec2d9caeca067e9626e05c49d9" 969 | dependencies = [ 970 | "bytesize", 971 | "chrono", 972 | "itertools", 973 | "log", 974 | "nu-engine", 975 | "nu-path", 976 | "nu-plugin-engine", 977 | "nu-protocol", 978 | "nu-utils", 979 | "serde_json", 980 | ] 981 | 982 | [[package]] 983 | name = "nu-path" 984 | version = "0.104.0" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "41c68c7c06898a5c4c9f10038da63759661cb8ac8f301ce7d159173a595c8258" 987 | dependencies = [ 988 | "dirs", 989 | "omnipath", 990 | "pwd", 991 | "ref-cast", 992 | ] 993 | 994 | [[package]] 995 | name = "nu-plugin" 996 | version = "0.104.0" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "e00d2ccb35a1206c51740bea63b0deb72dc4c34ca6ceae6feac95f84d68370d2" 999 | dependencies = [ 1000 | "log", 1001 | "nix", 1002 | "nu-engine", 1003 | "nu-plugin-core", 1004 | "nu-plugin-protocol", 1005 | "nu-protocol", 1006 | "nu-utils", 1007 | "thiserror 2.0.12", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "nu-plugin-core" 1012 | version = "0.104.0" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "30e416e6de2b62925ffc1924740a0e5340316a1630af3d2490d513bcb1f94e94" 1015 | dependencies = [ 1016 | "interprocess", 1017 | "log", 1018 | "nu-plugin-protocol", 1019 | "nu-protocol", 1020 | "rmp-serde", 1021 | "serde", 1022 | "serde_json", 1023 | "windows 0.56.0", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "nu-plugin-engine" 1028 | version = "0.104.0" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "14fb214ba23829ebfe61b9a5e0688cd5620922438d7d76a6f6b3e1151d07e82a" 1031 | dependencies = [ 1032 | "log", 1033 | "nu-engine", 1034 | "nu-plugin-core", 1035 | "nu-plugin-protocol", 1036 | "nu-protocol", 1037 | "nu-system", 1038 | "nu-utils", 1039 | "serde", 1040 | "windows 0.56.0", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "nu-plugin-protocol" 1045 | version = "0.104.0" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "be7edbdee451bb29150b5e8184660d79d0c0801a6748b9f712b758cb78110305" 1048 | dependencies = [ 1049 | "nu-protocol", 1050 | "nu-utils", 1051 | "rmp-serde", 1052 | "semver", 1053 | "serde", 1054 | "typetag", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "nu-plugin-test-support" 1059 | version = "0.104.0" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "b8acb62c21fd980e467162bc17a4e93a8435e28249256b52e58718278149978d" 1062 | dependencies = [ 1063 | "nu-ansi-term", 1064 | "nu-cmd-lang", 1065 | "nu-engine", 1066 | "nu-parser", 1067 | "nu-plugin", 1068 | "nu-plugin-core", 1069 | "nu-plugin-engine", 1070 | "nu-plugin-protocol", 1071 | "nu-protocol", 1072 | "similar", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "nu-protocol" 1077 | version = "0.104.0" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "ab657b1947f1fad3c5052cb210fa311744736a4800a966ae21c4bc63de7c60ab" 1080 | dependencies = [ 1081 | "brotli", 1082 | "bytes", 1083 | "chrono", 1084 | "chrono-humanize", 1085 | "dirs", 1086 | "dirs-sys", 1087 | "fancy-regex", 1088 | "heck", 1089 | "indexmap", 1090 | "log", 1091 | "lru", 1092 | "memchr", 1093 | "miette", 1094 | "nix", 1095 | "nu-derive-value", 1096 | "nu-glob", 1097 | "nu-path", 1098 | "nu-system", 1099 | "nu-utils", 1100 | "num-format", 1101 | "os_pipe", 1102 | "rmp-serde", 1103 | "serde", 1104 | "serde_json", 1105 | "strum", 1106 | "strum_macros", 1107 | "thiserror 2.0.12", 1108 | "typetag", 1109 | "web-time", 1110 | "windows-sys 0.48.0", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "nu-system" 1115 | version = "0.104.0" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "f47094aaab4f1e3a86c3960400d82a50fcabde907f964ae095963ec95669577a" 1118 | dependencies = [ 1119 | "chrono", 1120 | "itertools", 1121 | "libc", 1122 | "libproc", 1123 | "log", 1124 | "mach2", 1125 | "nix", 1126 | "ntapi", 1127 | "procfs", 1128 | "sysinfo", 1129 | "web-time", 1130 | "windows 0.56.0", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "nu-utils" 1135 | version = "0.104.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "327999b774d78b301a6b68c33d312a1a8047c59fb8971b6552ebf823251f1481" 1138 | dependencies = [ 1139 | "crossterm", 1140 | "crossterm_winapi", 1141 | "fancy-regex", 1142 | "log", 1143 | "lscolors", 1144 | "nix", 1145 | "num-format", 1146 | "serde", 1147 | "serde_json", 1148 | "strip-ansi-escapes", 1149 | "sys-locale", 1150 | "unicase", 1151 | ] 1152 | 1153 | [[package]] 1154 | name = "nu_plugin_hashes" 1155 | version = "0.1.8" 1156 | dependencies = [ 1157 | "ascon-hash", 1158 | "belt-hash", 1159 | "blake2", 1160 | "blake3", 1161 | "digest", 1162 | "fsb", 1163 | "gost94", 1164 | "groestl", 1165 | "jh", 1166 | "md2", 1167 | "md4", 1168 | "nu-cmd-base", 1169 | "nu-plugin", 1170 | "nu-plugin-test-support", 1171 | "nu-protocol", 1172 | "ripemd", 1173 | "sha1", 1174 | "sha2", 1175 | "sha3", 1176 | "shabal", 1177 | "skein", 1178 | "sm3", 1179 | "streebog", 1180 | "tiger", 1181 | "whirlpool", 1182 | ] 1183 | 1184 | [[package]] 1185 | name = "num-conv" 1186 | version = "0.1.0" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1189 | 1190 | [[package]] 1191 | name = "num-format" 1192 | version = "0.4.4" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" 1195 | dependencies = [ 1196 | "arrayvec", 1197 | "itoa", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "num-traits" 1202 | version = "0.2.19" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1205 | dependencies = [ 1206 | "autocfg", 1207 | ] 1208 | 1209 | [[package]] 1210 | name = "num_threads" 1211 | version = "0.1.7" 1212 | source = "registry+https://github.com/rust-lang/crates.io-index" 1213 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 1214 | dependencies = [ 1215 | "libc", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "omnipath" 1220 | version = "0.1.6" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "80adb31078122c880307e9cdfd4e3361e6545c319f9b9dcafcb03acd3b51a575" 1223 | 1224 | [[package]] 1225 | name = "once_cell" 1226 | version = "1.20.2" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1229 | 1230 | [[package]] 1231 | name = "option-ext" 1232 | version = "0.2.0" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1235 | 1236 | [[package]] 1237 | name = "os_pipe" 1238 | version = "1.2.1" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" 1241 | dependencies = [ 1242 | "libc", 1243 | "windows-sys 0.59.0", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "owo-colors" 1248 | version = "4.1.0" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" 1251 | 1252 | [[package]] 1253 | name = "parking_lot" 1254 | version = "0.12.3" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1257 | dependencies = [ 1258 | "lock_api", 1259 | "parking_lot_core", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "parking_lot_core" 1264 | version = "0.9.10" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1267 | dependencies = [ 1268 | "cfg-if", 1269 | "libc", 1270 | "redox_syscall", 1271 | "smallvec", 1272 | "windows-targets 0.52.6", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "paste" 1277 | version = "1.0.15" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1280 | 1281 | [[package]] 1282 | name = "powerfmt" 1283 | version = "0.2.0" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1286 | 1287 | [[package]] 1288 | name = "ppv-lite86" 1289 | version = "0.2.20" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1292 | dependencies = [ 1293 | "zerocopy", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "proc-macro-error-attr2" 1298 | version = "2.0.0" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" 1301 | dependencies = [ 1302 | "proc-macro2", 1303 | "quote", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "proc-macro-error2" 1308 | version = "2.0.1" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" 1311 | dependencies = [ 1312 | "proc-macro-error-attr2", 1313 | "proc-macro2", 1314 | "quote", 1315 | "syn", 1316 | ] 1317 | 1318 | [[package]] 1319 | name = "proc-macro2" 1320 | version = "1.0.93" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1323 | dependencies = [ 1324 | "unicode-ident", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "procfs" 1329 | version = "0.17.0" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" 1332 | dependencies = [ 1333 | "bitflags", 1334 | "chrono", 1335 | "flate2", 1336 | "hex", 1337 | "procfs-core", 1338 | "rustix", 1339 | ] 1340 | 1341 | [[package]] 1342 | name = "procfs-core" 1343 | version = "0.17.0" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" 1346 | dependencies = [ 1347 | "bitflags", 1348 | "chrono", 1349 | "hex", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "pure-rust-locales" 1354 | version = "0.8.1" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" 1357 | 1358 | [[package]] 1359 | name = "pwd" 1360 | version = "1.4.0" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "72c71c0c79b9701efe4e1e4b563b2016dd4ee789eb99badcb09d61ac4b92e4a2" 1363 | dependencies = [ 1364 | "libc", 1365 | "thiserror 1.0.69", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "quote" 1370 | version = "1.0.38" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1373 | dependencies = [ 1374 | "proc-macro2", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "rayon" 1379 | version = "1.10.0" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1382 | dependencies = [ 1383 | "either", 1384 | "rayon-core", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "rayon-core" 1389 | version = "1.12.1" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1392 | dependencies = [ 1393 | "crossbeam-deque", 1394 | "crossbeam-utils", 1395 | ] 1396 | 1397 | [[package]] 1398 | name = "recvmsg" 1399 | version = "1.0.0" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" 1402 | 1403 | [[package]] 1404 | name = "redox_syscall" 1405 | version = "0.5.8" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1408 | dependencies = [ 1409 | "bitflags", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "redox_users" 1414 | version = "0.4.6" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1417 | dependencies = [ 1418 | "getrandom", 1419 | "libredox", 1420 | "thiserror 1.0.69", 1421 | ] 1422 | 1423 | [[package]] 1424 | name = "ref-cast" 1425 | version = "1.0.23" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" 1428 | dependencies = [ 1429 | "ref-cast-impl", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "ref-cast-impl" 1434 | version = "1.0.23" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" 1437 | dependencies = [ 1438 | "proc-macro2", 1439 | "quote", 1440 | "syn", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "regex" 1445 | version = "1.11.1" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1448 | dependencies = [ 1449 | "aho-corasick", 1450 | "memchr", 1451 | "regex-automata", 1452 | "regex-syntax", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "regex-automata" 1457 | version = "0.4.9" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1460 | dependencies = [ 1461 | "aho-corasick", 1462 | "memchr", 1463 | "regex-syntax", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "regex-syntax" 1468 | version = "0.8.5" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1471 | 1472 | [[package]] 1473 | name = "ripemd" 1474 | version = "0.1.3" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" 1477 | dependencies = [ 1478 | "digest", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "rmp" 1483 | version = "0.8.14" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" 1486 | dependencies = [ 1487 | "byteorder", 1488 | "num-traits", 1489 | "paste", 1490 | ] 1491 | 1492 | [[package]] 1493 | name = "rmp-serde" 1494 | version = "1.3.0" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" 1497 | dependencies = [ 1498 | "byteorder", 1499 | "rmp", 1500 | "serde", 1501 | ] 1502 | 1503 | [[package]] 1504 | name = "rustc-hash" 1505 | version = "1.1.0" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1508 | 1509 | [[package]] 1510 | name = "rustix" 1511 | version = "0.38.44" 1512 | source = "registry+https://github.com/rust-lang/crates.io-index" 1513 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1514 | dependencies = [ 1515 | "bitflags", 1516 | "errno", 1517 | "libc", 1518 | "linux-raw-sys", 1519 | "windows-sys 0.59.0", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "rustversion" 1524 | version = "1.0.19" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1527 | 1528 | [[package]] 1529 | name = "ryu" 1530 | version = "1.0.19" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1533 | 1534 | [[package]] 1535 | name = "scopeguard" 1536 | version = "1.2.0" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1539 | 1540 | [[package]] 1541 | name = "semver" 1542 | version = "1.0.25" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 1545 | 1546 | [[package]] 1547 | name = "serde" 1548 | version = "1.0.217" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1551 | dependencies = [ 1552 | "serde_derive", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "serde_derive" 1557 | version = "1.0.217" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1560 | dependencies = [ 1561 | "proc-macro2", 1562 | "quote", 1563 | "syn", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "serde_json" 1568 | version = "1.0.138" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" 1571 | dependencies = [ 1572 | "itoa", 1573 | "memchr", 1574 | "ryu", 1575 | "serde", 1576 | ] 1577 | 1578 | [[package]] 1579 | name = "sha1" 1580 | version = "0.10.6" 1581 | source = "registry+https://github.com/rust-lang/crates.io-index" 1582 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1583 | dependencies = [ 1584 | "cfg-if", 1585 | "cpufeatures", 1586 | "digest", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "sha2" 1591 | version = "0.10.8" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1594 | dependencies = [ 1595 | "cfg-if", 1596 | "cpufeatures", 1597 | "digest", 1598 | ] 1599 | 1600 | [[package]] 1601 | name = "sha3" 1602 | version = "0.10.8" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 1605 | dependencies = [ 1606 | "digest", 1607 | "keccak", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "shabal" 1612 | version = "0.4.1" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "990a6c7ff96ecc5664129bbf1f7b46a5a7c13f297d05af75e702f861cea6f08a" 1615 | dependencies = [ 1616 | "digest", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "shadow-rs" 1621 | version = "1.1.1" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "6d5625ed609cf66d7e505e7d487aca815626dc4ebb6c0dd07637ca61a44651a6" 1624 | dependencies = [ 1625 | "const_format", 1626 | "is_debug", 1627 | "time", 1628 | "tzdb", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "shlex" 1633 | version = "1.3.0" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1636 | 1637 | [[package]] 1638 | name = "signal-hook" 1639 | version = "0.3.17" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1642 | dependencies = [ 1643 | "libc", 1644 | "signal-hook-registry", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "signal-hook-mio" 1649 | version = "0.2.4" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" 1652 | dependencies = [ 1653 | "libc", 1654 | "mio", 1655 | "signal-hook", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "signal-hook-registry" 1660 | version = "1.4.2" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1663 | dependencies = [ 1664 | "libc", 1665 | ] 1666 | 1667 | [[package]] 1668 | name = "similar" 1669 | version = "2.7.0" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" 1672 | 1673 | [[package]] 1674 | name = "skein" 1675 | version = "0.1.0" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "f412279217fa74b69094bf6b5cde63dd0ece9b85d94fedda9bbfdfb2666125cf" 1678 | dependencies = [ 1679 | "digest", 1680 | "threefish", 1681 | ] 1682 | 1683 | [[package]] 1684 | name = "sm3" 1685 | version = "0.4.2" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "ebb9a3b702d0a7e33bc4d85a14456633d2b165c2ad839c5fd9a8417c1ab15860" 1688 | dependencies = [ 1689 | "digest", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "smallvec" 1694 | version = "1.13.2" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1697 | 1698 | [[package]] 1699 | name = "streebog" 1700 | version = "0.10.2" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "9e7fe6ed8a42cec360e070309427bb7959e102849b0dbaa7de19d5b9860bd536" 1703 | dependencies = [ 1704 | "digest", 1705 | ] 1706 | 1707 | [[package]] 1708 | name = "strip-ansi-escapes" 1709 | version = "0.2.1" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" 1712 | dependencies = [ 1713 | "vte", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "strum" 1718 | version = "0.26.3" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1721 | 1722 | [[package]] 1723 | name = "strum_macros" 1724 | version = "0.26.4" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1727 | dependencies = [ 1728 | "heck", 1729 | "proc-macro2", 1730 | "quote", 1731 | "rustversion", 1732 | "syn", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "subtle" 1737 | version = "2.6.1" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1740 | 1741 | [[package]] 1742 | name = "supports-color" 1743 | version = "3.0.2" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" 1746 | dependencies = [ 1747 | "is_ci", 1748 | ] 1749 | 1750 | [[package]] 1751 | name = "supports-hyperlinks" 1752 | version = "3.1.0" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" 1755 | 1756 | [[package]] 1757 | name = "supports-unicode" 1758 | version = "3.0.0" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" 1761 | 1762 | [[package]] 1763 | name = "syn" 1764 | version = "2.0.98" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 1767 | dependencies = [ 1768 | "proc-macro2", 1769 | "quote", 1770 | "unicode-ident", 1771 | ] 1772 | 1773 | [[package]] 1774 | name = "sys-locale" 1775 | version = "0.3.2" 1776 | source = "registry+https://github.com/rust-lang/crates.io-index" 1777 | checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 1778 | dependencies = [ 1779 | "libc", 1780 | ] 1781 | 1782 | [[package]] 1783 | name = "sysinfo" 1784 | version = "0.33.1" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" 1787 | dependencies = [ 1788 | "core-foundation-sys", 1789 | "libc", 1790 | "memchr", 1791 | "ntapi", 1792 | "rayon", 1793 | "windows 0.57.0", 1794 | ] 1795 | 1796 | [[package]] 1797 | name = "terminal_size" 1798 | version = "0.4.1" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" 1801 | dependencies = [ 1802 | "rustix", 1803 | "windows-sys 0.59.0", 1804 | ] 1805 | 1806 | [[package]] 1807 | name = "textwrap" 1808 | version = "0.16.1" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" 1811 | dependencies = [ 1812 | "unicode-linebreak", 1813 | "unicode-width", 1814 | ] 1815 | 1816 | [[package]] 1817 | name = "thiserror" 1818 | version = "1.0.69" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1821 | dependencies = [ 1822 | "thiserror-impl 1.0.69", 1823 | ] 1824 | 1825 | [[package]] 1826 | name = "thiserror" 1827 | version = "2.0.12" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1830 | dependencies = [ 1831 | "thiserror-impl 2.0.12", 1832 | ] 1833 | 1834 | [[package]] 1835 | name = "thiserror-impl" 1836 | version = "1.0.69" 1837 | source = "registry+https://github.com/rust-lang/crates.io-index" 1838 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1839 | dependencies = [ 1840 | "proc-macro2", 1841 | "quote", 1842 | "syn", 1843 | ] 1844 | 1845 | [[package]] 1846 | name = "thiserror-impl" 1847 | version = "2.0.12" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1850 | dependencies = [ 1851 | "proc-macro2", 1852 | "quote", 1853 | "syn", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "threefish" 1858 | version = "0.5.2" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "a693d0c8cf16973fac5a93fbe47b8c6452e7097d4fcac49f3d7a18e39c76e62e" 1861 | 1862 | [[package]] 1863 | name = "tiger" 1864 | version = "0.2.1" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "579abbce4ad73b04386dbeb34369c9873a8f9b749c7b99cbf479a2949ff715ed" 1867 | dependencies = [ 1868 | "digest", 1869 | ] 1870 | 1871 | [[package]] 1872 | name = "time" 1873 | version = "0.3.37" 1874 | source = "registry+https://github.com/rust-lang/crates.io-index" 1875 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 1876 | dependencies = [ 1877 | "deranged", 1878 | "itoa", 1879 | "libc", 1880 | "num-conv", 1881 | "num_threads", 1882 | "powerfmt", 1883 | "serde", 1884 | "time-core", 1885 | "time-macros", 1886 | ] 1887 | 1888 | [[package]] 1889 | name = "time-core" 1890 | version = "0.1.2" 1891 | source = "registry+https://github.com/rust-lang/crates.io-index" 1892 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1893 | 1894 | [[package]] 1895 | name = "time-macros" 1896 | version = "0.2.19" 1897 | source = "registry+https://github.com/rust-lang/crates.io-index" 1898 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 1899 | dependencies = [ 1900 | "num-conv", 1901 | "time-core", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "typeid" 1906 | version = "1.0.2" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" 1909 | 1910 | [[package]] 1911 | name = "typenum" 1912 | version = "1.17.0" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1915 | 1916 | [[package]] 1917 | name = "typetag" 1918 | version = "0.2.19" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "044fc3365ddd307c297fe0fe7b2e70588cdab4d0f62dc52055ca0d11b174cf0e" 1921 | dependencies = [ 1922 | "erased-serde", 1923 | "inventory", 1924 | "once_cell", 1925 | "serde", 1926 | "typetag-impl", 1927 | ] 1928 | 1929 | [[package]] 1930 | name = "typetag-impl" 1931 | version = "0.2.19" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "d9d30226ac9cbd2d1ff775f74e8febdab985dab14fb14aa2582c29a92d5555dc" 1934 | dependencies = [ 1935 | "proc-macro2", 1936 | "quote", 1937 | "syn", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "tz-rs" 1942 | version = "0.7.0" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "e1450bf2b99397e72070e7935c89facaa80092ac812502200375f1f7d33c71a1" 1945 | 1946 | [[package]] 1947 | name = "tzdb" 1948 | version = "0.7.2" 1949 | source = "registry+https://github.com/rust-lang/crates.io-index" 1950 | checksum = "0be2ea5956f295449f47c0b825c5e109022ff1a6a53bb4f77682a87c2341fbf5" 1951 | dependencies = [ 1952 | "iana-time-zone", 1953 | "tz-rs", 1954 | "tzdb_data", 1955 | ] 1956 | 1957 | [[package]] 1958 | name = "tzdb_data" 1959 | version = "0.2.2" 1960 | source = "registry+https://github.com/rust-lang/crates.io-index" 1961 | checksum = "9c4c81d75033770e40fbd3643ce7472a1a9fd301f90b7139038228daf8af03ec" 1962 | dependencies = [ 1963 | "tz-rs", 1964 | ] 1965 | 1966 | [[package]] 1967 | name = "unicase" 1968 | version = "2.8.1" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 1971 | 1972 | [[package]] 1973 | name = "unicode-ident" 1974 | version = "1.0.16" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 1977 | 1978 | [[package]] 1979 | name = "unicode-linebreak" 1980 | version = "0.1.5" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 1983 | 1984 | [[package]] 1985 | name = "unicode-width" 1986 | version = "0.1.14" 1987 | source = "registry+https://github.com/rust-lang/crates.io-index" 1988 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 1989 | 1990 | [[package]] 1991 | name = "unicode-xid" 1992 | version = "0.2.6" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 1995 | 1996 | [[package]] 1997 | name = "version_check" 1998 | version = "0.9.5" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2001 | 2002 | [[package]] 2003 | name = "vte" 2004 | version = "0.14.1" 2005 | source = "registry+https://github.com/rust-lang/crates.io-index" 2006 | checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" 2007 | dependencies = [ 2008 | "memchr", 2009 | ] 2010 | 2011 | [[package]] 2012 | name = "wasi" 2013 | version = "0.11.0+wasi-snapshot-preview1" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2016 | 2017 | [[package]] 2018 | name = "wasm-bindgen" 2019 | version = "0.2.100" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2022 | dependencies = [ 2023 | "cfg-if", 2024 | "once_cell", 2025 | "rustversion", 2026 | "wasm-bindgen-macro", 2027 | ] 2028 | 2029 | [[package]] 2030 | name = "wasm-bindgen-backend" 2031 | version = "0.2.100" 2032 | source = "registry+https://github.com/rust-lang/crates.io-index" 2033 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2034 | dependencies = [ 2035 | "bumpalo", 2036 | "log", 2037 | "proc-macro2", 2038 | "quote", 2039 | "syn", 2040 | "wasm-bindgen-shared", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "wasm-bindgen-macro" 2045 | version = "0.2.100" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2048 | dependencies = [ 2049 | "quote", 2050 | "wasm-bindgen-macro-support", 2051 | ] 2052 | 2053 | [[package]] 2054 | name = "wasm-bindgen-macro-support" 2055 | version = "0.2.100" 2056 | source = "registry+https://github.com/rust-lang/crates.io-index" 2057 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2058 | dependencies = [ 2059 | "proc-macro2", 2060 | "quote", 2061 | "syn", 2062 | "wasm-bindgen-backend", 2063 | "wasm-bindgen-shared", 2064 | ] 2065 | 2066 | [[package]] 2067 | name = "wasm-bindgen-shared" 2068 | version = "0.2.100" 2069 | source = "registry+https://github.com/rust-lang/crates.io-index" 2070 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2071 | dependencies = [ 2072 | "unicode-ident", 2073 | ] 2074 | 2075 | [[package]] 2076 | name = "web-time" 2077 | version = "1.1.0" 2078 | source = "registry+https://github.com/rust-lang/crates.io-index" 2079 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2080 | dependencies = [ 2081 | "js-sys", 2082 | "wasm-bindgen", 2083 | ] 2084 | 2085 | [[package]] 2086 | name = "whirlpool" 2087 | version = "0.10.4" 2088 | source = "registry+https://github.com/rust-lang/crates.io-index" 2089 | checksum = "f1ae50671d985c15b3214c7d969b8b520759fb3c8682444bec15ef775335a05c" 2090 | dependencies = [ 2091 | "digest", 2092 | ] 2093 | 2094 | [[package]] 2095 | name = "widestring" 2096 | version = "1.1.0" 2097 | source = "registry+https://github.com/rust-lang/crates.io-index" 2098 | checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" 2099 | 2100 | [[package]] 2101 | name = "winapi" 2102 | version = "0.3.9" 2103 | source = "registry+https://github.com/rust-lang/crates.io-index" 2104 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2105 | dependencies = [ 2106 | "winapi-i686-pc-windows-gnu", 2107 | "winapi-x86_64-pc-windows-gnu", 2108 | ] 2109 | 2110 | [[package]] 2111 | name = "winapi-i686-pc-windows-gnu" 2112 | version = "0.4.0" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2115 | 2116 | [[package]] 2117 | name = "winapi-x86_64-pc-windows-gnu" 2118 | version = "0.4.0" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2121 | 2122 | [[package]] 2123 | name = "windows" 2124 | version = "0.56.0" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" 2127 | dependencies = [ 2128 | "windows-core 0.56.0", 2129 | "windows-targets 0.52.6", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "windows" 2134 | version = "0.57.0" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" 2137 | dependencies = [ 2138 | "windows-core 0.57.0", 2139 | "windows-targets 0.52.6", 2140 | ] 2141 | 2142 | [[package]] 2143 | name = "windows-core" 2144 | version = "0.52.0" 2145 | source = "registry+https://github.com/rust-lang/crates.io-index" 2146 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2147 | dependencies = [ 2148 | "windows-targets 0.52.6", 2149 | ] 2150 | 2151 | [[package]] 2152 | name = "windows-core" 2153 | version = "0.56.0" 2154 | source = "registry+https://github.com/rust-lang/crates.io-index" 2155 | checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" 2156 | dependencies = [ 2157 | "windows-implement 0.56.0", 2158 | "windows-interface 0.56.0", 2159 | "windows-result", 2160 | "windows-targets 0.52.6", 2161 | ] 2162 | 2163 | [[package]] 2164 | name = "windows-core" 2165 | version = "0.57.0" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" 2168 | dependencies = [ 2169 | "windows-implement 0.57.0", 2170 | "windows-interface 0.57.0", 2171 | "windows-result", 2172 | "windows-targets 0.52.6", 2173 | ] 2174 | 2175 | [[package]] 2176 | name = "windows-implement" 2177 | version = "0.56.0" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" 2180 | dependencies = [ 2181 | "proc-macro2", 2182 | "quote", 2183 | "syn", 2184 | ] 2185 | 2186 | [[package]] 2187 | name = "windows-implement" 2188 | version = "0.57.0" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" 2191 | dependencies = [ 2192 | "proc-macro2", 2193 | "quote", 2194 | "syn", 2195 | ] 2196 | 2197 | [[package]] 2198 | name = "windows-interface" 2199 | version = "0.56.0" 2200 | source = "registry+https://github.com/rust-lang/crates.io-index" 2201 | checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" 2202 | dependencies = [ 2203 | "proc-macro2", 2204 | "quote", 2205 | "syn", 2206 | ] 2207 | 2208 | [[package]] 2209 | name = "windows-interface" 2210 | version = "0.57.0" 2211 | source = "registry+https://github.com/rust-lang/crates.io-index" 2212 | checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" 2213 | dependencies = [ 2214 | "proc-macro2", 2215 | "quote", 2216 | "syn", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "windows-result" 2221 | version = "0.1.2" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 2224 | dependencies = [ 2225 | "windows-targets 0.52.6", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "windows-sys" 2230 | version = "0.48.0" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2233 | dependencies = [ 2234 | "windows-targets 0.48.5", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "windows-sys" 2239 | version = "0.52.0" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2242 | dependencies = [ 2243 | "windows-targets 0.52.6", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "windows-sys" 2248 | version = "0.59.0" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2251 | dependencies = [ 2252 | "windows-targets 0.52.6", 2253 | ] 2254 | 2255 | [[package]] 2256 | name = "windows-targets" 2257 | version = "0.48.5" 2258 | source = "registry+https://github.com/rust-lang/crates.io-index" 2259 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2260 | dependencies = [ 2261 | "windows_aarch64_gnullvm 0.48.5", 2262 | "windows_aarch64_msvc 0.48.5", 2263 | "windows_i686_gnu 0.48.5", 2264 | "windows_i686_msvc 0.48.5", 2265 | "windows_x86_64_gnu 0.48.5", 2266 | "windows_x86_64_gnullvm 0.48.5", 2267 | "windows_x86_64_msvc 0.48.5", 2268 | ] 2269 | 2270 | [[package]] 2271 | name = "windows-targets" 2272 | version = "0.52.6" 2273 | source = "registry+https://github.com/rust-lang/crates.io-index" 2274 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2275 | dependencies = [ 2276 | "windows_aarch64_gnullvm 0.52.6", 2277 | "windows_aarch64_msvc 0.52.6", 2278 | "windows_i686_gnu 0.52.6", 2279 | "windows_i686_gnullvm", 2280 | "windows_i686_msvc 0.52.6", 2281 | "windows_x86_64_gnu 0.52.6", 2282 | "windows_x86_64_gnullvm 0.52.6", 2283 | "windows_x86_64_msvc 0.52.6", 2284 | ] 2285 | 2286 | [[package]] 2287 | name = "windows_aarch64_gnullvm" 2288 | version = "0.48.5" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2291 | 2292 | [[package]] 2293 | name = "windows_aarch64_gnullvm" 2294 | version = "0.52.6" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2297 | 2298 | [[package]] 2299 | name = "windows_aarch64_msvc" 2300 | version = "0.48.5" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2303 | 2304 | [[package]] 2305 | name = "windows_aarch64_msvc" 2306 | version = "0.52.6" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2309 | 2310 | [[package]] 2311 | name = "windows_i686_gnu" 2312 | version = "0.48.5" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2315 | 2316 | [[package]] 2317 | name = "windows_i686_gnu" 2318 | version = "0.52.6" 2319 | source = "registry+https://github.com/rust-lang/crates.io-index" 2320 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2321 | 2322 | [[package]] 2323 | name = "windows_i686_gnullvm" 2324 | version = "0.52.6" 2325 | source = "registry+https://github.com/rust-lang/crates.io-index" 2326 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2327 | 2328 | [[package]] 2329 | name = "windows_i686_msvc" 2330 | version = "0.48.5" 2331 | source = "registry+https://github.com/rust-lang/crates.io-index" 2332 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2333 | 2334 | [[package]] 2335 | name = "windows_i686_msvc" 2336 | version = "0.52.6" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2339 | 2340 | [[package]] 2341 | name = "windows_x86_64_gnu" 2342 | version = "0.48.5" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2345 | 2346 | [[package]] 2347 | name = "windows_x86_64_gnu" 2348 | version = "0.52.6" 2349 | source = "registry+https://github.com/rust-lang/crates.io-index" 2350 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2351 | 2352 | [[package]] 2353 | name = "windows_x86_64_gnullvm" 2354 | version = "0.48.5" 2355 | source = "registry+https://github.com/rust-lang/crates.io-index" 2356 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2357 | 2358 | [[package]] 2359 | name = "windows_x86_64_gnullvm" 2360 | version = "0.52.6" 2361 | source = "registry+https://github.com/rust-lang/crates.io-index" 2362 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2363 | 2364 | [[package]] 2365 | name = "windows_x86_64_msvc" 2366 | version = "0.48.5" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2369 | 2370 | [[package]] 2371 | name = "windows_x86_64_msvc" 2372 | version = "0.52.6" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2375 | 2376 | [[package]] 2377 | name = "zerocopy" 2378 | version = "0.7.35" 2379 | source = "registry+https://github.com/rust-lang/crates.io-index" 2380 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2381 | dependencies = [ 2382 | "byteorder", 2383 | "zerocopy-derive", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "zerocopy-derive" 2388 | version = "0.7.35" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2391 | dependencies = [ 2392 | "proc-macro2", 2393 | "quote", 2394 | "syn", 2395 | ] 2396 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nu_plugin_hashes" 3 | description = "A Nushell plugin that adds 63 cryptographic hash functions from Hashes project" 4 | keywords = ["nu", "plugin", "hash"] 5 | categories = ["algorithms"] 6 | repository = "https://github.com/ArmoredPony/nu_plugin_hashes" 7 | license = "MIT" 8 | version = "0.1.8" 9 | edition = "2021" 10 | 11 | [features] 12 | default = [ 13 | "ascon-hash", 14 | "belt-hash", 15 | "blake2", 16 | "blake3", 17 | "fsb", 18 | "gost94", 19 | "groestl", 20 | "jh", 21 | "md2", 22 | "md4", 23 | "ripemd", 24 | "sha1", 25 | "sha2", 26 | "sha3", 27 | "shabal", 28 | "skein", 29 | "sm3", 30 | "streebog", 31 | "tiger", 32 | "whirlpool", 33 | ] 34 | 35 | [dependencies] 36 | nu-cmd-base = "0.104.0" 37 | nu-plugin = "0.104.0" 38 | nu-protocol = "0.104.0" 39 | digest = "0.10.7" 40 | ascon-hash = { version = "0.2.0", optional = true } 41 | belt-hash = { version = "0.1.1", optional = true } 42 | blake2 = { version = "0.10.6", optional = true } 43 | blake3 = { version = "1.6.1", optional = true, default-features = false, features = [ 44 | "std", 45 | "traits-preview", 46 | ] } 47 | fsb = { version = "0.1.3", optional = true } 48 | gost94 = { version = "0.10.4", optional = true } 49 | groestl = { version = "0.10.1", optional = true } 50 | jh = { version = "0.1.0", optional = true } 51 | md2 = { version = "0.10.2", optional = true } 52 | md4 = { version = "0.10.2", optional = true } 53 | ripemd = { version = "0.1.3", optional = true } 54 | sha1 = { version = "0.10.6", optional = true } 55 | sha2 = { version = "0.10.8", optional = true } 56 | sha3 = { version = "0.10.8", optional = true } 57 | shabal = { version = "0.4.1", optional = true } 58 | skein = { version = "0.1.0", optional = true } 59 | sm3 = { version = "0.4.2", optional = true } 60 | streebog = { version = "0.10.2", optional = true } 61 | tiger = { version = "0.2.1", optional = true } 62 | whirlpool = { version = "0.10.4", optional = true } 63 | 64 | [build-dependencies] 65 | digest = "0.10.7" 66 | ascon-hash = { version = "0.2.0", optional = true } 67 | belt-hash = { version = "0.1.1", optional = true } 68 | blake2 = { version = "0.10.6", optional = true } 69 | blake3 = { version = "1.6.1", optional = true, default-features = false, features = [ 70 | "std", 71 | "traits-preview", 72 | ] } 73 | fsb = { version = "0.1.3", optional = true } 74 | gost94 = { version = "0.10.4", optional = true } 75 | groestl = { version = "0.10.1", optional = true } 76 | jh = { version = "0.1.0", optional = true } 77 | md2 = { version = "0.10.2", optional = true } 78 | md4 = { version = "0.10.2", optional = true } 79 | ripemd = { version = "0.1.3", optional = true } 80 | sha1 = { version = "0.10.6", optional = true } 81 | sha2 = { version = "0.10.8", optional = true } 82 | sha3 = { version = "0.10.8", optional = true } 83 | shabal = { version = "0.4.1", optional = true } 84 | skein = { version = "0.1.0", optional = true } 85 | sm3 = { version = "0.4.2", optional = true } 86 | streebog = { version = "0.10.2", optional = true } 87 | tiger = { version = "0.2.1", optional = true } 88 | whirlpool = { version = "0.10.4", optional = true } 89 | 90 | [dev-dependencies] 91 | nu-plugin-test-support = "0.104.0" 92 | 93 | [profile.release] 94 | strip = true 95 | lto = true 96 | codegen-units = 1 97 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2024 ArmoredPony 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hashes for Nushell 2 | 3 | A [Nushell](https://www.nushell.sh) plugin that adds a collection of **63** 4 | cryptographic hash functions from [Hashes](https://github.com/RustCrypto/hashes) 5 | project. 6 | 7 | This plugin's implementation is based on code stolen from the official Nushell 8 | repository and on compile-time code generation with a build script. 9 | 10 | Excess algorithms can be filtered off by selecting only specific features of the 11 | crate. 12 | 13 | ## Installation 14 | 15 | To install this plugin with all algorithms available run 16 | ```nu 17 | cargo install nu_plugin_hashes 18 | plugin add ($env.CARGO_HOME ++ /bin/nu_plugin_hashes) 19 | ``` 20 | 21 | or on Windows 22 | ```nu 23 | cargo install nu_plugin_hashes 24 | plugin add ($env.CARGO_HOME ++ /bin/nu_plugin_hashes.exe) 25 | ``` 26 | 27 | After loading the plugin, execute `help hash` to list newly added commands 28 | 29 | ```nu 30 | ~> help hash 31 | Apply hash function. 32 | 33 | ... 34 | 35 | Subcommands: 36 | hash ascon - Hash a value using the ascon hash algorithm. 37 | hash ascon-a - Hash a value using the ascon-a hash algorithm. 38 | hash belt - Hash a value using the belt hash algorithm. 39 | hash blake2b-512 - Hash a value using the blake2b-512 hash algorithm. 40 | hash blake2s-256 - Hash a value using the blake2s-256 hash algorithm. 41 | hash fsb160 - Hash a value using the fsb160 hash algorithm. 42 | hash fsb224 - Hash a value using the fsb224 hash algorithm. 43 | ... 44 | ``` 45 | 46 | ## Features 47 | 48 | If you only need some algorithms, disable default features and select only 49 | those you need 50 | ```nu 51 | cargo install nu_plugin_hashes --no-default-features --features sha2,streebog 52 | ``` 53 | 54 | Then check what's installed 55 | ```nu 56 | ~> help hash 57 | Apply hash function. 58 | 59 | ... 60 | 61 | Subcommands: 62 | hash md5 - Hash a value using the md5 hash algorithm. 63 | hash sha224 - Hash a value using the sha224 hash algorithm. 64 | hash sha256 - Hash a value using the sha256 hash algorithm. 65 | hash sha384 - Hash a value using the sha384 hash algorithm. 66 | hash sha512 - Hash a value using the sha512 hash algorithm. 67 | hash sha512-224 - Hash a value using the sha512-224 hash algorithm. 68 | hash sha512-256 - Hash a value using the sha512-256 hash algorithm. 69 | hash streebog256 - Hash a value using the streebog256 hash algorithm. 70 | hash streebog512 - Hash a value using the streebog512 hash algorithm. 71 | 72 | Flags: 73 | ... 74 | ``` 75 | 76 | ## Hashes 77 | 78 | The list of implemented algorithms provided by the plugin can be found 79 | in the Hashes project [repository](https://github.com/RustCrypto/hashes). 80 | 81 | Almost all algorithms from this project are included in this plugin. The 82 | exceptions are MD5 and SHA-256 as they are already present in Nushell, and 83 | those algorithms, that don't implement the `Digest` trait or require additional 84 | arguments for them to be run. 85 | 86 | If you want to import only particular algorithms, build this plugin with those 87 | features, which names correspond to the crates, that supply the algorithms you 88 | want. Consult this [table](https://github.com/RustCrypto/hashes?tab=readme-ov-file#supported-algorithms) 89 | to match features with required algorithms. 90 | 91 | If you disable the default features and forget to enable at least one of them, 92 | the plugin won't compile. 93 | 94 | ## Implemetation details 95 | 96 | All the functions are implemented via generic code that I borrowed from Nushell 97 | source file [generic_digest.rs](https://github.com/nushell/nushell/blob/0.101.0/crates/nu-command/src/hash/generic_digest.rs). 98 | Help page for each command is generated with a [build script](./build.rs). 99 | Hashes of the test text for each example are generated during compilation by 100 | this script: the test text is fed to each hashing algorithm, and resulting bytes 101 | are inserted into examples. This approach isdifferent from Nushell's 102 | implementations, where examples are hardcoded as strings. Then, generated 103 | examples are tested with [nu-plugin-test-support](https://crates.io/crates/nu-plugin-test-support) 104 | crate. This ensures that the code in examples always behaves exactly as printed. 105 | 106 | ## TODO 107 | 108 | Here is a list of things that could not be implemented with code generation 109 | as they don't implement the `Digest` trait or require additional arguments 110 | to be executed. I doubt that I will ever complete this list so you are welcome 111 | to contribute. 112 | 113 | - [ ] [blake2b] algorithm with runtime defined output size 114 | - [ ] [sha1] algorithm with collision detection 115 | 116 | ## License 117 | 118 | This crate is licensed under [MIT license](LICENSE). 119 | 120 | --- 121 |
I only created this plugin to explore compile-time code generation and 122 | educate myself on subject of features. The product of my activity terrifies 123 | me and I'm surprised it worked out at all.
124 | 125 | [blake2b]: https://github.com/RustCrypto/hashes/blob/1dbb9535207176fceb93a8ec1d450712714aedec/blake2/src/lib.rs#L67 126 | [sha1]: https://github.com/RustCrypto/hashes/tree/master/sha1-checked 127 | -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | use digest::DynDigest; 2 | 3 | const TEST_TEXT: &str = "abcdefghijklmnopqrstuvwxyz"; 4 | 5 | struct GeneratedHasherImplMeta { 6 | crate_name: &'static str, 7 | hasher_type_name: &'static str, 8 | hasher_command: &'static str, 9 | hasher: Box, 10 | } 11 | 12 | #[cfg(any( 13 | feature = "ascon-hash", 14 | feature = "belt-hash", 15 | feature = "blake2", 16 | feature = "blake3", 17 | feature = "fsb", 18 | feature = "gost94", 19 | feature = "groestl", 20 | feature = "jh", 21 | feature = "md2", 22 | feature = "md4", 23 | feature = "ripemd", 24 | feature = "sha1", 25 | feature = "sha2", 26 | feature = "sha3", 27 | feature = "shabal", 28 | feature = "skein", 29 | feature = "sm3", 30 | feature = "streebog", 31 | feature = "tiger", 32 | feature = "whirlpool", 33 | ))] 34 | fn main() -> Result<(), Box> { 35 | use std::{env, io::Write, path::Path}; 36 | 37 | // MD5 and SHA256 are skipped on purpose 38 | let hasher_impls: Vec = vec![ 39 | #[cfg(feature = "ascon-hash")] 40 | GeneratedHasherImplMeta { 41 | crate_name: "ascon_hash", 42 | hasher_type_name: "AsconHash", 43 | hasher_command: "ascon", 44 | hasher: Box::new(ascon_hash::AsconHash::default()), 45 | }, 46 | #[cfg(feature = "ascon-hash")] 47 | GeneratedHasherImplMeta { 48 | crate_name: "ascon_hash", 49 | hasher_type_name: "AsconAHash", 50 | hasher_command: "ascon-a", 51 | hasher: Box::new(ascon_hash::AsconAHash::default()), 52 | }, 53 | #[cfg(feature = "belt-hash")] 54 | GeneratedHasherImplMeta { 55 | crate_name: "belt_hash", 56 | hasher_type_name: "BeltHash", 57 | hasher_command: "belt", 58 | hasher: Box::new(belt_hash::BeltHash::default()), 59 | }, 60 | #[cfg(feature = "blake2")] 61 | GeneratedHasherImplMeta { 62 | crate_name: "blake2", 63 | hasher_type_name: "Blake2s256", 64 | hasher_command: "blake2s-256", 65 | hasher: Box::new(blake2::Blake2s256::default()), 66 | }, 67 | #[cfg(feature = "blake2")] 68 | GeneratedHasherImplMeta { 69 | crate_name: "blake2", 70 | hasher_type_name: "Blake2b512", 71 | hasher_command: "blake2b-512", 72 | hasher: Box::new(blake2::Blake2b512::default()), 73 | }, 74 | #[cfg(feature = "blake3")] 75 | GeneratedHasherImplMeta { 76 | crate_name: "blake3", 77 | hasher_type_name: "Hasher", 78 | hasher_command: "blake3", 79 | hasher: Box::new(blake3::Hasher::new()), 80 | }, 81 | #[cfg(feature = "fsb")] 82 | GeneratedHasherImplMeta { 83 | crate_name: "fsb", 84 | hasher_type_name: "Fsb160", 85 | hasher_command: "fsb160", 86 | hasher: Box::new(fsb::Fsb160::default()), 87 | }, 88 | #[cfg(feature = "fsb")] 89 | GeneratedHasherImplMeta { 90 | crate_name: "fsb", 91 | hasher_type_name: "Fsb224", 92 | hasher_command: "fsb224", 93 | hasher: Box::new(fsb::Fsb224::default()), 94 | }, 95 | #[cfg(feature = "fsb")] 96 | GeneratedHasherImplMeta { 97 | crate_name: "fsb", 98 | hasher_type_name: "Fsb256", 99 | hasher_command: "fsb256", 100 | hasher: Box::new(fsb::Fsb256::default()), 101 | }, 102 | #[cfg(feature = "fsb")] 103 | GeneratedHasherImplMeta { 104 | crate_name: "fsb", 105 | hasher_type_name: "Fsb384", 106 | hasher_command: "fsb384", 107 | hasher: Box::new(fsb::Fsb384::default()), 108 | }, 109 | #[cfg(feature = "fsb")] 110 | GeneratedHasherImplMeta { 111 | crate_name: "fsb", 112 | hasher_type_name: "Fsb512", 113 | hasher_command: "fsb512", 114 | hasher: Box::new(fsb::Fsb512::default()), 115 | }, 116 | #[cfg(feature = "gost94")] 117 | GeneratedHasherImplMeta { 118 | crate_name: "gost94", 119 | hasher_type_name: "Gost94CryptoPro", 120 | hasher_command: "gost94-crypto-pro", 121 | hasher: Box::new(gost94::Gost94CryptoPro::default()), 122 | }, 123 | #[cfg(feature = "gost94")] 124 | GeneratedHasherImplMeta { 125 | crate_name: "gost94", 126 | hasher_type_name: "Gost94UA", 127 | hasher_command: "gost94-ua", 128 | hasher: Box::new(gost94::Gost94UA::default()), 129 | }, 130 | #[cfg(feature = "gost94")] 131 | GeneratedHasherImplMeta { 132 | crate_name: "gost94", 133 | hasher_type_name: "Gost94s2015", 134 | hasher_command: "gost94-2015", 135 | hasher: Box::new(gost94::Gost94s2015::default()), 136 | }, 137 | #[cfg(feature = "groestl")] 138 | GeneratedHasherImplMeta { 139 | crate_name: "groestl", 140 | hasher_type_name: "Groestl224", 141 | hasher_command: "groestl224", 142 | hasher: Box::new(groestl::Groestl224::default()), 143 | }, 144 | #[cfg(feature = "groestl")] 145 | GeneratedHasherImplMeta { 146 | crate_name: "groestl", 147 | hasher_type_name: "Groestl256", 148 | hasher_command: "groestl256", 149 | hasher: Box::new(groestl::Groestl256::default()), 150 | }, 151 | #[cfg(feature = "groestl")] 152 | GeneratedHasherImplMeta { 153 | crate_name: "groestl", 154 | hasher_type_name: "Groestl384", 155 | hasher_command: "groestl384", 156 | hasher: Box::new(groestl::Groestl384::default()), 157 | }, 158 | #[cfg(feature = "groestl")] 159 | GeneratedHasherImplMeta { 160 | crate_name: "groestl", 161 | hasher_type_name: "Groestl512", 162 | hasher_command: "groestl512", 163 | hasher: Box::new(groestl::Groestl512::default()), 164 | }, 165 | #[cfg(feature = "jh")] 166 | GeneratedHasherImplMeta { 167 | crate_name: "jh", 168 | hasher_type_name: "Jh224", 169 | hasher_command: "jh224", 170 | hasher: Box::new(jh::Jh224::default()), 171 | }, 172 | #[cfg(feature = "jh")] 173 | GeneratedHasherImplMeta { 174 | crate_name: "jh", 175 | hasher_type_name: "Jh256", 176 | hasher_command: "jh256", 177 | hasher: Box::new(jh::Jh256::default()), 178 | }, 179 | #[cfg(feature = "jh")] 180 | GeneratedHasherImplMeta { 181 | crate_name: "jh", 182 | hasher_type_name: "Jh384", 183 | hasher_command: "jh384", 184 | hasher: Box::new(jh::Jh384::default()), 185 | }, 186 | #[cfg(feature = "jh")] 187 | GeneratedHasherImplMeta { 188 | crate_name: "jh", 189 | hasher_type_name: "Jh512", 190 | hasher_command: "jh512", 191 | hasher: Box::new(jh::Jh512::default()), 192 | }, 193 | #[cfg(feature = "md2")] 194 | GeneratedHasherImplMeta { 195 | crate_name: "md2", 196 | hasher_type_name: "Md2", 197 | hasher_command: "md2", 198 | hasher: Box::new(md2::Md2::default()), 199 | }, 200 | #[cfg(feature = "md4")] 201 | GeneratedHasherImplMeta { 202 | crate_name: "md4", 203 | hasher_type_name: "Md4", 204 | hasher_command: "md4", 205 | hasher: Box::new(md4::Md4::default()), 206 | }, 207 | #[cfg(feature = "ripemd")] 208 | GeneratedHasherImplMeta { 209 | crate_name: "ripemd", 210 | hasher_type_name: "Ripemd128", 211 | hasher_command: "ripemd128", 212 | hasher: Box::new(ripemd::Ripemd128::default()), 213 | }, 214 | #[cfg(feature = "ripemd")] 215 | GeneratedHasherImplMeta { 216 | crate_name: "ripemd", 217 | hasher_type_name: "Ripemd160", 218 | hasher_command: "ripemd160", 219 | hasher: Box::new(ripemd::Ripemd160::default()), 220 | }, 221 | #[cfg(feature = "ripemd")] 222 | GeneratedHasherImplMeta { 223 | crate_name: "ripemd", 224 | hasher_type_name: "Ripemd256", 225 | hasher_command: "ripemd256", 226 | hasher: Box::new(ripemd::Ripemd256::default()), 227 | }, 228 | #[cfg(feature = "ripemd")] 229 | GeneratedHasherImplMeta { 230 | crate_name: "ripemd", 231 | hasher_type_name: "Ripemd320", 232 | hasher_command: "ripemd320", 233 | hasher: Box::new(ripemd::Ripemd320::default()), 234 | }, 235 | #[cfg(feature = "sha1")] 236 | GeneratedHasherImplMeta { 237 | crate_name: "sha1", 238 | hasher_type_name: "Sha1", 239 | hasher_command: "sha1", 240 | hasher: Box::new(sha1::Sha1::default()), 241 | }, 242 | #[cfg(feature = "sha2")] 243 | GeneratedHasherImplMeta { 244 | crate_name: "sha2", 245 | hasher_type_name: "Sha224", 246 | hasher_command: "sha224", 247 | hasher: Box::new(sha2::Sha224::default()), 248 | }, 249 | #[cfg(feature = "sha2")] 250 | GeneratedHasherImplMeta { 251 | crate_name: "sha2", 252 | hasher_type_name: "Sha384", 253 | hasher_command: "sha384", 254 | hasher: Box::new(sha2::Sha384::default()), 255 | }, 256 | #[cfg(feature = "sha2")] 257 | GeneratedHasherImplMeta { 258 | crate_name: "sha2", 259 | hasher_type_name: "Sha512", 260 | hasher_command: "sha512", 261 | hasher: Box::new(sha2::Sha512::default()), 262 | }, 263 | #[cfg(feature = "sha2")] 264 | GeneratedHasherImplMeta { 265 | crate_name: "sha2", 266 | hasher_type_name: "Sha512_224", 267 | hasher_command: "sha512-224", 268 | hasher: Box::new(sha2::Sha512_224::default()), 269 | }, 270 | #[cfg(feature = "sha2")] 271 | GeneratedHasherImplMeta { 272 | crate_name: "sha2", 273 | hasher_type_name: "Sha512_256", 274 | hasher_command: "sha512-256", 275 | hasher: Box::new(sha2::Sha512_256::default()), 276 | }, 277 | #[cfg(feature = "sha3")] 278 | GeneratedHasherImplMeta { 279 | crate_name: "sha3", 280 | hasher_type_name: "Sha3_224", 281 | hasher_command: "sha3-224", 282 | hasher: Box::new(sha3::Sha3_224::default()), 283 | }, 284 | #[cfg(feature = "sha3")] 285 | GeneratedHasherImplMeta { 286 | crate_name: "sha3", 287 | hasher_type_name: "Sha3_256", 288 | hasher_command: "sha3-256", 289 | hasher: Box::new(sha3::Sha3_256::default()), 290 | }, 291 | #[cfg(feature = "sha3")] 292 | GeneratedHasherImplMeta { 293 | crate_name: "sha3", 294 | hasher_type_name: "Sha3_384", 295 | hasher_command: "sha3-384", 296 | hasher: Box::new(sha3::Sha3_384::default()), 297 | }, 298 | #[cfg(feature = "sha3")] 299 | GeneratedHasherImplMeta { 300 | crate_name: "sha3", 301 | hasher_type_name: "Sha3_512", 302 | hasher_command: "sha3-512", 303 | hasher: Box::new(sha3::Sha3_512::default()), 304 | }, 305 | #[cfg(feature = "sha3")] 306 | GeneratedHasherImplMeta { 307 | crate_name: "sha3", 308 | hasher_type_name: "Keccak224", 309 | hasher_command: "keccak224", 310 | hasher: Box::new(sha3::Keccak224::default()), 311 | }, 312 | #[cfg(feature = "sha3")] 313 | GeneratedHasherImplMeta { 314 | crate_name: "sha3", 315 | hasher_type_name: "Keccak256", 316 | hasher_command: "keccak256", 317 | hasher: Box::new(sha3::Keccak256::default()), 318 | }, 319 | #[cfg(feature = "sha3")] 320 | GeneratedHasherImplMeta { 321 | crate_name: "sha3", 322 | hasher_type_name: "Keccak384", 323 | hasher_command: "keccak384", 324 | hasher: Box::new(sha3::Keccak384::default()), 325 | }, 326 | #[cfg(feature = "sha3")] 327 | GeneratedHasherImplMeta { 328 | crate_name: "sha3", 329 | hasher_type_name: "Keccak512", 330 | hasher_command: "keccak512", 331 | hasher: Box::new(sha3::Keccak512::default()), 332 | }, 333 | #[cfg(feature = "shabal")] 334 | GeneratedHasherImplMeta { 335 | crate_name: "shabal", 336 | hasher_type_name: "Shabal192", 337 | hasher_command: "shabal192", 338 | hasher: Box::new(shabal::Shabal192::default()), 339 | }, 340 | #[cfg(feature = "shabal")] 341 | GeneratedHasherImplMeta { 342 | crate_name: "shabal", 343 | hasher_type_name: "Shabal224", 344 | hasher_command: "shabal224", 345 | hasher: Box::new(shabal::Shabal224::default()), 346 | }, 347 | #[cfg(feature = "shabal")] 348 | GeneratedHasherImplMeta { 349 | crate_name: "shabal", 350 | hasher_type_name: "Shabal256", 351 | hasher_command: "shabal256", 352 | hasher: Box::new(shabal::Shabal256::default()), 353 | }, 354 | #[cfg(feature = "shabal")] 355 | GeneratedHasherImplMeta { 356 | crate_name: "shabal", 357 | hasher_type_name: "Shabal384", 358 | hasher_command: "shabal384", 359 | hasher: Box::new(shabal::Shabal384::default()), 360 | }, 361 | #[cfg(feature = "shabal")] 362 | GeneratedHasherImplMeta { 363 | crate_name: "shabal", 364 | hasher_type_name: "Shabal512", 365 | hasher_command: "shabal512", 366 | hasher: Box::new(shabal::Shabal512::default()), 367 | }, 368 | #[cfg(feature = "skein")] 369 | GeneratedHasherImplMeta { 370 | crate_name: "skein", 371 | hasher_type_name: "Skein256::", 372 | hasher_command: "skein256-32", 373 | hasher: Box::new(skein::Skein256::::default()), 374 | }, 375 | #[cfg(feature = "skein")] 376 | GeneratedHasherImplMeta { 377 | crate_name: "skein", 378 | hasher_type_name: "Skein256::", 379 | hasher_command: "skein256-64", 380 | hasher: Box::new(skein::Skein256::::default()), 381 | }, 382 | #[cfg(feature = "skein")] 383 | GeneratedHasherImplMeta { 384 | crate_name: "skein", 385 | hasher_type_name: "Skein256::", 386 | hasher_command: "skein256-128", 387 | hasher: Box::new(skein::Skein256::::default()), 388 | }, 389 | #[cfg(feature = "skein")] 390 | GeneratedHasherImplMeta { 391 | crate_name: "skein", 392 | hasher_type_name: "Skein512::", 393 | hasher_command: "skein512-32", 394 | hasher: Box::new(skein::Skein512::::default()), 395 | }, 396 | #[cfg(feature = "skein")] 397 | GeneratedHasherImplMeta { 398 | crate_name: "skein", 399 | hasher_type_name: "Skein512::", 400 | hasher_command: "skein512-64", 401 | hasher: Box::new(skein::Skein512::::default()), 402 | }, 403 | #[cfg(feature = "skein")] 404 | GeneratedHasherImplMeta { 405 | crate_name: "skein", 406 | hasher_type_name: "Skein512::", 407 | hasher_command: "skein512-128", 408 | hasher: Box::new(skein::Skein512::::default()), 409 | }, 410 | #[cfg(feature = "skein")] 411 | GeneratedHasherImplMeta { 412 | crate_name: "skein", 413 | hasher_type_name: "Skein1024::", 414 | hasher_command: "skein1024-32", 415 | hasher: Box::new(skein::Skein1024::::default()), 416 | }, 417 | #[cfg(feature = "skein")] 418 | GeneratedHasherImplMeta { 419 | crate_name: "skein", 420 | hasher_type_name: "Skein1024::", 421 | hasher_command: "skein1024-64", 422 | hasher: Box::new(skein::Skein1024::::default()), 423 | }, 424 | #[cfg(feature = "skein")] 425 | GeneratedHasherImplMeta { 426 | crate_name: "skein", 427 | hasher_type_name: "Skein1024::", 428 | hasher_command: "skein1024-128", 429 | hasher: Box::new(skein::Skein1024::::default()), 430 | }, 431 | #[cfg(feature = "sm3")] 432 | GeneratedHasherImplMeta { 433 | crate_name: "sm3", 434 | hasher_type_name: "Sm3", 435 | hasher_command: "sm3", 436 | hasher: Box::new(sm3::Sm3::default()), 437 | }, 438 | #[cfg(feature = "streebog")] 439 | GeneratedHasherImplMeta { 440 | crate_name: "streebog", 441 | hasher_type_name: "Streebog256", 442 | hasher_command: "streebog256", 443 | hasher: Box::new(streebog::Streebog256::default()), 444 | }, 445 | #[cfg(feature = "streebog")] 446 | GeneratedHasherImplMeta { 447 | crate_name: "streebog", 448 | hasher_type_name: "Streebog512", 449 | hasher_command: "streebog512", 450 | hasher: Box::new(streebog::Streebog512::default()), 451 | }, 452 | #[cfg(feature = "tiger")] 453 | GeneratedHasherImplMeta { 454 | crate_name: "tiger", 455 | hasher_type_name: "Tiger", 456 | hasher_command: "tiger", 457 | hasher: Box::new(tiger::Tiger::default()), 458 | }, 459 | #[cfg(feature = "tiger")] 460 | GeneratedHasherImplMeta { 461 | crate_name: "tiger", 462 | hasher_type_name: "Tiger2", 463 | hasher_command: "tiger2", 464 | hasher: Box::new(tiger::Tiger2::default()), 465 | }, 466 | #[cfg(feature = "whirlpool")] 467 | GeneratedHasherImplMeta { 468 | crate_name: "whirlpool", 469 | hasher_type_name: "Whirlpool", 470 | hasher_command: "whirlpool", 471 | hasher: Box::new(whirlpool::Whirlpool::default()), 472 | }, 473 | ]; 474 | 475 | let out_dir = env::var_os("OUT_DIR").unwrap(); 476 | let hashers_generated_path = Path::new(&out_dir).join("hashers_generated.rs"); 477 | let commands_generated_path = 478 | Path::new(&out_dir).join("commands_generated.rs"); 479 | let mut hashers_generated_file = 480 | std::fs::File::create(hashers_generated_path).unwrap(); 481 | let mut commands_generated_file = 482 | std::fs::File::create(commands_generated_path).unwrap(); 483 | 484 | write!( 485 | hashers_generated_file, 486 | "use nu_protocol::{{Example, Span, Value, ShellError}}; 487 | use nu_plugin::PluginCommand; 488 | use crate::HashesPlugin; 489 | use crate::hasher::{{Hasher, GenericHasher}}; 490 | " 491 | )?; 492 | 493 | write!( 494 | commands_generated_file, 495 | "use nu_plugin::PluginCommand; 496 | use crate::{{HashesPlugin, hasher::GenericHasher}}; 497 | 498 | pub fn commands() -> Vec>> {{ 499 | vec![ 500 | " 501 | )?; 502 | 503 | for mut hasher_impl_meta in hasher_impls { 504 | let feature_name = 505 | hasher_impl_meta.crate_name.replace("-", "_").to_uppercase(); 506 | if std::env::var(format!("CARGO_FEATURE_{feature_name}")).is_ok() { 507 | hashers_generated_file 508 | .write_all(build_impl_str(&mut hasher_impl_meta).as_bytes())?; 509 | hashers_generated_file 510 | .write_all(build_test_str(&hasher_impl_meta).as_bytes())?; 511 | 512 | let crate_name = hasher_impl_meta.crate_name; 513 | let hasher_type_name = hasher_impl_meta.hasher_type_name; 514 | writeln!( 515 | commands_generated_file, 516 | " Box::new(GenericHasher::<{crate_name}::{hasher_type_name}>::default())," 517 | )?; 518 | } 519 | } 520 | 521 | write!( 522 | commands_generated_file, 523 | " ] 524 | }}" 525 | )?; 526 | 527 | hashers_generated_file.flush()?; 528 | commands_generated_file.flush()?; 529 | 530 | Ok(()) 531 | } 532 | 533 | #[cfg(any( 534 | feature = "ascon-hash", 535 | feature = "belt-hash", 536 | feature = "blake2", 537 | feature = "blake3", 538 | feature = "fsb", 539 | feature = "gost94", 540 | feature = "groestl", 541 | feature = "jh", 542 | feature = "md2", 543 | feature = "md4", 544 | feature = "ripemd", 545 | feature = "sha1", 546 | feature = "sha2", 547 | feature = "sha3", 548 | feature = "shabal", 549 | feature = "skein", 550 | feature = "sm3", 551 | feature = "streebog", 552 | feature = "tiger", 553 | feature = "whirlpool", 554 | ))] 555 | fn build_impl_str(meta: &mut GeneratedHasherImplMeta) -> String { 556 | let crate_name = meta.crate_name; 557 | let hasher_type_name = meta.hasher_type_name; 558 | let command = meta.hasher_command; 559 | let mut hasher = meta.hasher.clone(); 560 | hasher.update(TEST_TEXT.as_bytes()); 561 | let hash = hasher.clone().finalize(); 562 | format!( 563 | " 564 | impl Hasher for {crate_name}::{hasher_type_name} {{ 565 | fn name() -> &'static str {{ 566 | \"{command}\" 567 | }} 568 | 569 | fn examples() -> Vec> {{ 570 | vec![ 571 | Example {{ 572 | description: \"Return the {command} hash of a string, hex-encoded\", 573 | example: \"'{TEST_TEXT}' | hash {command}\", 574 | result: Some(Value::string( 575 | \"{}\".to_owned(), 576 | Span::test_data(), 577 | )), 578 | }}, 579 | Example {{ 580 | description: \"Return the {command} hash of a string, as binary\", 581 | example: \"'{TEST_TEXT}' | hash {command} --binary\", 582 | result: Some(Value::binary( 583 | vec![{}], 584 | Span::test_data(), 585 | )), 586 | }}, 587 | Example {{ 588 | description: \"Return the {command} hash of a file's contents\", 589 | example: \"open ./nu_0_24_1_windows.zip | hash {command}\", 590 | result: None, 591 | }}, 592 | ] 593 | }} 594 | }} 595 | ", 596 | hash 597 | .iter() 598 | .map(|b| format!("{b:02x?}")) 599 | .collect::>() 600 | .join(""), 601 | hash 602 | .iter() 603 | .map(|b| format!("0x{b:02x?}")) 604 | .collect::>() 605 | .join(",") 606 | ) 607 | } 608 | 609 | #[cfg(any( 610 | feature = "ascon-hash", 611 | feature = "belt-hash", 612 | feature = "blake2", 613 | feature = "blake3", 614 | feature = "fsb", 615 | feature = "gost94", 616 | feature = "groestl", 617 | feature = "jh", 618 | feature = "md2", 619 | feature = "md4", 620 | feature = "ripemd", 621 | feature = "sha1", 622 | feature = "sha2", 623 | feature = "sha3", 624 | feature = "shabal", 625 | feature = "skein", 626 | feature = "sm3", 627 | feature = "streebog", 628 | feature = "tiger", 629 | feature = "whirlpool", 630 | ))] 631 | fn build_test_str(meta: &GeneratedHasherImplMeta) -> String { 632 | let crate_name = meta.crate_name; 633 | let hasher_type_name = meta.hasher_type_name; 634 | let command = meta.hasher_command; 635 | let test_name = command.replace("-", "_"); 636 | format!( 637 | " 638 | #[test] 639 | fn test_{test_name}_examples() -> Result<(), ShellError> {{ 640 | nu_plugin_test_support::PluginTest::new 641 | ( 642 | \"hash {command}\", 643 | HashesPlugin.into() 644 | )? 645 | .test_examples(&GenericHasher::<{crate_name}::{hasher_type_name}>::default().examples()) 646 | }} 647 | " 648 | ) 649 | } 650 | 651 | #[cfg(not(any( 652 | feature = "ascon-hash", 653 | feature = "belt-hash", 654 | feature = "blake2", 655 | feature = "blake3", 656 | feature = "fsb", 657 | feature = "gost94", 658 | feature = "groestl", 659 | feature = "jh", 660 | feature = "md2", 661 | feature = "md4", 662 | feature = "ripemd", 663 | feature = "sha1", 664 | feature = "sha2", 665 | feature = "sha3", 666 | feature = "shabal", 667 | feature = "skein", 668 | feature = "sm3", 669 | feature = "streebog", 670 | feature = "tiger", 671 | feature = "whirlpool", 672 | )))] 673 | fn main() { 674 | compile_error!("enable at least one feature to compile this plugin"); 675 | } 676 | -------------------------------------------------------------------------------- /src/commands_generated.rs: -------------------------------------------------------------------------------- 1 | include!(concat!(env!("OUT_DIR"), "/commands_generated.rs")); 2 | -------------------------------------------------------------------------------- /src/hasher.rs: -------------------------------------------------------------------------------- 1 | //! Contains a generic trait for hashers that implement `Digest`. 2 | //! This implementation is stolen with minimal changes from *generic_digest.rs* 3 | //! source code file of nushell v0.101.0 which can be found at 4 | //! https://github.com/nushell/nushell/blob/0.101.0/crates/nu-command/src/hash/generic_digest.rs 5 | //! The *hash* module is private, so I had no choice. 6 | 7 | use std::{io::Write, marker::PhantomData, ops::Not}; 8 | 9 | use digest::{Digest, Output}; 10 | use nu_cmd_base::input_handler::{operate, CmdArgument}; 11 | use nu_plugin::{EngineInterface, EvaluatedCall, PluginCommand}; 12 | use nu_protocol::{ 13 | ast::CellPath, 14 | Category, 15 | Example, 16 | IntoPipelineData, 17 | LabeledError, 18 | PipelineData, 19 | ShellError, 20 | Signature, 21 | Span, 22 | SyntaxShape, 23 | Type, 24 | Value, 25 | }; 26 | 27 | use crate::HashesPlugin; 28 | 29 | pub trait Hasher: Digest + Clone { 30 | fn name() -> &'static str; 31 | fn examples() -> Vec>; 32 | } 33 | 34 | #[derive(Clone)] 35 | pub struct GenericHasher { 36 | name: String, 37 | description: String, 38 | _hasher: PhantomData, 39 | } 40 | 41 | impl Default for GenericHasher { 42 | fn default() -> Self { 43 | Self { 44 | name: format!("hash {}", H::name()), 45 | description: format!( 46 | "Hash a value using the {} hash algorithm.", 47 | H::name() 48 | ), 49 | _hasher: PhantomData, 50 | } 51 | } 52 | } 53 | 54 | struct Arguments { 55 | cell_paths: Option>, 56 | binary: bool, 57 | } 58 | 59 | impl CmdArgument for Arguments { 60 | fn take_cell_paths(&mut self) -> Option> { 61 | self.cell_paths.take() 62 | } 63 | } 64 | 65 | impl PluginCommand for GenericHasher 66 | where 67 | H: Hasher + Write + Send + Sync + 'static, 68 | Output: core::fmt::LowerHex, 69 | { 70 | type Plugin = HashesPlugin; 71 | 72 | fn name(&self) -> &str { 73 | &self.name 74 | } 75 | 76 | fn signature(&self) -> Signature { 77 | Signature::build(self.name()) 78 | .category(Category::Hash) 79 | .input_output_types(vec![ 80 | (Type::Binary, Type::Any), 81 | (Type::String, Type::Any), 82 | (Type::table(), Type::table()), 83 | (Type::record(), Type::record()), 84 | ]) 85 | .allow_variants_without_examples(true) 86 | .switch( 87 | "binary", 88 | "Output binary instead of hexadecimal representation", 89 | Some('b'), 90 | ) 91 | .rest( 92 | "rest", 93 | SyntaxShape::CellPath, 94 | format!("Optionally {} hash data by cell path.", H::name()), 95 | ) 96 | } 97 | 98 | fn description(&self) -> &str { 99 | &self.description 100 | } 101 | 102 | fn examples(&self) -> Vec { 103 | H::examples() 104 | } 105 | 106 | fn run( 107 | &self, 108 | _plugin: &HashesPlugin, 109 | engine: &EngineInterface, 110 | call: &EvaluatedCall, 111 | input: PipelineData, 112 | ) -> Result { 113 | let head = call.head; 114 | let binary = call.has_flag("binary")?; 115 | let cell_paths: Vec = call.rest(0)?; 116 | let cell_paths = cell_paths.is_empty().not().then_some(cell_paths); 117 | 118 | if let PipelineData::ByteStream(stream, ..) = input { 119 | let mut hasher = H::new(); 120 | stream.write_to(&mut hasher)?; 121 | let digest = hasher.finalize(); 122 | if binary { 123 | Ok(Value::binary(digest.to_vec(), head).into_pipeline_data()) 124 | } else { 125 | Ok(Value::string(format!("{digest:x}"), head).into_pipeline_data()) 126 | } 127 | } else { 128 | operate( 129 | action::, 130 | Arguments { binary, cell_paths }, 131 | input, 132 | head, 133 | engine.signals(), 134 | ) 135 | .map_err(Into::into) 136 | } 137 | } 138 | } 139 | 140 | fn action(input: &Value, args: &Arguments, _span: Span) -> Value 141 | where 142 | H: Hasher, 143 | Output: core::fmt::LowerHex, 144 | { 145 | let span = input.span(); 146 | let (bytes, span) = match input { 147 | Value::String { val, .. } => (val.as_bytes(), span), 148 | Value::Binary { val, .. } => (val.as_slice(), span), 149 | // Propagate existing errors 150 | Value::Error { .. } => return input.clone(), 151 | other => { 152 | let span = input.span(); 153 | 154 | return Value::error( 155 | ShellError::OnlySupportsThisInputType { 156 | exp_input_type: "string or binary".into(), 157 | wrong_type: other.get_type().to_string(), 158 | dst_span: span, 159 | src_span: other.span(), 160 | }, 161 | span, 162 | ); 163 | } 164 | }; 165 | 166 | let digest = H::digest(bytes); 167 | 168 | if args.binary { 169 | Value::binary(digest.to_vec(), span) 170 | } else { 171 | Value::string(format!("{digest:x}"), span) 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /src/hashers_generated.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_imports)] 2 | include!(concat!(env!("OUT_DIR"), "/hashers_generated.rs")); 3 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod commands_generated; 2 | mod hasher; 3 | mod hashers_generated; 4 | 5 | use nu_plugin::Plugin; 6 | 7 | pub struct HashesPlugin; 8 | 9 | impl Plugin for HashesPlugin { 10 | fn version(&self) -> String { 11 | env!("CARGO_PKG_VERSION").into() 12 | } 13 | 14 | fn commands(&self) -> Vec>> { 15 | commands_generated::commands() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use nu_plugin::{serve_plugin, MsgPackSerializer}; 2 | use nu_plugin_hashes::HashesPlugin; 3 | 4 | fn main() { 5 | serve_plugin(&HashesPlugin, MsgPackSerializer); 6 | } 7 | --------------------------------------------------------------------------------