├── .gitignore ├── .lldbinit ├── .vscode └── launch.json ├── Cargo.lock ├── Cargo.toml ├── Readme.md ├── assets ├── crawler-screenshot.png └── styles.css ├── build.rs ├── src └── main.rs ├── templates ├── base.html ├── index.html └── list.html └── workflows └── crawler ├── Cargo.toml └── src └── lib.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.lldbinit: -------------------------------------------------------------------------------- 1 | settings set plugin.jit-loader.gdb.enable on -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "lldb", 9 | "request": "launch", 10 | "name": "Debug", 11 | "program": "flawless", 12 | "args": ["replay", ""], 13 | "cwd": "${workspaceFolder}", 14 | "initCommands": [ 15 | "command source ${workspaceFolder}/.lldbinit" 16 | ], 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.22.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "askama" 22 | version = "0.12.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" 25 | dependencies = [ 26 | "askama_derive", 27 | "askama_escape", 28 | "humansize", 29 | "num-traits", 30 | "percent-encoding", 31 | ] 32 | 33 | [[package]] 34 | name = "askama_derive" 35 | version = "0.12.5" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" 38 | dependencies = [ 39 | "askama_parser", 40 | "basic-toml", 41 | "mime", 42 | "mime_guess", 43 | "proc-macro2", 44 | "quote", 45 | "serde", 46 | "syn 2.0.72", 47 | ] 48 | 49 | [[package]] 50 | name = "askama_escape" 51 | version = "0.10.3" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" 54 | 55 | [[package]] 56 | name = "askama_parser" 57 | version = "0.2.1" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" 60 | dependencies = [ 61 | "nom", 62 | ] 63 | 64 | [[package]] 65 | name = "async-trait" 66 | version = "0.1.81" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" 69 | dependencies = [ 70 | "proc-macro2", 71 | "quote", 72 | "syn 2.0.72", 73 | ] 74 | 75 | [[package]] 76 | name = "atomic-waker" 77 | version = "1.1.2" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 80 | 81 | [[package]] 82 | name = "autocfg" 83 | version = "1.3.0" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 86 | 87 | [[package]] 88 | name = "axum" 89 | version = "0.7.5" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" 92 | dependencies = [ 93 | "async-trait", 94 | "axum-core", 95 | "bytes", 96 | "futures-util", 97 | "http", 98 | "http-body", 99 | "http-body-util", 100 | "hyper", 101 | "hyper-util", 102 | "itoa", 103 | "matchit", 104 | "memchr", 105 | "mime", 106 | "percent-encoding", 107 | "pin-project-lite", 108 | "rustversion", 109 | "serde", 110 | "serde_json", 111 | "serde_path_to_error", 112 | "serde_urlencoded", 113 | "sync_wrapper 1.0.1", 114 | "tokio", 115 | "tower", 116 | "tower-layer", 117 | "tower-service", 118 | "tracing", 119 | ] 120 | 121 | [[package]] 122 | name = "axum-core" 123 | version = "0.4.3" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" 126 | dependencies = [ 127 | "async-trait", 128 | "bytes", 129 | "futures-util", 130 | "http", 131 | "http-body", 132 | "http-body-util", 133 | "mime", 134 | "pin-project-lite", 135 | "rustversion", 136 | "sync_wrapper 0.1.2", 137 | "tower-layer", 138 | "tower-service", 139 | "tracing", 140 | ] 141 | 142 | [[package]] 143 | name = "backtrace" 144 | version = "0.3.73" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" 147 | dependencies = [ 148 | "addr2line", 149 | "cc", 150 | "cfg-if", 151 | "libc", 152 | "miniz_oxide", 153 | "object", 154 | "rustc-demangle", 155 | ] 156 | 157 | [[package]] 158 | name = "base64" 159 | version = "0.22.1" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 162 | 163 | [[package]] 164 | name = "basic-toml" 165 | version = "0.1.9" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" 168 | dependencies = [ 169 | "serde", 170 | ] 171 | 172 | [[package]] 173 | name = "bit-set" 174 | version = "0.5.3" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 177 | dependencies = [ 178 | "bit-vec", 179 | ] 180 | 181 | [[package]] 182 | name = "bit-vec" 183 | version = "0.6.3" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 186 | 187 | [[package]] 188 | name = "bitflags" 189 | version = "1.3.2" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 192 | 193 | [[package]] 194 | name = "bitflags" 195 | version = "2.6.0" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 198 | 199 | [[package]] 200 | name = "bumpalo" 201 | version = "3.16.0" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 204 | 205 | [[package]] 206 | name = "byteorder" 207 | version = "1.5.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 210 | 211 | [[package]] 212 | name = "bytes" 213 | version = "1.6.1" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" 216 | 217 | [[package]] 218 | name = "cc" 219 | version = "1.1.6" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" 222 | 223 | [[package]] 224 | name = "cfg-if" 225 | version = "1.0.0" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 228 | 229 | [[package]] 230 | name = "core-foundation" 231 | version = "0.9.4" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 234 | dependencies = [ 235 | "core-foundation-sys", 236 | "libc", 237 | ] 238 | 239 | [[package]] 240 | name = "core-foundation-sys" 241 | version = "0.8.6" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 244 | 245 | [[package]] 246 | name = "crawler" 247 | version = "0.1.2" 248 | dependencies = [ 249 | "flawless", 250 | "flawless-http", 251 | "log", 252 | "select", 253 | "serde", 254 | "serde_json", 255 | ] 256 | 257 | [[package]] 258 | name = "encoding_rs" 259 | version = "0.8.34" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 262 | dependencies = [ 263 | "cfg-if", 264 | ] 265 | 266 | [[package]] 267 | name = "equivalent" 268 | version = "1.0.1" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 271 | 272 | [[package]] 273 | name = "errno" 274 | version = "0.3.9" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 277 | dependencies = [ 278 | "libc", 279 | "windows-sys 0.52.0", 280 | ] 281 | 282 | [[package]] 283 | name = "fastrand" 284 | version = "2.1.0" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 287 | 288 | [[package]] 289 | name = "flawless" 290 | version = "1.0.0-beta.2" 291 | dependencies = [ 292 | "flawless-macros", 293 | "flawless-wasabi", 294 | "log", 295 | "serde", 296 | "serde_json", 297 | "thiserror", 298 | ] 299 | 300 | [[package]] 301 | name = "flawless-crawler" 302 | version = "0.1.0" 303 | dependencies = [ 304 | "askama", 305 | "axum", 306 | "crawler", 307 | "flawless-utils", 308 | "serde", 309 | "tokio", 310 | ] 311 | 312 | [[package]] 313 | name = "flawless-http" 314 | version = "1.0.0-beta.2" 315 | dependencies = [ 316 | "base64", 317 | "flawless", 318 | "flawless-wasabi", 319 | "form_urlencoded", 320 | "serde", 321 | "serde_json", 322 | ] 323 | 324 | [[package]] 325 | name = "flawless-macros" 326 | version = "1.0.0-beta.2" 327 | dependencies = [ 328 | "quote", 329 | "syn 2.0.72", 330 | ] 331 | 332 | [[package]] 333 | name = "flawless-utils" 334 | version = "1.0.0-beta.2" 335 | dependencies = [ 336 | "flawless", 337 | "reqwest", 338 | "serde", 339 | "serde_json", 340 | "toml", 341 | ] 342 | 343 | [[package]] 344 | name = "flawless-wasabi" 345 | version = "1.0.0-beta.2" 346 | dependencies = [ 347 | "serde", 348 | "serde_json", 349 | ] 350 | 351 | [[package]] 352 | name = "fnv" 353 | version = "1.0.7" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 356 | 357 | [[package]] 358 | name = "foreign-types" 359 | version = "0.3.2" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 362 | dependencies = [ 363 | "foreign-types-shared", 364 | ] 365 | 366 | [[package]] 367 | name = "foreign-types-shared" 368 | version = "0.1.1" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 371 | 372 | [[package]] 373 | name = "form_urlencoded" 374 | version = "1.2.1" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 377 | dependencies = [ 378 | "percent-encoding", 379 | ] 380 | 381 | [[package]] 382 | name = "futf" 383 | version = "0.1.5" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 386 | dependencies = [ 387 | "mac", 388 | "new_debug_unreachable", 389 | ] 390 | 391 | [[package]] 392 | name = "futures-channel" 393 | version = "0.3.30" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 396 | dependencies = [ 397 | "futures-core", 398 | ] 399 | 400 | [[package]] 401 | name = "futures-core" 402 | version = "0.3.30" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 405 | 406 | [[package]] 407 | name = "futures-sink" 408 | version = "0.3.30" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 411 | 412 | [[package]] 413 | name = "futures-task" 414 | version = "0.3.30" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 417 | 418 | [[package]] 419 | name = "futures-util" 420 | version = "0.3.30" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 423 | dependencies = [ 424 | "futures-core", 425 | "futures-task", 426 | "pin-project-lite", 427 | "pin-utils", 428 | ] 429 | 430 | [[package]] 431 | name = "getrandom" 432 | version = "0.2.15" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 435 | dependencies = [ 436 | "cfg-if", 437 | "libc", 438 | "wasi", 439 | ] 440 | 441 | [[package]] 442 | name = "gimli" 443 | version = "0.29.0" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" 446 | 447 | [[package]] 448 | name = "h2" 449 | version = "0.4.5" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" 452 | dependencies = [ 453 | "atomic-waker", 454 | "bytes", 455 | "fnv", 456 | "futures-core", 457 | "futures-sink", 458 | "http", 459 | "indexmap", 460 | "slab", 461 | "tokio", 462 | "tokio-util", 463 | "tracing", 464 | ] 465 | 466 | [[package]] 467 | name = "hashbrown" 468 | version = "0.14.5" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 471 | 472 | [[package]] 473 | name = "hermit-abi" 474 | version = "0.3.9" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 477 | 478 | [[package]] 479 | name = "html5ever" 480 | version = "0.26.0" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" 483 | dependencies = [ 484 | "log", 485 | "mac", 486 | "markup5ever", 487 | "proc-macro2", 488 | "quote", 489 | "syn 1.0.109", 490 | ] 491 | 492 | [[package]] 493 | name = "http" 494 | version = "1.1.0" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 497 | dependencies = [ 498 | "bytes", 499 | "fnv", 500 | "itoa", 501 | ] 502 | 503 | [[package]] 504 | name = "http-body" 505 | version = "1.0.1" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 508 | dependencies = [ 509 | "bytes", 510 | "http", 511 | ] 512 | 513 | [[package]] 514 | name = "http-body-util" 515 | version = "0.1.2" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 518 | dependencies = [ 519 | "bytes", 520 | "futures-util", 521 | "http", 522 | "http-body", 523 | "pin-project-lite", 524 | ] 525 | 526 | [[package]] 527 | name = "httparse" 528 | version = "1.9.4" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" 531 | 532 | [[package]] 533 | name = "httpdate" 534 | version = "1.0.3" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 537 | 538 | [[package]] 539 | name = "humansize" 540 | version = "2.1.3" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" 543 | dependencies = [ 544 | "libm", 545 | ] 546 | 547 | [[package]] 548 | name = "hyper" 549 | version = "1.4.1" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" 552 | dependencies = [ 553 | "bytes", 554 | "futures-channel", 555 | "futures-util", 556 | "h2", 557 | "http", 558 | "http-body", 559 | "httparse", 560 | "httpdate", 561 | "itoa", 562 | "pin-project-lite", 563 | "smallvec", 564 | "tokio", 565 | "want", 566 | ] 567 | 568 | [[package]] 569 | name = "hyper-rustls" 570 | version = "0.27.2" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" 573 | dependencies = [ 574 | "futures-util", 575 | "http", 576 | "hyper", 577 | "hyper-util", 578 | "rustls", 579 | "rustls-pki-types", 580 | "tokio", 581 | "tokio-rustls", 582 | "tower-service", 583 | ] 584 | 585 | [[package]] 586 | name = "hyper-tls" 587 | version = "0.6.0" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 590 | dependencies = [ 591 | "bytes", 592 | "http-body-util", 593 | "hyper", 594 | "hyper-util", 595 | "native-tls", 596 | "tokio", 597 | "tokio-native-tls", 598 | "tower-service", 599 | ] 600 | 601 | [[package]] 602 | name = "hyper-util" 603 | version = "0.1.6" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" 606 | dependencies = [ 607 | "bytes", 608 | "futures-channel", 609 | "futures-util", 610 | "http", 611 | "http-body", 612 | "hyper", 613 | "pin-project-lite", 614 | "socket2", 615 | "tokio", 616 | "tower", 617 | "tower-service", 618 | "tracing", 619 | ] 620 | 621 | [[package]] 622 | name = "idna" 623 | version = "0.5.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 626 | dependencies = [ 627 | "unicode-bidi", 628 | "unicode-normalization", 629 | ] 630 | 631 | [[package]] 632 | name = "indexmap" 633 | version = "2.2.6" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 636 | dependencies = [ 637 | "equivalent", 638 | "hashbrown", 639 | ] 640 | 641 | [[package]] 642 | name = "ipnet" 643 | version = "2.9.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 646 | 647 | [[package]] 648 | name = "itoa" 649 | version = "1.0.11" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 652 | 653 | [[package]] 654 | name = "js-sys" 655 | version = "0.3.69" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 658 | dependencies = [ 659 | "wasm-bindgen", 660 | ] 661 | 662 | [[package]] 663 | name = "libc" 664 | version = "0.2.155" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 667 | 668 | [[package]] 669 | name = "libm" 670 | version = "0.2.8" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 673 | 674 | [[package]] 675 | name = "linux-raw-sys" 676 | version = "0.4.14" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 679 | 680 | [[package]] 681 | name = "lock_api" 682 | version = "0.4.12" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 685 | dependencies = [ 686 | "autocfg", 687 | "scopeguard", 688 | ] 689 | 690 | [[package]] 691 | name = "log" 692 | version = "0.4.22" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 695 | 696 | [[package]] 697 | name = "mac" 698 | version = "0.1.1" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 701 | 702 | [[package]] 703 | name = "markup5ever" 704 | version = "0.11.0" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" 707 | dependencies = [ 708 | "log", 709 | "phf", 710 | "phf_codegen", 711 | "string_cache", 712 | "string_cache_codegen", 713 | "tendril", 714 | ] 715 | 716 | [[package]] 717 | name = "markup5ever_rcdom" 718 | version = "0.2.0" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "b9521dd6750f8e80ee6c53d65e2e4656d7de37064f3a7a5d2d11d05df93839c2" 721 | dependencies = [ 722 | "html5ever", 723 | "markup5ever", 724 | "tendril", 725 | "xml5ever", 726 | ] 727 | 728 | [[package]] 729 | name = "matchit" 730 | version = "0.7.3" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 733 | 734 | [[package]] 735 | name = "memchr" 736 | version = "2.7.4" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 739 | 740 | [[package]] 741 | name = "mime" 742 | version = "0.3.17" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 745 | 746 | [[package]] 747 | name = "mime_guess" 748 | version = "2.0.5" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 751 | dependencies = [ 752 | "mime", 753 | "unicase", 754 | ] 755 | 756 | [[package]] 757 | name = "minimal-lexical" 758 | version = "0.2.1" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 761 | 762 | [[package]] 763 | name = "miniz_oxide" 764 | version = "0.7.4" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 767 | dependencies = [ 768 | "adler", 769 | ] 770 | 771 | [[package]] 772 | name = "mio" 773 | version = "1.0.1" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" 776 | dependencies = [ 777 | "hermit-abi", 778 | "libc", 779 | "wasi", 780 | "windows-sys 0.52.0", 781 | ] 782 | 783 | [[package]] 784 | name = "native-tls" 785 | version = "0.2.12" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" 788 | dependencies = [ 789 | "libc", 790 | "log", 791 | "openssl", 792 | "openssl-probe", 793 | "openssl-sys", 794 | "schannel", 795 | "security-framework", 796 | "security-framework-sys", 797 | "tempfile", 798 | ] 799 | 800 | [[package]] 801 | name = "new_debug_unreachable" 802 | version = "1.0.6" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 805 | 806 | [[package]] 807 | name = "nom" 808 | version = "7.1.3" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 811 | dependencies = [ 812 | "memchr", 813 | "minimal-lexical", 814 | ] 815 | 816 | [[package]] 817 | name = "num-traits" 818 | version = "0.2.19" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 821 | dependencies = [ 822 | "autocfg", 823 | ] 824 | 825 | [[package]] 826 | name = "object" 827 | version = "0.36.2" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" 830 | dependencies = [ 831 | "memchr", 832 | ] 833 | 834 | [[package]] 835 | name = "once_cell" 836 | version = "1.19.0" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 839 | 840 | [[package]] 841 | name = "openssl" 842 | version = "0.10.66" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" 845 | dependencies = [ 846 | "bitflags 2.6.0", 847 | "cfg-if", 848 | "foreign-types", 849 | "libc", 850 | "once_cell", 851 | "openssl-macros", 852 | "openssl-sys", 853 | ] 854 | 855 | [[package]] 856 | name = "openssl-macros" 857 | version = "0.1.1" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 860 | dependencies = [ 861 | "proc-macro2", 862 | "quote", 863 | "syn 2.0.72", 864 | ] 865 | 866 | [[package]] 867 | name = "openssl-probe" 868 | version = "0.1.5" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 871 | 872 | [[package]] 873 | name = "openssl-sys" 874 | version = "0.9.103" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" 877 | dependencies = [ 878 | "cc", 879 | "libc", 880 | "pkg-config", 881 | "vcpkg", 882 | ] 883 | 884 | [[package]] 885 | name = "parking_lot" 886 | version = "0.12.3" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 889 | dependencies = [ 890 | "lock_api", 891 | "parking_lot_core", 892 | ] 893 | 894 | [[package]] 895 | name = "parking_lot_core" 896 | version = "0.9.10" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 899 | dependencies = [ 900 | "cfg-if", 901 | "libc", 902 | "redox_syscall", 903 | "smallvec", 904 | "windows-targets 0.52.6", 905 | ] 906 | 907 | [[package]] 908 | name = "percent-encoding" 909 | version = "2.3.1" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 912 | 913 | [[package]] 914 | name = "phf" 915 | version = "0.10.1" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 918 | dependencies = [ 919 | "phf_shared", 920 | ] 921 | 922 | [[package]] 923 | name = "phf_codegen" 924 | version = "0.10.0" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 927 | dependencies = [ 928 | "phf_generator", 929 | "phf_shared", 930 | ] 931 | 932 | [[package]] 933 | name = "phf_generator" 934 | version = "0.10.0" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 937 | dependencies = [ 938 | "phf_shared", 939 | "rand", 940 | ] 941 | 942 | [[package]] 943 | name = "phf_shared" 944 | version = "0.10.0" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 947 | dependencies = [ 948 | "siphasher", 949 | ] 950 | 951 | [[package]] 952 | name = "pin-project" 953 | version = "1.1.5" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 956 | dependencies = [ 957 | "pin-project-internal", 958 | ] 959 | 960 | [[package]] 961 | name = "pin-project-internal" 962 | version = "1.1.5" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 965 | dependencies = [ 966 | "proc-macro2", 967 | "quote", 968 | "syn 2.0.72", 969 | ] 970 | 971 | [[package]] 972 | name = "pin-project-lite" 973 | version = "0.2.14" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 976 | 977 | [[package]] 978 | name = "pin-utils" 979 | version = "0.1.0" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 982 | 983 | [[package]] 984 | name = "pkg-config" 985 | version = "0.3.30" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 988 | 989 | [[package]] 990 | name = "ppv-lite86" 991 | version = "0.2.18" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "dee4364d9f3b902ef14fab8a1ddffb783a1cb6b4bba3bfc1fa3922732c7de97f" 994 | dependencies = [ 995 | "zerocopy", 996 | ] 997 | 998 | [[package]] 999 | name = "precomputed-hash" 1000 | version = "0.1.1" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1003 | 1004 | [[package]] 1005 | name = "proc-macro2" 1006 | version = "1.0.86" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 1009 | dependencies = [ 1010 | "unicode-ident", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "quote" 1015 | version = "1.0.36" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1018 | dependencies = [ 1019 | "proc-macro2", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "rand" 1024 | version = "0.8.5" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1027 | dependencies = [ 1028 | "libc", 1029 | "rand_chacha", 1030 | "rand_core", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "rand_chacha" 1035 | version = "0.3.1" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1038 | dependencies = [ 1039 | "ppv-lite86", 1040 | "rand_core", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "rand_core" 1045 | version = "0.6.4" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1048 | dependencies = [ 1049 | "getrandom", 1050 | ] 1051 | 1052 | [[package]] 1053 | name = "redox_syscall" 1054 | version = "0.5.3" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" 1057 | dependencies = [ 1058 | "bitflags 2.6.0", 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "reqwest" 1063 | version = "0.12.5" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" 1066 | dependencies = [ 1067 | "base64", 1068 | "bytes", 1069 | "encoding_rs", 1070 | "futures-core", 1071 | "futures-util", 1072 | "h2", 1073 | "http", 1074 | "http-body", 1075 | "http-body-util", 1076 | "hyper", 1077 | "hyper-rustls", 1078 | "hyper-tls", 1079 | "hyper-util", 1080 | "ipnet", 1081 | "js-sys", 1082 | "log", 1083 | "mime", 1084 | "mime_guess", 1085 | "native-tls", 1086 | "once_cell", 1087 | "percent-encoding", 1088 | "pin-project-lite", 1089 | "rustls-pemfile", 1090 | "serde", 1091 | "serde_json", 1092 | "serde_urlencoded", 1093 | "sync_wrapper 1.0.1", 1094 | "system-configuration", 1095 | "tokio", 1096 | "tokio-native-tls", 1097 | "tower-service", 1098 | "url", 1099 | "wasm-bindgen", 1100 | "wasm-bindgen-futures", 1101 | "web-sys", 1102 | "winreg", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "ring" 1107 | version = "0.17.8" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1110 | dependencies = [ 1111 | "cc", 1112 | "cfg-if", 1113 | "getrandom", 1114 | "libc", 1115 | "spin", 1116 | "untrusted", 1117 | "windows-sys 0.52.0", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "rustc-demangle" 1122 | version = "0.1.24" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1125 | 1126 | [[package]] 1127 | name = "rustix" 1128 | version = "0.38.34" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 1131 | dependencies = [ 1132 | "bitflags 2.6.0", 1133 | "errno", 1134 | "libc", 1135 | "linux-raw-sys", 1136 | "windows-sys 0.52.0", 1137 | ] 1138 | 1139 | [[package]] 1140 | name = "rustls" 1141 | version = "0.23.12" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" 1144 | dependencies = [ 1145 | "once_cell", 1146 | "rustls-pki-types", 1147 | "rustls-webpki", 1148 | "subtle", 1149 | "zeroize", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "rustls-pemfile" 1154 | version = "2.1.2" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" 1157 | dependencies = [ 1158 | "base64", 1159 | "rustls-pki-types", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "rustls-pki-types" 1164 | version = "1.7.0" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" 1167 | 1168 | [[package]] 1169 | name = "rustls-webpki" 1170 | version = "0.102.6" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" 1173 | dependencies = [ 1174 | "ring", 1175 | "rustls-pki-types", 1176 | "untrusted", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "rustversion" 1181 | version = "1.0.17" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" 1184 | 1185 | [[package]] 1186 | name = "ryu" 1187 | version = "1.0.18" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1190 | 1191 | [[package]] 1192 | name = "schannel" 1193 | version = "0.1.23" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1196 | dependencies = [ 1197 | "windows-sys 0.52.0", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "scopeguard" 1202 | version = "1.2.0" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1205 | 1206 | [[package]] 1207 | name = "security-framework" 1208 | version = "2.11.1" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1211 | dependencies = [ 1212 | "bitflags 2.6.0", 1213 | "core-foundation", 1214 | "core-foundation-sys", 1215 | "libc", 1216 | "security-framework-sys", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "security-framework-sys" 1221 | version = "2.11.1" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" 1224 | dependencies = [ 1225 | "core-foundation-sys", 1226 | "libc", 1227 | ] 1228 | 1229 | [[package]] 1230 | name = "select" 1231 | version = "0.6.0" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "6f9da09dc3f4dfdb6374cbffff7a2cffcec316874d4429899eefdc97b3b94dcd" 1234 | dependencies = [ 1235 | "bit-set", 1236 | "html5ever", 1237 | "markup5ever_rcdom", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "serde" 1242 | version = "1.0.204" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" 1245 | dependencies = [ 1246 | "serde_derive", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "serde_derive" 1251 | version = "1.0.204" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" 1254 | dependencies = [ 1255 | "proc-macro2", 1256 | "quote", 1257 | "syn 2.0.72", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "serde_json" 1262 | version = "1.0.120" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" 1265 | dependencies = [ 1266 | "itoa", 1267 | "ryu", 1268 | "serde", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "serde_path_to_error" 1273 | version = "0.1.16" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 1276 | dependencies = [ 1277 | "itoa", 1278 | "serde", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "serde_spanned" 1283 | version = "0.6.7" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" 1286 | dependencies = [ 1287 | "serde", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "serde_urlencoded" 1292 | version = "0.7.1" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1295 | dependencies = [ 1296 | "form_urlencoded", 1297 | "itoa", 1298 | "ryu", 1299 | "serde", 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "signal-hook-registry" 1304 | version = "1.4.2" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1307 | dependencies = [ 1308 | "libc", 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "siphasher" 1313 | version = "0.3.11" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1316 | 1317 | [[package]] 1318 | name = "slab" 1319 | version = "0.4.9" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1322 | dependencies = [ 1323 | "autocfg", 1324 | ] 1325 | 1326 | [[package]] 1327 | name = "smallvec" 1328 | version = "1.13.2" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1331 | 1332 | [[package]] 1333 | name = "socket2" 1334 | version = "0.5.7" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1337 | dependencies = [ 1338 | "libc", 1339 | "windows-sys 0.52.0", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "spin" 1344 | version = "0.9.8" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1347 | 1348 | [[package]] 1349 | name = "string_cache" 1350 | version = "0.8.7" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 1353 | dependencies = [ 1354 | "new_debug_unreachable", 1355 | "once_cell", 1356 | "parking_lot", 1357 | "phf_shared", 1358 | "precomputed-hash", 1359 | "serde", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "string_cache_codegen" 1364 | version = "0.5.2" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 1367 | dependencies = [ 1368 | "phf_generator", 1369 | "phf_shared", 1370 | "proc-macro2", 1371 | "quote", 1372 | ] 1373 | 1374 | [[package]] 1375 | name = "subtle" 1376 | version = "2.6.1" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1379 | 1380 | [[package]] 1381 | name = "syn" 1382 | version = "1.0.109" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1385 | dependencies = [ 1386 | "proc-macro2", 1387 | "quote", 1388 | "unicode-ident", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "syn" 1393 | version = "2.0.72" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" 1396 | dependencies = [ 1397 | "proc-macro2", 1398 | "quote", 1399 | "unicode-ident", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "sync_wrapper" 1404 | version = "0.1.2" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1407 | 1408 | [[package]] 1409 | name = "sync_wrapper" 1410 | version = "1.0.1" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 1413 | 1414 | [[package]] 1415 | name = "system-configuration" 1416 | version = "0.5.1" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1419 | dependencies = [ 1420 | "bitflags 1.3.2", 1421 | "core-foundation", 1422 | "system-configuration-sys", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "system-configuration-sys" 1427 | version = "0.5.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1430 | dependencies = [ 1431 | "core-foundation-sys", 1432 | "libc", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "tempfile" 1437 | version = "3.10.1" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1440 | dependencies = [ 1441 | "cfg-if", 1442 | "fastrand", 1443 | "rustix", 1444 | "windows-sys 0.52.0", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "tendril" 1449 | version = "0.4.3" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 1452 | dependencies = [ 1453 | "futf", 1454 | "mac", 1455 | "utf-8", 1456 | ] 1457 | 1458 | [[package]] 1459 | name = "thiserror" 1460 | version = "1.0.63" 1461 | source = "registry+https://github.com/rust-lang/crates.io-index" 1462 | checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" 1463 | dependencies = [ 1464 | "thiserror-impl", 1465 | ] 1466 | 1467 | [[package]] 1468 | name = "thiserror-impl" 1469 | version = "1.0.63" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" 1472 | dependencies = [ 1473 | "proc-macro2", 1474 | "quote", 1475 | "syn 2.0.72", 1476 | ] 1477 | 1478 | [[package]] 1479 | name = "tinyvec" 1480 | version = "1.8.0" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 1483 | dependencies = [ 1484 | "tinyvec_macros", 1485 | ] 1486 | 1487 | [[package]] 1488 | name = "tinyvec_macros" 1489 | version = "0.1.1" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1492 | 1493 | [[package]] 1494 | name = "tokio" 1495 | version = "1.39.1" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" 1498 | dependencies = [ 1499 | "backtrace", 1500 | "bytes", 1501 | "libc", 1502 | "mio", 1503 | "parking_lot", 1504 | "pin-project-lite", 1505 | "signal-hook-registry", 1506 | "socket2", 1507 | "tokio-macros", 1508 | "windows-sys 0.52.0", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "tokio-macros" 1513 | version = "2.4.0" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" 1516 | dependencies = [ 1517 | "proc-macro2", 1518 | "quote", 1519 | "syn 2.0.72", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "tokio-native-tls" 1524 | version = "0.3.1" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1527 | dependencies = [ 1528 | "native-tls", 1529 | "tokio", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "tokio-rustls" 1534 | version = "0.26.0" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" 1537 | dependencies = [ 1538 | "rustls", 1539 | "rustls-pki-types", 1540 | "tokio", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "tokio-util" 1545 | version = "0.7.11" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" 1548 | dependencies = [ 1549 | "bytes", 1550 | "futures-core", 1551 | "futures-sink", 1552 | "pin-project-lite", 1553 | "tokio", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "toml" 1558 | version = "0.8.16" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c" 1561 | dependencies = [ 1562 | "serde", 1563 | "serde_spanned", 1564 | "toml_datetime", 1565 | "toml_edit", 1566 | ] 1567 | 1568 | [[package]] 1569 | name = "toml_datetime" 1570 | version = "0.6.7" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" 1573 | dependencies = [ 1574 | "serde", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "toml_edit" 1579 | version = "0.22.17" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" 1582 | dependencies = [ 1583 | "indexmap", 1584 | "serde", 1585 | "serde_spanned", 1586 | "toml_datetime", 1587 | "winnow", 1588 | ] 1589 | 1590 | [[package]] 1591 | name = "tower" 1592 | version = "0.4.13" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1595 | dependencies = [ 1596 | "futures-core", 1597 | "futures-util", 1598 | "pin-project", 1599 | "pin-project-lite", 1600 | "tokio", 1601 | "tower-layer", 1602 | "tower-service", 1603 | "tracing", 1604 | ] 1605 | 1606 | [[package]] 1607 | name = "tower-layer" 1608 | version = "0.3.2" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1611 | 1612 | [[package]] 1613 | name = "tower-service" 1614 | version = "0.3.2" 1615 | source = "registry+https://github.com/rust-lang/crates.io-index" 1616 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1617 | 1618 | [[package]] 1619 | name = "tracing" 1620 | version = "0.1.40" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1623 | dependencies = [ 1624 | "log", 1625 | "pin-project-lite", 1626 | "tracing-core", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "tracing-core" 1631 | version = "0.1.32" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1634 | dependencies = [ 1635 | "once_cell", 1636 | ] 1637 | 1638 | [[package]] 1639 | name = "try-lock" 1640 | version = "0.2.5" 1641 | source = "registry+https://github.com/rust-lang/crates.io-index" 1642 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1643 | 1644 | [[package]] 1645 | name = "unicase" 1646 | version = "2.7.0" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" 1649 | dependencies = [ 1650 | "version_check", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "unicode-bidi" 1655 | version = "0.3.15" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1658 | 1659 | [[package]] 1660 | name = "unicode-ident" 1661 | version = "1.0.12" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1664 | 1665 | [[package]] 1666 | name = "unicode-normalization" 1667 | version = "0.1.23" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1670 | dependencies = [ 1671 | "tinyvec", 1672 | ] 1673 | 1674 | [[package]] 1675 | name = "untrusted" 1676 | version = "0.9.0" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1679 | 1680 | [[package]] 1681 | name = "url" 1682 | version = "2.5.2" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 1685 | dependencies = [ 1686 | "form_urlencoded", 1687 | "idna", 1688 | "percent-encoding", 1689 | ] 1690 | 1691 | [[package]] 1692 | name = "utf-8" 1693 | version = "0.7.6" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1696 | 1697 | [[package]] 1698 | name = "vcpkg" 1699 | version = "0.2.15" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1702 | 1703 | [[package]] 1704 | name = "version_check" 1705 | version = "0.9.5" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1708 | 1709 | [[package]] 1710 | name = "want" 1711 | version = "0.3.1" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1714 | dependencies = [ 1715 | "try-lock", 1716 | ] 1717 | 1718 | [[package]] 1719 | name = "wasi" 1720 | version = "0.11.0+wasi-snapshot-preview1" 1721 | source = "registry+https://github.com/rust-lang/crates.io-index" 1722 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1723 | 1724 | [[package]] 1725 | name = "wasm-bindgen" 1726 | version = "0.2.92" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 1729 | dependencies = [ 1730 | "cfg-if", 1731 | "wasm-bindgen-macro", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "wasm-bindgen-backend" 1736 | version = "0.2.92" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 1739 | dependencies = [ 1740 | "bumpalo", 1741 | "log", 1742 | "once_cell", 1743 | "proc-macro2", 1744 | "quote", 1745 | "syn 2.0.72", 1746 | "wasm-bindgen-shared", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "wasm-bindgen-futures" 1751 | version = "0.4.42" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 1754 | dependencies = [ 1755 | "cfg-if", 1756 | "js-sys", 1757 | "wasm-bindgen", 1758 | "web-sys", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "wasm-bindgen-macro" 1763 | version = "0.2.92" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 1766 | dependencies = [ 1767 | "quote", 1768 | "wasm-bindgen-macro-support", 1769 | ] 1770 | 1771 | [[package]] 1772 | name = "wasm-bindgen-macro-support" 1773 | version = "0.2.92" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 1776 | dependencies = [ 1777 | "proc-macro2", 1778 | "quote", 1779 | "syn 2.0.72", 1780 | "wasm-bindgen-backend", 1781 | "wasm-bindgen-shared", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "wasm-bindgen-shared" 1786 | version = "0.2.92" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 1789 | 1790 | [[package]] 1791 | name = "web-sys" 1792 | version = "0.3.69" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 1795 | dependencies = [ 1796 | "js-sys", 1797 | "wasm-bindgen", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "windows-sys" 1802 | version = "0.48.0" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1805 | dependencies = [ 1806 | "windows-targets 0.48.5", 1807 | ] 1808 | 1809 | [[package]] 1810 | name = "windows-sys" 1811 | version = "0.52.0" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1814 | dependencies = [ 1815 | "windows-targets 0.52.6", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "windows-targets" 1820 | version = "0.48.5" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1823 | dependencies = [ 1824 | "windows_aarch64_gnullvm 0.48.5", 1825 | "windows_aarch64_msvc 0.48.5", 1826 | "windows_i686_gnu 0.48.5", 1827 | "windows_i686_msvc 0.48.5", 1828 | "windows_x86_64_gnu 0.48.5", 1829 | "windows_x86_64_gnullvm 0.48.5", 1830 | "windows_x86_64_msvc 0.48.5", 1831 | ] 1832 | 1833 | [[package]] 1834 | name = "windows-targets" 1835 | version = "0.52.6" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1838 | dependencies = [ 1839 | "windows_aarch64_gnullvm 0.52.6", 1840 | "windows_aarch64_msvc 0.52.6", 1841 | "windows_i686_gnu 0.52.6", 1842 | "windows_i686_gnullvm", 1843 | "windows_i686_msvc 0.52.6", 1844 | "windows_x86_64_gnu 0.52.6", 1845 | "windows_x86_64_gnullvm 0.52.6", 1846 | "windows_x86_64_msvc 0.52.6", 1847 | ] 1848 | 1849 | [[package]] 1850 | name = "windows_aarch64_gnullvm" 1851 | version = "0.48.5" 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" 1853 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1854 | 1855 | [[package]] 1856 | name = "windows_aarch64_gnullvm" 1857 | version = "0.52.6" 1858 | source = "registry+https://github.com/rust-lang/crates.io-index" 1859 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1860 | 1861 | [[package]] 1862 | name = "windows_aarch64_msvc" 1863 | version = "0.48.5" 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" 1865 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1866 | 1867 | [[package]] 1868 | name = "windows_aarch64_msvc" 1869 | version = "0.52.6" 1870 | source = "registry+https://github.com/rust-lang/crates.io-index" 1871 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1872 | 1873 | [[package]] 1874 | name = "windows_i686_gnu" 1875 | version = "0.48.5" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1878 | 1879 | [[package]] 1880 | name = "windows_i686_gnu" 1881 | version = "0.52.6" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1884 | 1885 | [[package]] 1886 | name = "windows_i686_gnullvm" 1887 | version = "0.52.6" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1890 | 1891 | [[package]] 1892 | name = "windows_i686_msvc" 1893 | version = "0.48.5" 1894 | source = "registry+https://github.com/rust-lang/crates.io-index" 1895 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1896 | 1897 | [[package]] 1898 | name = "windows_i686_msvc" 1899 | version = "0.52.6" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1902 | 1903 | [[package]] 1904 | name = "windows_x86_64_gnu" 1905 | version = "0.48.5" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1908 | 1909 | [[package]] 1910 | name = "windows_x86_64_gnu" 1911 | version = "0.52.6" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1914 | 1915 | [[package]] 1916 | name = "windows_x86_64_gnullvm" 1917 | version = "0.48.5" 1918 | source = "registry+https://github.com/rust-lang/crates.io-index" 1919 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1920 | 1921 | [[package]] 1922 | name = "windows_x86_64_gnullvm" 1923 | version = "0.52.6" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1926 | 1927 | [[package]] 1928 | name = "windows_x86_64_msvc" 1929 | version = "0.48.5" 1930 | source = "registry+https://github.com/rust-lang/crates.io-index" 1931 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1932 | 1933 | [[package]] 1934 | name = "windows_x86_64_msvc" 1935 | version = "0.52.6" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1938 | 1939 | [[package]] 1940 | name = "winnow" 1941 | version = "0.6.16" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" 1944 | dependencies = [ 1945 | "memchr", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "winreg" 1950 | version = "0.52.0" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 1953 | dependencies = [ 1954 | "cfg-if", 1955 | "windows-sys 0.48.0", 1956 | ] 1957 | 1958 | [[package]] 1959 | name = "xml5ever" 1960 | version = "0.17.0" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "4034e1d05af98b51ad7214527730626f019682d797ba38b51689212118d8e650" 1963 | dependencies = [ 1964 | "log", 1965 | "mac", 1966 | "markup5ever", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "zerocopy" 1971 | version = "0.6.6" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" 1974 | dependencies = [ 1975 | "byteorder", 1976 | "zerocopy-derive", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "zerocopy-derive" 1981 | version = "0.6.6" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" 1984 | dependencies = [ 1985 | "proc-macro2", 1986 | "quote", 1987 | "syn 2.0.72", 1988 | ] 1989 | 1990 | [[package]] 1991 | name = "zeroize" 1992 | version = "1.8.1" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 1995 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "flawless-crawler" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | crawler = { path = "workflows/crawler" } 8 | flawless-utils = "1.0.0-beta.3" 9 | tokio = { version = "1", features = ["full"] } 10 | axum = "0.7" 11 | askama = "0.12" 12 | serde = { version = "1", features = ["derive"] } 13 | 14 | [build-dependencies] 15 | flawless-utils = "1.0.0-beta.3" 16 | 17 | [workspace] 18 | members = ["workflows/crawler"] 19 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | This is an example project that shows how to integrate flawless workflows into native 2 | Rust projects, following the guidelines at https://flawless.dev/docs/integration-with-rust/. 3 | 4 | It's a web crawler where the web UI is implemented using [Axum](https://github.com/tokio-rs/axum) 5 | and [HTMX](https://htmx.org), but the crawling is implemented as a workflow in the 6 | `workflows/crawler/src/lib.rs` file. 7 | 8 | ### Screenshot 9 | 10 | ![Screenshot of the crawler web page](assets/crawler-screenshot.png) -------------------------------------------------------------------------------- /assets/crawler-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flawless-org/example-flawless-web-crawler/3f5986347e36ba28921cec11c2cc50c873e81979/assets/crawler-screenshot.png -------------------------------------------------------------------------------- /assets/styles.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'SF Monog Regular'; 3 | src: url('https://flawless.dev/fonts/sf-mono-regular.woff2'), 4 | } 5 | 6 | html { 7 | overflow-y: scroll; 8 | } 9 | 10 | a { 11 | color: black; 12 | } 13 | 14 | .highlight { 15 | background-color: antiquewhite; 16 | } 17 | 18 | main { 19 | max-width: 42.5rem; 20 | margin: auto; 21 | margin-bottom: 5rem; 22 | padding: 1rem; 23 | 24 | font-size: 1.2rem; 25 | font-family: 'ui-monospace', 'SF Monog Regular', Consolas, 'Liberation Mono', 'Courier New', monospace; 26 | color: black; 27 | } 28 | 29 | #new-job input { 30 | width: 36rem; 31 | font-size: 1.2rem; 32 | height: 1.6rem; 33 | padding-left: 0.3rem; 34 | margin-left: 0.15rem; 35 | border: 1px solid gray; 36 | } 37 | 38 | #new-job button { 39 | font-size: 1.2rem; 40 | border: 1px solid gray; 41 | } 42 | 43 | #list { 44 | margin-top: 2rem; 45 | border-top: 1px dashed gray; 46 | } 47 | 48 | .job { 49 | margin-top: 2rem; 50 | display: grid; 51 | grid-template-rows: repeat(10, 1fr); 52 | grid-template-columns: [line-start] 80px [status-end job] 350px [job-end] auto [links-left] 120px [line-end]; 53 | } 54 | 55 | .job-name { 56 | grid-row: 1/2; 57 | grid-column: job/job-end; 58 | place-self: center; 59 | width: 100%; 60 | margin-bottom: -1px; 61 | z-index: 2; 62 | border: 1px solid black; 63 | color: darkslategray; 64 | font-style: italic; 65 | font-size: 1rem; 66 | padding-top: 4px; 67 | padding-left: 4px; 68 | border-bottom: 4px solid white !important; 69 | 70 | overflow: hidden; 71 | white-space: nowrap; 72 | text-overflow: ellipsis; 73 | } 74 | 75 | .first-row { 76 | grid-column: line-start/line-end; 77 | grid-row: 1/2; 78 | border-bottom: 1px solid black; 79 | } 80 | 81 | .links-left { 82 | padding-top: 3px; 83 | font-size: 0.8rem; 84 | grid-column: links-left/line-end; 85 | grid-row: 1/2; 86 | } 87 | 88 | .status { 89 | grid-column: line-start/status-end; 90 | 91 | padding-top: 0.5rem; 92 | font-size: 1rem; 93 | overflow: hidden; 94 | white-space: nowrap; 95 | text-overflow: ellipsis; 96 | } 97 | 98 | .domain { 99 | grid-column: job/line-end; 100 | 101 | padding-top: 0.5rem; 102 | font-size: 1rem; 103 | overflow: hidden; 104 | white-space: nowrap; 105 | text-overflow: ellipsis; 106 | } 107 | 108 | .orange { 109 | color: orange; 110 | } 111 | 112 | .yellow { 113 | color: darkgoldenrod; 114 | } 115 | 116 | .green { 117 | color: darkgreen; 118 | } 119 | 120 | .red { 121 | color: red; 122 | } -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | // Re-run build if workflow changed. 3 | println!("cargo:rerun-if-changed=workflows"); 4 | // Builds the crawler project located in `workflows/crawler` into a Flawless WebAssembly artifact. 5 | // This uses a debug build for demonstration purposes, you want probably to use `build_release` instead. 6 | flawless_utils::build_debug("crawler"); 7 | } 8 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{sync::Arc, time::Duration}; 2 | 3 | use askama::Template; 4 | use axum::{ 5 | extract::{Path, State}, 6 | http::{header, HeaderMap, StatusCode}, 7 | response::{Html, IntoResponse}, 8 | routing::{get, post}, 9 | Form, Json, Router, 10 | }; 11 | use crawler::Job; 12 | use flawless_utils::DeployedModule; 13 | use serde::{Deserialize, Serialize}; 14 | use tokio::sync::Mutex; 15 | 16 | #[tokio::main] 17 | async fn main() { 18 | let flawless = flawless_utils::Server::new("http://localhost:27288", None); 19 | let flawless_module = flawless_utils::load_module_from_build!("crawler"); 20 | let module = flawless.deploy(flawless_module).await.unwrap(); 21 | 22 | let app = Router::new() 23 | .route("/", get(index)) 24 | .route("/timeout", get(timeout)) 25 | .route("/new-job", post(new_job)) 26 | .route("/list", get(list)) 27 | .route("/ui-update", post(ui_update)) 28 | .route("/assets/*path", get(handle_assets)) 29 | .with_state(AppState::new(module)); 30 | 31 | let listener = tokio::net::TcpListener::bind("127.0.0.1:3000") 32 | .await 33 | .unwrap(); 34 | println!("The server is running at: http://localhost:3000"); 35 | axum::serve(listener, app).await.unwrap(); 36 | } 37 | 38 | #[derive(Debug, Clone)] 39 | struct AppState { 40 | inner: Arc, 41 | } 42 | 43 | #[derive(Debug)] 44 | struct StateInner { 45 | module: DeployedModule, 46 | progress: Mutex>, 47 | } 48 | 49 | impl AppState { 50 | fn new(module: DeployedModule) -> Self { 51 | AppState { 52 | inner: Arc::new(StateInner { 53 | module, 54 | progress: Mutex::new(Vec::new()), 55 | }), 56 | } 57 | } 58 | 59 | fn module(&self) -> &DeployedModule { 60 | &self.inner.module 61 | } 62 | 63 | async fn progress(&self) -> Vec { 64 | self.inner.progress.lock().await.clone() 65 | } 66 | 67 | async fn add_job(&self, url: String) -> usize { 68 | let mut progress = self.inner.progress.lock().await; 69 | progress.push(JobProgress { 70 | url, 71 | list: Vec::new(), 72 | }); 73 | progress.len() - 1 74 | } 75 | 76 | async fn update_job(&self, id: usize, status: Status, url: String) { 77 | let mut progress = self.inner.progress.lock().await; 78 | let job = progress.get_mut(id).unwrap(); 79 | 80 | let list_element = if url == "last" { 81 | job.list.last_mut() 82 | } else { 83 | None 84 | }; 85 | 86 | match list_element { 87 | Some(list_element) => { 88 | list_element.0 = status.to_color(); 89 | list_element.1 = status.to_string(); 90 | } 91 | None => job.list.push((status.to_color(), status.to_string(), url)), 92 | } 93 | } 94 | } 95 | 96 | async fn timeout() -> impl IntoResponse { 97 | tokio::time::sleep(Duration::from_secs(60)).await; 98 | Html("Response after 60 seconds") 99 | } 100 | 101 | #[derive(Debug, Clone)] 102 | struct JobProgress { 103 | url: String, 104 | // color, status, url 105 | list: Vec<(String, String, String)>, 106 | } 107 | 108 | #[derive(Template)] 109 | #[template(path = "index.html")] 110 | struct IndexTemplate; 111 | 112 | async fn index() -> impl IntoResponse { 113 | Html(IndexTemplate.render().expect("index renders")) 114 | } 115 | 116 | #[derive(Deserialize)] 117 | struct NewJob { 118 | url: String, 119 | } 120 | 121 | async fn new_job(State(state): State, Form(job): Form) -> impl IntoResponse { 122 | let url = job.url; 123 | let id = state.add_job(url.clone()).await; 124 | 125 | state 126 | .module() 127 | .start::(Job { id, url }) 128 | .await 129 | .unwrap(); 130 | 131 | list(State(state)).await 132 | } 133 | 134 | async fn ui_update( 135 | State(state): State, 136 | Json(ui_update): Json, 137 | ) -> impl IntoResponse { 138 | state 139 | .update_job(ui_update.id, ui_update.status, ui_update.url) 140 | .await; 141 | Html("OK") 142 | } 143 | 144 | static STYLE_CSS: &str = include_str!("../assets/styles.css"); 145 | 146 | async fn handle_assets(Path(path): Path) -> impl IntoResponse { 147 | let mut headers = HeaderMap::new(); 148 | 149 | if path == "styles.css" { 150 | headers.insert(header::CONTENT_TYPE, "text/css".parse().unwrap()); 151 | (StatusCode::OK, headers, STYLE_CSS) 152 | } else { 153 | (StatusCode::NOT_FOUND, headers, "") 154 | } 155 | } 156 | 157 | #[derive(Template)] 158 | #[template(path = "list.html")] 159 | struct ListTemplate { 160 | progress: Vec, 161 | } 162 | 163 | async fn list(State(state): State) -> impl IntoResponse { 164 | let progress = state.progress().await; 165 | // Display max 10 last requests. 166 | let progress = progress 167 | .iter() 168 | .map(|job| { 169 | let url = job.url.clone(); 170 | let list = job.list.iter().rev().take(10).map(|e| e.clone()).collect(); 171 | JobProgress { url, list } 172 | }) 173 | .collect(); 174 | let template = ListTemplate { progress }; 175 | Html(template.render().expect("index renders")) 176 | } 177 | 178 | #[derive(Debug, Serialize, Deserialize)] 179 | pub struct UpdateUI { 180 | pub id: usize, 181 | pub status: Status, 182 | pub url: String, 183 | pub urls_left: usize, 184 | } 185 | 186 | #[derive(Debug, Serialize, Deserialize)] 187 | pub enum Status { 188 | // Request in progress. 189 | Request, 190 | // Parsing in progress. 191 | Parse, 192 | // Finished. 193 | Done, 194 | // Error 195 | Error, 196 | } 197 | 198 | impl Status { 199 | fn to_string(&self) -> String { 200 | match self { 201 | Status::Request => "REQ".to_string(), 202 | Status::Parse => "PARS".to_string(), 203 | Status::Done => "DONE".to_string(), 204 | Status::Error => "ERR".to_string(), 205 | } 206 | } 207 | fn to_color(&self) -> String { 208 | match self { 209 | Status::Request => "orange".to_string(), 210 | Status::Parse => "yellow".to_string(), 211 | Status::Done => "green".to_string(), 212 | Status::Error => "red".to_string(), 213 | } 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | Flawless Crawler 11 | {% block head %}{% endblock %} 12 | 13 | 14 | 15 |
16 | {% block content %}

Placeholder content

{% endblock %} 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 |

Flawless Crawler

6 | 7 |
8 |
9 | 10 | 11 |
12 | 13 |
14 | 15 |
16 |
17 | 18 | {% endblock %} -------------------------------------------------------------------------------- /templates/list.html: -------------------------------------------------------------------------------- 1 | {% for job in progress %} 2 |
3 |
4 |
{{ job.url }}
5 | 6 | 7 | {% for item in job.list %} 8 |
{{ item.1 }}
9 |
{{ item.2 }}
10 | {% endfor %} 11 |
12 | {% endfor %} -------------------------------------------------------------------------------- /workflows/crawler/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "crawler" 3 | version = "0.1.2" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | log = "0.4" 8 | select = "0.6" 9 | serde = { version = "1", features = ["derive"] } 10 | serde_json = "1" 11 | 12 | flawless = { path = "../../../flawless-next/crates/flawless" } 13 | flawless-http = { path = "../../../flawless-next/crates/flawless-http" } 14 | -------------------------------------------------------------------------------- /workflows/crawler/src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashSet, time::Duration}; 2 | 3 | use flawless::{ 4 | workflow, 5 | workflow::{sleep, Input}, 6 | }; 7 | use flawless_http::ErrorKind; 8 | use log::warn; 9 | use select::{document::Document, predicate::Name}; 10 | use serde::{Deserialize, Serialize}; 11 | 12 | flawless::module! { name = "crawler", version = "0.1.7" } 13 | 14 | const MAX_CRAWL_SIZE: usize = 64; 15 | 16 | #[derive(Debug, Serialize, Deserialize)] 17 | pub struct Job { 18 | pub id: usize, 19 | pub url: String, 20 | } 21 | 22 | #[workflow("crawl")] 23 | pub fn start_crawler(input: Input) { 24 | let id = input.id; 25 | let url = input.url.clone(); 26 | 27 | let mut urls = vec![url]; 28 | let mut visited_urls = HashSet::new(); 29 | 30 | let mut links_crawled = 0; 31 | while let Some(url) = urls.pop() { 32 | links_crawled += 1; 33 | 34 | // Skip visited URLs. 35 | if visited_urls.contains(&url) { 36 | continue; 37 | } 38 | visited_urls.insert(url.clone()); 39 | 40 | // If maximum number of URLs reached, stop. 41 | if links_crawled > MAX_CRAWL_SIZE { 42 | return; 43 | } 44 | 45 | sleep(Duration::from_millis(300)); 46 | update_ui(UpdateUI::new(id, Status::Request, &url, urls.len() + 1)); 47 | let response = flawless_http::get(url.as_str()).send(); 48 | if let Err(err) = response { 49 | if err.kind() == ErrorKind::RequestInterrupted { 50 | warn!("The request to '{}' was interrupted", url); 51 | } 52 | update_ui(UpdateUI::new(id, Status::Error, "last", urls.len())); 53 | continue; 54 | } 55 | sleep(Duration::from_millis(300)); 56 | 57 | let document = response.unwrap().text(); 58 | if let Err(_err) = document { 59 | update_ui(UpdateUI::new(id, Status::Error, "last", urls.len())); 60 | continue; 61 | } 62 | 63 | update_ui(UpdateUI::new(id, Status::Parse, "last", urls.len())); 64 | let links = extract_links(document.unwrap()); 65 | urls.extend(links); 66 | sleep(Duration::from_millis(300)); 67 | 68 | update_ui(UpdateUI::new(id, Status::Done, "last", urls.len())); 69 | } 70 | } 71 | 72 | // Extract links from HTML document. 73 | fn extract_links(document: String) -> Vec { 74 | Document::from(document.as_str()) 75 | .find(Name("a")) 76 | .filter_map(|n| n.attr("href")) 77 | .filter(|url| url.starts_with("https://")) 78 | .map(|url| url.to_string()) 79 | .collect() 80 | } 81 | 82 | // Send update to UI server. 83 | fn update_ui(update: UpdateUI) { 84 | flawless_http::post("http://localhost:3000/ui-update") 85 | .body(serde_json::to_value(update).expect("UpdateUI serialization")) 86 | .send() 87 | .expect("UI update"); 88 | } 89 | 90 | #[derive(Debug, Serialize, Deserialize)] 91 | pub struct UpdateUI { 92 | pub id: usize, 93 | pub status: Status, 94 | pub url: String, 95 | pub urls_left: usize, 96 | } 97 | 98 | impl UpdateUI { 99 | fn new(id: usize, status: Status, url: &str, urls_left: usize) -> Self { 100 | UpdateUI { 101 | id, 102 | status, 103 | url: url.to_string(), 104 | urls_left, 105 | } 106 | } 107 | } 108 | 109 | #[derive(Debug, Serialize, Deserialize)] 110 | pub enum Status { 111 | // Request in progress. 112 | Request, 113 | // Parsing in progress. 114 | Parse, 115 | // Finished. 116 | Done, 117 | // Error 118 | Error, 119 | } 120 | --------------------------------------------------------------------------------