├── .env ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── build.rs ├── migrations ├── 20240309195002_initial.sql └── 20240309202828_data.sql └── src ├── handler.rs ├── handler ├── create.rs ├── delete.rs ├── list.rs ├── read.rs └── update.rs ├── main.rs └── state.rs /.env: -------------------------------------------------------------------------------- 1 | DATABASE_URL= 2 | REDIS_URL= 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /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.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 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 = "ahash" 22 | version = "0.8.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 25 | dependencies = [ 26 | "cfg-if", 27 | "getrandom", 28 | "once_cell", 29 | "version_check", 30 | "zerocopy", 31 | ] 32 | 33 | [[package]] 34 | name = "allocator-api2" 35 | version = "0.2.16" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" 38 | 39 | [[package]] 40 | name = "android-tzdata" 41 | version = "0.1.1" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 44 | 45 | [[package]] 46 | name = "android_system_properties" 47 | version = "0.1.5" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 50 | dependencies = [ 51 | "libc", 52 | ] 53 | 54 | [[package]] 55 | name = "arc-swap" 56 | version = "1.7.0" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f" 59 | 60 | [[package]] 61 | name = "async-trait" 62 | version = "0.1.77" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" 65 | dependencies = [ 66 | "proc-macro2", 67 | "quote", 68 | "syn 2.0.52", 69 | ] 70 | 71 | [[package]] 72 | name = "atoi" 73 | version = "2.0.0" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 76 | dependencies = [ 77 | "num-traits", 78 | ] 79 | 80 | [[package]] 81 | name = "atomic-write-file" 82 | version = "0.1.3" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "a8204db279bf648d64fe845bd8840f78b39c8132ed4d6a4194c3b10d4b4cfb0b" 85 | dependencies = [ 86 | "nix", 87 | "rand", 88 | ] 89 | 90 | [[package]] 91 | name = "autocfg" 92 | version = "1.1.0" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 95 | 96 | [[package]] 97 | name = "axum" 98 | version = "0.7.4" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" 101 | dependencies = [ 102 | "async-trait", 103 | "axum-core", 104 | "bytes", 105 | "futures-util", 106 | "http", 107 | "http-body", 108 | "http-body-util", 109 | "hyper", 110 | "hyper-util", 111 | "itoa", 112 | "matchit", 113 | "memchr", 114 | "mime", 115 | "percent-encoding", 116 | "pin-project-lite", 117 | "rustversion", 118 | "serde", 119 | "serde_json", 120 | "serde_path_to_error", 121 | "serde_urlencoded", 122 | "sync_wrapper", 123 | "tokio", 124 | "tower", 125 | "tower-layer", 126 | "tower-service", 127 | "tracing", 128 | ] 129 | 130 | [[package]] 131 | name = "axum-core" 132 | version = "0.4.3" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" 135 | dependencies = [ 136 | "async-trait", 137 | "bytes", 138 | "futures-util", 139 | "http", 140 | "http-body", 141 | "http-body-util", 142 | "mime", 143 | "pin-project-lite", 144 | "rustversion", 145 | "sync_wrapper", 146 | "tower-layer", 147 | "tower-service", 148 | "tracing", 149 | ] 150 | 151 | [[package]] 152 | name = "backtrace" 153 | version = "0.3.69" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 156 | dependencies = [ 157 | "addr2line", 158 | "cc", 159 | "cfg-if", 160 | "libc", 161 | "miniz_oxide", 162 | "object", 163 | "rustc-demangle", 164 | ] 165 | 166 | [[package]] 167 | name = "base64" 168 | version = "0.21.7" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 171 | 172 | [[package]] 173 | name = "base64ct" 174 | version = "1.6.0" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 177 | 178 | [[package]] 179 | name = "bitflags" 180 | version = "1.3.2" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 183 | 184 | [[package]] 185 | name = "bitflags" 186 | version = "2.4.2" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" 189 | dependencies = [ 190 | "serde", 191 | ] 192 | 193 | [[package]] 194 | name = "block-buffer" 195 | version = "0.10.4" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 198 | dependencies = [ 199 | "generic-array", 200 | ] 201 | 202 | [[package]] 203 | name = "bumpalo" 204 | version = "3.15.4" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" 207 | 208 | [[package]] 209 | name = "byteorder" 210 | version = "1.5.0" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 213 | 214 | [[package]] 215 | name = "bytes" 216 | version = "1.5.0" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 219 | 220 | [[package]] 221 | name = "bytes-utils" 222 | version = "0.1.4" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" 225 | dependencies = [ 226 | "bytes", 227 | "either", 228 | ] 229 | 230 | [[package]] 231 | name = "cc" 232 | version = "1.0.90" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" 235 | 236 | [[package]] 237 | name = "cfg-if" 238 | version = "1.0.0" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 241 | 242 | [[package]] 243 | name = "cfg_aliases" 244 | version = "0.1.1" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 247 | 248 | [[package]] 249 | name = "chrono" 250 | version = "0.4.35" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" 253 | dependencies = [ 254 | "android-tzdata", 255 | "iana-time-zone", 256 | "js-sys", 257 | "num-traits", 258 | "serde", 259 | "wasm-bindgen", 260 | "windows-targets 0.52.4", 261 | ] 262 | 263 | [[package]] 264 | name = "const-oid" 265 | version = "0.9.6" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 268 | 269 | [[package]] 270 | name = "cookie-factory" 271 | version = "0.3.2" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" 274 | 275 | [[package]] 276 | name = "core-foundation" 277 | version = "0.9.4" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 280 | dependencies = [ 281 | "core-foundation-sys", 282 | "libc", 283 | ] 284 | 285 | [[package]] 286 | name = "core-foundation-sys" 287 | version = "0.8.6" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 290 | 291 | [[package]] 292 | name = "cpufeatures" 293 | version = "0.2.12" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 296 | dependencies = [ 297 | "libc", 298 | ] 299 | 300 | [[package]] 301 | name = "crc" 302 | version = "3.0.1" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" 305 | dependencies = [ 306 | "crc-catalog", 307 | ] 308 | 309 | [[package]] 310 | name = "crc-catalog" 311 | version = "2.4.0" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 314 | 315 | [[package]] 316 | name = "crc16" 317 | version = "0.4.0" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" 320 | 321 | [[package]] 322 | name = "crossbeam-queue" 323 | version = "0.3.11" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" 326 | dependencies = [ 327 | "crossbeam-utils", 328 | ] 329 | 330 | [[package]] 331 | name = "crossbeam-utils" 332 | version = "0.8.19" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" 335 | 336 | [[package]] 337 | name = "crypto-common" 338 | version = "0.1.6" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 341 | dependencies = [ 342 | "generic-array", 343 | "typenum", 344 | ] 345 | 346 | [[package]] 347 | name = "der" 348 | version = "0.7.8" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" 351 | dependencies = [ 352 | "const-oid", 353 | "pem-rfc7468", 354 | "zeroize", 355 | ] 356 | 357 | [[package]] 358 | name = "digest" 359 | version = "0.10.7" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 362 | dependencies = [ 363 | "block-buffer", 364 | "const-oid", 365 | "crypto-common", 366 | "subtle", 367 | ] 368 | 369 | [[package]] 370 | name = "dotenv" 371 | version = "0.15.0" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 374 | 375 | [[package]] 376 | name = "dotenvy" 377 | version = "0.15.7" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 380 | 381 | [[package]] 382 | name = "either" 383 | version = "1.10.0" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" 386 | dependencies = [ 387 | "serde", 388 | ] 389 | 390 | [[package]] 391 | name = "equivalent" 392 | version = "1.0.1" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 395 | 396 | [[package]] 397 | name = "errno" 398 | version = "0.3.8" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 401 | dependencies = [ 402 | "libc", 403 | "windows-sys 0.52.0", 404 | ] 405 | 406 | [[package]] 407 | name = "etcetera" 408 | version = "0.8.0" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 411 | dependencies = [ 412 | "cfg-if", 413 | "home", 414 | "windows-sys 0.48.0", 415 | ] 416 | 417 | [[package]] 418 | name = "event-listener" 419 | version = "2.5.3" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 422 | 423 | [[package]] 424 | name = "fastrand" 425 | version = "2.0.1" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 428 | 429 | [[package]] 430 | name = "finl_unicode" 431 | version = "1.2.0" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 434 | 435 | [[package]] 436 | name = "float-cmp" 437 | version = "0.9.0" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 440 | dependencies = [ 441 | "num-traits", 442 | ] 443 | 444 | [[package]] 445 | name = "flume" 446 | version = "0.11.0" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" 449 | dependencies = [ 450 | "futures-core", 451 | "futures-sink", 452 | "spin 0.9.8", 453 | ] 454 | 455 | [[package]] 456 | name = "fnv" 457 | version = "1.0.7" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 460 | 461 | [[package]] 462 | name = "form_urlencoded" 463 | version = "1.2.1" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 466 | dependencies = [ 467 | "percent-encoding", 468 | ] 469 | 470 | [[package]] 471 | name = "fred" 472 | version = "8.0.4" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "2b4eaa3196a62b31b5c6830563e063562e6280af38f06f72456e6e1e8264e3cb" 475 | dependencies = [ 476 | "arc-swap", 477 | "async-trait", 478 | "bytes", 479 | "bytes-utils", 480 | "crossbeam-queue", 481 | "float-cmp", 482 | "futures", 483 | "lazy_static", 484 | "log", 485 | "parking_lot", 486 | "rand", 487 | "redis-protocol", 488 | "rustls 0.22.2", 489 | "rustls-native-certs", 490 | "rustls-webpki 0.102.2", 491 | "semver", 492 | "serde_json", 493 | "socket2", 494 | "tokio", 495 | "tokio-rustls", 496 | "tokio-stream", 497 | "tokio-util", 498 | "url", 499 | "urlencoding", 500 | ] 501 | 502 | [[package]] 503 | name = "futures" 504 | version = "0.3.30" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 507 | dependencies = [ 508 | "futures-channel", 509 | "futures-core", 510 | "futures-executor", 511 | "futures-io", 512 | "futures-sink", 513 | "futures-task", 514 | "futures-util", 515 | ] 516 | 517 | [[package]] 518 | name = "futures-channel" 519 | version = "0.3.30" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 522 | dependencies = [ 523 | "futures-core", 524 | "futures-sink", 525 | ] 526 | 527 | [[package]] 528 | name = "futures-core" 529 | version = "0.3.30" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 532 | 533 | [[package]] 534 | name = "futures-executor" 535 | version = "0.3.30" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 538 | dependencies = [ 539 | "futures-core", 540 | "futures-task", 541 | "futures-util", 542 | ] 543 | 544 | [[package]] 545 | name = "futures-intrusive" 546 | version = "0.5.0" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 549 | dependencies = [ 550 | "futures-core", 551 | "lock_api", 552 | "parking_lot", 553 | ] 554 | 555 | [[package]] 556 | name = "futures-io" 557 | version = "0.3.30" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 560 | 561 | [[package]] 562 | name = "futures-macro" 563 | version = "0.3.30" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 566 | dependencies = [ 567 | "proc-macro2", 568 | "quote", 569 | "syn 2.0.52", 570 | ] 571 | 572 | [[package]] 573 | name = "futures-sink" 574 | version = "0.3.30" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 577 | 578 | [[package]] 579 | name = "futures-task" 580 | version = "0.3.30" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 583 | 584 | [[package]] 585 | name = "futures-util" 586 | version = "0.3.30" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 589 | dependencies = [ 590 | "futures-channel", 591 | "futures-core", 592 | "futures-io", 593 | "futures-macro", 594 | "futures-sink", 595 | "futures-task", 596 | "memchr", 597 | "pin-project-lite", 598 | "pin-utils", 599 | "slab", 600 | ] 601 | 602 | [[package]] 603 | name = "generic-array" 604 | version = "0.14.7" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 607 | dependencies = [ 608 | "typenum", 609 | "version_check", 610 | ] 611 | 612 | [[package]] 613 | name = "getrandom" 614 | version = "0.2.12" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 617 | dependencies = [ 618 | "cfg-if", 619 | "libc", 620 | "wasi", 621 | ] 622 | 623 | [[package]] 624 | name = "gimli" 625 | version = "0.28.1" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 628 | 629 | [[package]] 630 | name = "h2" 631 | version = "0.4.2" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" 634 | dependencies = [ 635 | "bytes", 636 | "fnv", 637 | "futures-core", 638 | "futures-sink", 639 | "futures-util", 640 | "http", 641 | "indexmap", 642 | "slab", 643 | "tokio", 644 | "tokio-util", 645 | "tracing", 646 | ] 647 | 648 | [[package]] 649 | name = "hashbrown" 650 | version = "0.14.3" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 653 | dependencies = [ 654 | "ahash", 655 | "allocator-api2", 656 | ] 657 | 658 | [[package]] 659 | name = "hashlink" 660 | version = "0.8.4" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" 663 | dependencies = [ 664 | "hashbrown", 665 | ] 666 | 667 | [[package]] 668 | name = "heck" 669 | version = "0.4.1" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 672 | dependencies = [ 673 | "unicode-segmentation", 674 | ] 675 | 676 | [[package]] 677 | name = "hermit-abi" 678 | version = "0.3.9" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 681 | 682 | [[package]] 683 | name = "hex" 684 | version = "0.4.3" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 687 | 688 | [[package]] 689 | name = "hkdf" 690 | version = "0.12.4" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 693 | dependencies = [ 694 | "hmac", 695 | ] 696 | 697 | [[package]] 698 | name = "hmac" 699 | version = "0.12.1" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 702 | dependencies = [ 703 | "digest", 704 | ] 705 | 706 | [[package]] 707 | name = "home" 708 | version = "0.5.9" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 711 | dependencies = [ 712 | "windows-sys 0.52.0", 713 | ] 714 | 715 | [[package]] 716 | name = "http" 717 | version = "1.1.0" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 720 | dependencies = [ 721 | "bytes", 722 | "fnv", 723 | "itoa", 724 | ] 725 | 726 | [[package]] 727 | name = "http-body" 728 | version = "1.0.0" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 731 | dependencies = [ 732 | "bytes", 733 | "http", 734 | ] 735 | 736 | [[package]] 737 | name = "http-body-util" 738 | version = "0.1.0" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" 741 | dependencies = [ 742 | "bytes", 743 | "futures-util", 744 | "http", 745 | "http-body", 746 | "pin-project-lite", 747 | ] 748 | 749 | [[package]] 750 | name = "httparse" 751 | version = "1.8.0" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 754 | 755 | [[package]] 756 | name = "httpdate" 757 | version = "1.0.3" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 760 | 761 | [[package]] 762 | name = "hyper" 763 | version = "1.2.0" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" 766 | dependencies = [ 767 | "bytes", 768 | "futures-channel", 769 | "futures-util", 770 | "h2", 771 | "http", 772 | "http-body", 773 | "httparse", 774 | "httpdate", 775 | "itoa", 776 | "pin-project-lite", 777 | "smallvec", 778 | "tokio", 779 | ] 780 | 781 | [[package]] 782 | name = "hyper-util" 783 | version = "0.1.3" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 786 | dependencies = [ 787 | "bytes", 788 | "futures-util", 789 | "http", 790 | "http-body", 791 | "hyper", 792 | "pin-project-lite", 793 | "socket2", 794 | "tokio", 795 | ] 796 | 797 | [[package]] 798 | name = "iana-time-zone" 799 | version = "0.1.60" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 802 | dependencies = [ 803 | "android_system_properties", 804 | "core-foundation-sys", 805 | "iana-time-zone-haiku", 806 | "js-sys", 807 | "wasm-bindgen", 808 | "windows-core", 809 | ] 810 | 811 | [[package]] 812 | name = "iana-time-zone-haiku" 813 | version = "0.1.2" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 816 | dependencies = [ 817 | "cc", 818 | ] 819 | 820 | [[package]] 821 | name = "idna" 822 | version = "0.5.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 825 | dependencies = [ 826 | "unicode-bidi", 827 | "unicode-normalization", 828 | ] 829 | 830 | [[package]] 831 | name = "indexmap" 832 | version = "2.2.5" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" 835 | dependencies = [ 836 | "equivalent", 837 | "hashbrown", 838 | ] 839 | 840 | [[package]] 841 | name = "itertools" 842 | version = "0.12.1" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 845 | dependencies = [ 846 | "either", 847 | ] 848 | 849 | [[package]] 850 | name = "itoa" 851 | version = "1.0.10" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 854 | 855 | [[package]] 856 | name = "js-sys" 857 | version = "0.3.69" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 860 | dependencies = [ 861 | "wasm-bindgen", 862 | ] 863 | 864 | [[package]] 865 | name = "lazy_static" 866 | version = "1.4.0" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 869 | dependencies = [ 870 | "spin 0.5.2", 871 | ] 872 | 873 | [[package]] 874 | name = "libc" 875 | version = "0.2.153" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 878 | 879 | [[package]] 880 | name = "libm" 881 | version = "0.2.8" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 884 | 885 | [[package]] 886 | name = "libsqlite3-sys" 887 | version = "0.27.0" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" 890 | dependencies = [ 891 | "cc", 892 | "pkg-config", 893 | "vcpkg", 894 | ] 895 | 896 | [[package]] 897 | name = "linux-raw-sys" 898 | version = "0.4.13" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 901 | 902 | [[package]] 903 | name = "lock_api" 904 | version = "0.4.11" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 907 | dependencies = [ 908 | "autocfg", 909 | "scopeguard", 910 | ] 911 | 912 | [[package]] 913 | name = "log" 914 | version = "0.4.21" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 917 | 918 | [[package]] 919 | name = "matchit" 920 | version = "0.7.3" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 923 | 924 | [[package]] 925 | name = "md-5" 926 | version = "0.10.6" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 929 | dependencies = [ 930 | "cfg-if", 931 | "digest", 932 | ] 933 | 934 | [[package]] 935 | name = "memchr" 936 | version = "2.7.1" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 939 | 940 | [[package]] 941 | name = "mime" 942 | version = "0.3.17" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 945 | 946 | [[package]] 947 | name = "minimal-lexical" 948 | version = "0.2.1" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 951 | 952 | [[package]] 953 | name = "miniz_oxide" 954 | version = "0.7.2" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 957 | dependencies = [ 958 | "adler", 959 | ] 960 | 961 | [[package]] 962 | name = "mio" 963 | version = "0.8.11" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 966 | dependencies = [ 967 | "libc", 968 | "wasi", 969 | "windows-sys 0.48.0", 970 | ] 971 | 972 | [[package]] 973 | name = "names" 974 | version = "0.14.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" 977 | dependencies = [ 978 | "rand", 979 | ] 980 | 981 | [[package]] 982 | name = "nix" 983 | version = "0.28.0" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" 986 | dependencies = [ 987 | "bitflags 2.4.2", 988 | "cfg-if", 989 | "cfg_aliases", 990 | "libc", 991 | ] 992 | 993 | [[package]] 994 | name = "nom" 995 | version = "7.1.3" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 998 | dependencies = [ 999 | "memchr", 1000 | "minimal-lexical", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "nu-ansi-term" 1005 | version = "0.46.0" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1008 | dependencies = [ 1009 | "overload", 1010 | "winapi", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "num-bigint-dig" 1015 | version = "0.8.4" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1018 | dependencies = [ 1019 | "byteorder", 1020 | "lazy_static", 1021 | "libm", 1022 | "num-integer", 1023 | "num-iter", 1024 | "num-traits", 1025 | "rand", 1026 | "smallvec", 1027 | "zeroize", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "num-integer" 1032 | version = "0.1.46" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1035 | dependencies = [ 1036 | "num-traits", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "num-iter" 1041 | version = "0.1.44" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" 1044 | dependencies = [ 1045 | "autocfg", 1046 | "num-integer", 1047 | "num-traits", 1048 | ] 1049 | 1050 | [[package]] 1051 | name = "num-traits" 1052 | version = "0.2.18" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 1055 | dependencies = [ 1056 | "autocfg", 1057 | "libm", 1058 | ] 1059 | 1060 | [[package]] 1061 | name = "num_cpus" 1062 | version = "1.16.0" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1065 | dependencies = [ 1066 | "hermit-abi", 1067 | "libc", 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "object" 1072 | version = "0.32.2" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1075 | dependencies = [ 1076 | "memchr", 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "once_cell" 1081 | version = "1.19.0" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1084 | 1085 | [[package]] 1086 | name = "openssl-probe" 1087 | version = "0.1.5" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1090 | 1091 | [[package]] 1092 | name = "overload" 1093 | version = "0.1.1" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1096 | 1097 | [[package]] 1098 | name = "parking_lot" 1099 | version = "0.12.1" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1102 | dependencies = [ 1103 | "lock_api", 1104 | "parking_lot_core", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "parking_lot_core" 1109 | version = "0.9.9" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 1112 | dependencies = [ 1113 | "cfg-if", 1114 | "libc", 1115 | "redox_syscall", 1116 | "smallvec", 1117 | "windows-targets 0.48.5", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "paste" 1122 | version = "1.0.14" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" 1125 | 1126 | [[package]] 1127 | name = "pem-rfc7468" 1128 | version = "0.7.0" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1131 | dependencies = [ 1132 | "base64ct", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "percent-encoding" 1137 | version = "2.3.1" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1140 | 1141 | [[package]] 1142 | name = "pin-project" 1143 | version = "1.1.5" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1146 | dependencies = [ 1147 | "pin-project-internal", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "pin-project-internal" 1152 | version = "1.1.5" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1155 | dependencies = [ 1156 | "proc-macro2", 1157 | "quote", 1158 | "syn 2.0.52", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "pin-project-lite" 1163 | version = "0.2.13" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1166 | 1167 | [[package]] 1168 | name = "pin-utils" 1169 | version = "0.1.0" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1172 | 1173 | [[package]] 1174 | name = "pkcs1" 1175 | version = "0.7.5" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1178 | dependencies = [ 1179 | "der", 1180 | "pkcs8", 1181 | "spki", 1182 | ] 1183 | 1184 | [[package]] 1185 | name = "pkcs8" 1186 | version = "0.10.2" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1189 | dependencies = [ 1190 | "der", 1191 | "spki", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "pkg-config" 1196 | version = "0.3.30" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1199 | 1200 | [[package]] 1201 | name = "ppv-lite86" 1202 | version = "0.2.17" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1205 | 1206 | [[package]] 1207 | name = "proc-macro2" 1208 | version = "1.0.78" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" 1211 | dependencies = [ 1212 | "unicode-ident", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "quote" 1217 | version = "1.0.35" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 1220 | dependencies = [ 1221 | "proc-macro2", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "rand" 1226 | version = "0.8.5" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1229 | dependencies = [ 1230 | "libc", 1231 | "rand_chacha", 1232 | "rand_core", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "rand_chacha" 1237 | version = "0.3.1" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1240 | dependencies = [ 1241 | "ppv-lite86", 1242 | "rand_core", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "rand_core" 1247 | version = "0.6.4" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1250 | dependencies = [ 1251 | "getrandom", 1252 | ] 1253 | 1254 | [[package]] 1255 | name = "redis-protocol" 1256 | version = "4.1.0" 1257 | source = "registry+https://github.com/rust-lang/crates.io-index" 1258 | checksum = "9c31deddf734dc0a39d3112e73490e88b61a05e83e074d211f348404cee4d2c6" 1259 | dependencies = [ 1260 | "bytes", 1261 | "bytes-utils", 1262 | "cookie-factory", 1263 | "crc16", 1264 | "log", 1265 | "nom", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "redox_syscall" 1270 | version = "0.4.1" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1273 | dependencies = [ 1274 | "bitflags 1.3.2", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "ring" 1279 | version = "0.17.8" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1282 | dependencies = [ 1283 | "cc", 1284 | "cfg-if", 1285 | "getrandom", 1286 | "libc", 1287 | "spin 0.9.8", 1288 | "untrusted", 1289 | "windows-sys 0.52.0", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "rsa" 1294 | version = "0.9.6" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" 1297 | dependencies = [ 1298 | "const-oid", 1299 | "digest", 1300 | "num-bigint-dig", 1301 | "num-integer", 1302 | "num-traits", 1303 | "pkcs1", 1304 | "pkcs8", 1305 | "rand_core", 1306 | "signature", 1307 | "spki", 1308 | "subtle", 1309 | "zeroize", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "rustc-demangle" 1314 | version = "0.1.23" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1317 | 1318 | [[package]] 1319 | name = "rustix" 1320 | version = "0.38.31" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" 1323 | dependencies = [ 1324 | "bitflags 2.4.2", 1325 | "errno", 1326 | "libc", 1327 | "linux-raw-sys", 1328 | "windows-sys 0.52.0", 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "rustls" 1333 | version = "0.21.10" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" 1336 | dependencies = [ 1337 | "ring", 1338 | "rustls-webpki 0.101.7", 1339 | "sct", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "rustls" 1344 | version = "0.22.2" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" 1347 | dependencies = [ 1348 | "log", 1349 | "ring", 1350 | "rustls-pki-types", 1351 | "rustls-webpki 0.102.2", 1352 | "subtle", 1353 | "zeroize", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "rustls-native-certs" 1358 | version = "0.7.0" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" 1361 | dependencies = [ 1362 | "openssl-probe", 1363 | "rustls-pemfile 2.1.1", 1364 | "rustls-pki-types", 1365 | "schannel", 1366 | "security-framework", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "rustls-pemfile" 1371 | version = "1.0.4" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1374 | dependencies = [ 1375 | "base64", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "rustls-pemfile" 1380 | version = "2.1.1" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" 1383 | dependencies = [ 1384 | "base64", 1385 | "rustls-pki-types", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "rustls-pki-types" 1390 | version = "1.3.1" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" 1393 | 1394 | [[package]] 1395 | name = "rustls-webpki" 1396 | version = "0.101.7" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 1399 | dependencies = [ 1400 | "ring", 1401 | "untrusted", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "rustls-webpki" 1406 | version = "0.102.2" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" 1409 | dependencies = [ 1410 | "ring", 1411 | "rustls-pki-types", 1412 | "untrusted", 1413 | ] 1414 | 1415 | [[package]] 1416 | name = "rustversion" 1417 | version = "1.0.14" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 1420 | 1421 | [[package]] 1422 | name = "ryu" 1423 | version = "1.0.17" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1426 | 1427 | [[package]] 1428 | name = "schannel" 1429 | version = "0.1.23" 1430 | source = "registry+https://github.com/rust-lang/crates.io-index" 1431 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1432 | dependencies = [ 1433 | "windows-sys 0.52.0", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "scopeguard" 1438 | version = "1.2.0" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1441 | 1442 | [[package]] 1443 | name = "sct" 1444 | version = "0.7.1" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 1447 | dependencies = [ 1448 | "ring", 1449 | "untrusted", 1450 | ] 1451 | 1452 | [[package]] 1453 | name = "security-framework" 1454 | version = "2.9.2" 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" 1456 | checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" 1457 | dependencies = [ 1458 | "bitflags 1.3.2", 1459 | "core-foundation", 1460 | "core-foundation-sys", 1461 | "libc", 1462 | "security-framework-sys", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "security-framework-sys" 1467 | version = "2.9.1" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" 1470 | dependencies = [ 1471 | "core-foundation-sys", 1472 | "libc", 1473 | ] 1474 | 1475 | [[package]] 1476 | name = "semver" 1477 | version = "1.0.22" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" 1480 | 1481 | [[package]] 1482 | name = "serde" 1483 | version = "1.0.197" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 1486 | dependencies = [ 1487 | "serde_derive", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "serde_derive" 1492 | version = "1.0.197" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 1495 | dependencies = [ 1496 | "proc-macro2", 1497 | "quote", 1498 | "syn 2.0.52", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "serde_json" 1503 | version = "1.0.114" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" 1506 | dependencies = [ 1507 | "itoa", 1508 | "ryu", 1509 | "serde", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "serde_path_to_error" 1514 | version = "0.1.15" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" 1517 | dependencies = [ 1518 | "itoa", 1519 | "serde", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "serde_urlencoded" 1524 | version = "0.7.1" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1527 | dependencies = [ 1528 | "form_urlencoded", 1529 | "itoa", 1530 | "ryu", 1531 | "serde", 1532 | ] 1533 | 1534 | [[package]] 1535 | name = "sha1" 1536 | version = "0.10.6" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1539 | dependencies = [ 1540 | "cfg-if", 1541 | "cpufeatures", 1542 | "digest", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "sha2" 1547 | version = "0.10.8" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1550 | dependencies = [ 1551 | "cfg-if", 1552 | "cpufeatures", 1553 | "digest", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "sharded-slab" 1558 | version = "0.1.7" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1561 | dependencies = [ 1562 | "lazy_static", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "signal-hook-registry" 1567 | version = "1.4.1" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1570 | dependencies = [ 1571 | "libc", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "signature" 1576 | version = "2.2.0" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1579 | dependencies = [ 1580 | "digest", 1581 | "rand_core", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "simple-error" 1586 | version = "0.3.0" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "8542b68b8800c3cda649d2c72d688b6907b30f1580043135d61669d4aad1c175" 1589 | 1590 | [[package]] 1591 | name = "slab" 1592 | version = "0.4.9" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1595 | dependencies = [ 1596 | "autocfg", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "smallvec" 1601 | version = "1.13.1" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" 1604 | 1605 | [[package]] 1606 | name = "socket2" 1607 | version = "0.5.6" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" 1610 | dependencies = [ 1611 | "libc", 1612 | "windows-sys 0.52.0", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "spellbook" 1617 | version = "0.1.0" 1618 | dependencies = [ 1619 | "axum", 1620 | "chrono", 1621 | "dotenv", 1622 | "fred", 1623 | "names", 1624 | "serde", 1625 | "serde_json", 1626 | "simple-error", 1627 | "sqlx", 1628 | "tokio", 1629 | "tower-http", 1630 | "tracing", 1631 | "tracing-subscriber", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "spin" 1636 | version = "0.5.2" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1639 | 1640 | [[package]] 1641 | name = "spin" 1642 | version = "0.9.8" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1645 | dependencies = [ 1646 | "lock_api", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "spki" 1651 | version = "0.7.3" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1654 | dependencies = [ 1655 | "base64ct", 1656 | "der", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "sqlformat" 1661 | version = "0.2.3" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" 1664 | dependencies = [ 1665 | "itertools", 1666 | "nom", 1667 | "unicode_categories", 1668 | ] 1669 | 1670 | [[package]] 1671 | name = "sqlx" 1672 | version = "0.7.3" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" 1675 | dependencies = [ 1676 | "sqlx-core", 1677 | "sqlx-macros", 1678 | "sqlx-mysql", 1679 | "sqlx-postgres", 1680 | "sqlx-sqlite", 1681 | ] 1682 | 1683 | [[package]] 1684 | name = "sqlx-core" 1685 | version = "0.7.3" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" 1688 | dependencies = [ 1689 | "ahash", 1690 | "atoi", 1691 | "byteorder", 1692 | "bytes", 1693 | "chrono", 1694 | "crc", 1695 | "crossbeam-queue", 1696 | "dotenvy", 1697 | "either", 1698 | "event-listener", 1699 | "futures-channel", 1700 | "futures-core", 1701 | "futures-intrusive", 1702 | "futures-io", 1703 | "futures-util", 1704 | "hashlink", 1705 | "hex", 1706 | "indexmap", 1707 | "log", 1708 | "memchr", 1709 | "once_cell", 1710 | "paste", 1711 | "percent-encoding", 1712 | "rustls 0.21.10", 1713 | "rustls-pemfile 1.0.4", 1714 | "serde", 1715 | "serde_json", 1716 | "sha2", 1717 | "smallvec", 1718 | "sqlformat", 1719 | "thiserror", 1720 | "tokio", 1721 | "tokio-stream", 1722 | "tracing", 1723 | "url", 1724 | "webpki-roots", 1725 | ] 1726 | 1727 | [[package]] 1728 | name = "sqlx-macros" 1729 | version = "0.7.3" 1730 | source = "registry+https://github.com/rust-lang/crates.io-index" 1731 | checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" 1732 | dependencies = [ 1733 | "proc-macro2", 1734 | "quote", 1735 | "sqlx-core", 1736 | "sqlx-macros-core", 1737 | "syn 1.0.109", 1738 | ] 1739 | 1740 | [[package]] 1741 | name = "sqlx-macros-core" 1742 | version = "0.7.3" 1743 | source = "registry+https://github.com/rust-lang/crates.io-index" 1744 | checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" 1745 | dependencies = [ 1746 | "atomic-write-file", 1747 | "dotenvy", 1748 | "either", 1749 | "heck", 1750 | "hex", 1751 | "once_cell", 1752 | "proc-macro2", 1753 | "quote", 1754 | "serde", 1755 | "serde_json", 1756 | "sha2", 1757 | "sqlx-core", 1758 | "sqlx-mysql", 1759 | "sqlx-postgres", 1760 | "sqlx-sqlite", 1761 | "syn 1.0.109", 1762 | "tempfile", 1763 | "tokio", 1764 | "url", 1765 | ] 1766 | 1767 | [[package]] 1768 | name = "sqlx-mysql" 1769 | version = "0.7.3" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" 1772 | dependencies = [ 1773 | "atoi", 1774 | "base64", 1775 | "bitflags 2.4.2", 1776 | "byteorder", 1777 | "bytes", 1778 | "chrono", 1779 | "crc", 1780 | "digest", 1781 | "dotenvy", 1782 | "either", 1783 | "futures-channel", 1784 | "futures-core", 1785 | "futures-io", 1786 | "futures-util", 1787 | "generic-array", 1788 | "hex", 1789 | "hkdf", 1790 | "hmac", 1791 | "itoa", 1792 | "log", 1793 | "md-5", 1794 | "memchr", 1795 | "once_cell", 1796 | "percent-encoding", 1797 | "rand", 1798 | "rsa", 1799 | "serde", 1800 | "sha1", 1801 | "sha2", 1802 | "smallvec", 1803 | "sqlx-core", 1804 | "stringprep", 1805 | "thiserror", 1806 | "tracing", 1807 | "whoami", 1808 | ] 1809 | 1810 | [[package]] 1811 | name = "sqlx-postgres" 1812 | version = "0.7.3" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" 1815 | dependencies = [ 1816 | "atoi", 1817 | "base64", 1818 | "bitflags 2.4.2", 1819 | "byteorder", 1820 | "chrono", 1821 | "crc", 1822 | "dotenvy", 1823 | "etcetera", 1824 | "futures-channel", 1825 | "futures-core", 1826 | "futures-io", 1827 | "futures-util", 1828 | "hex", 1829 | "hkdf", 1830 | "hmac", 1831 | "home", 1832 | "itoa", 1833 | "log", 1834 | "md-5", 1835 | "memchr", 1836 | "once_cell", 1837 | "rand", 1838 | "serde", 1839 | "serde_json", 1840 | "sha1", 1841 | "sha2", 1842 | "smallvec", 1843 | "sqlx-core", 1844 | "stringprep", 1845 | "thiserror", 1846 | "tracing", 1847 | "whoami", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "sqlx-sqlite" 1852 | version = "0.7.3" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" 1855 | dependencies = [ 1856 | "atoi", 1857 | "chrono", 1858 | "flume", 1859 | "futures-channel", 1860 | "futures-core", 1861 | "futures-executor", 1862 | "futures-intrusive", 1863 | "futures-util", 1864 | "libsqlite3-sys", 1865 | "log", 1866 | "percent-encoding", 1867 | "serde", 1868 | "sqlx-core", 1869 | "tracing", 1870 | "url", 1871 | "urlencoding", 1872 | ] 1873 | 1874 | [[package]] 1875 | name = "stringprep" 1876 | version = "0.1.4" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" 1879 | dependencies = [ 1880 | "finl_unicode", 1881 | "unicode-bidi", 1882 | "unicode-normalization", 1883 | ] 1884 | 1885 | [[package]] 1886 | name = "subtle" 1887 | version = "2.5.0" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1890 | 1891 | [[package]] 1892 | name = "syn" 1893 | version = "1.0.109" 1894 | source = "registry+https://github.com/rust-lang/crates.io-index" 1895 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1896 | dependencies = [ 1897 | "proc-macro2", 1898 | "quote", 1899 | "unicode-ident", 1900 | ] 1901 | 1902 | [[package]] 1903 | name = "syn" 1904 | version = "2.0.52" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" 1907 | dependencies = [ 1908 | "proc-macro2", 1909 | "quote", 1910 | "unicode-ident", 1911 | ] 1912 | 1913 | [[package]] 1914 | name = "sync_wrapper" 1915 | version = "0.1.2" 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" 1917 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1918 | 1919 | [[package]] 1920 | name = "tempfile" 1921 | version = "3.10.1" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1924 | dependencies = [ 1925 | "cfg-if", 1926 | "fastrand", 1927 | "rustix", 1928 | "windows-sys 0.52.0", 1929 | ] 1930 | 1931 | [[package]] 1932 | name = "thiserror" 1933 | version = "1.0.57" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" 1936 | dependencies = [ 1937 | "thiserror-impl", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "thiserror-impl" 1942 | version = "1.0.57" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" 1945 | dependencies = [ 1946 | "proc-macro2", 1947 | "quote", 1948 | "syn 2.0.52", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "thread_local" 1953 | version = "1.1.8" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1956 | dependencies = [ 1957 | "cfg-if", 1958 | "once_cell", 1959 | ] 1960 | 1961 | [[package]] 1962 | name = "tinyvec" 1963 | version = "1.6.0" 1964 | source = "registry+https://github.com/rust-lang/crates.io-index" 1965 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1966 | dependencies = [ 1967 | "tinyvec_macros", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "tinyvec_macros" 1972 | version = "0.1.1" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1975 | 1976 | [[package]] 1977 | name = "tokio" 1978 | version = "1.36.0" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" 1981 | dependencies = [ 1982 | "backtrace", 1983 | "bytes", 1984 | "libc", 1985 | "mio", 1986 | "num_cpus", 1987 | "parking_lot", 1988 | "pin-project-lite", 1989 | "signal-hook-registry", 1990 | "socket2", 1991 | "tokio-macros", 1992 | "windows-sys 0.48.0", 1993 | ] 1994 | 1995 | [[package]] 1996 | name = "tokio-macros" 1997 | version = "2.2.0" 1998 | source = "registry+https://github.com/rust-lang/crates.io-index" 1999 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2000 | dependencies = [ 2001 | "proc-macro2", 2002 | "quote", 2003 | "syn 2.0.52", 2004 | ] 2005 | 2006 | [[package]] 2007 | name = "tokio-rustls" 2008 | version = "0.25.0" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" 2011 | dependencies = [ 2012 | "rustls 0.22.2", 2013 | "rustls-pki-types", 2014 | "tokio", 2015 | ] 2016 | 2017 | [[package]] 2018 | name = "tokio-stream" 2019 | version = "0.1.14" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" 2022 | dependencies = [ 2023 | "futures-core", 2024 | "pin-project-lite", 2025 | "tokio", 2026 | ] 2027 | 2028 | [[package]] 2029 | name = "tokio-util" 2030 | version = "0.7.10" 2031 | source = "registry+https://github.com/rust-lang/crates.io-index" 2032 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 2033 | dependencies = [ 2034 | "bytes", 2035 | "futures-core", 2036 | "futures-sink", 2037 | "pin-project-lite", 2038 | "tokio", 2039 | "tracing", 2040 | ] 2041 | 2042 | [[package]] 2043 | name = "tower" 2044 | version = "0.4.13" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2047 | dependencies = [ 2048 | "futures-core", 2049 | "futures-util", 2050 | "pin-project", 2051 | "pin-project-lite", 2052 | "tokio", 2053 | "tower-layer", 2054 | "tower-service", 2055 | "tracing", 2056 | ] 2057 | 2058 | [[package]] 2059 | name = "tower-http" 2060 | version = "0.5.2" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" 2063 | dependencies = [ 2064 | "bitflags 2.4.2", 2065 | "bytes", 2066 | "http", 2067 | "http-body", 2068 | "http-body-util", 2069 | "pin-project-lite", 2070 | "tower-layer", 2071 | "tower-service", 2072 | "tracing", 2073 | ] 2074 | 2075 | [[package]] 2076 | name = "tower-layer" 2077 | version = "0.3.2" 2078 | source = "registry+https://github.com/rust-lang/crates.io-index" 2079 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2080 | 2081 | [[package]] 2082 | name = "tower-service" 2083 | version = "0.3.2" 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" 2085 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2086 | 2087 | [[package]] 2088 | name = "tracing" 2089 | version = "0.1.40" 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" 2091 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2092 | dependencies = [ 2093 | "log", 2094 | "pin-project-lite", 2095 | "tracing-attributes", 2096 | "tracing-core", 2097 | ] 2098 | 2099 | [[package]] 2100 | name = "tracing-attributes" 2101 | version = "0.1.27" 2102 | source = "registry+https://github.com/rust-lang/crates.io-index" 2103 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2104 | dependencies = [ 2105 | "proc-macro2", 2106 | "quote", 2107 | "syn 2.0.52", 2108 | ] 2109 | 2110 | [[package]] 2111 | name = "tracing-core" 2112 | version = "0.1.32" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2115 | dependencies = [ 2116 | "once_cell", 2117 | "valuable", 2118 | ] 2119 | 2120 | [[package]] 2121 | name = "tracing-log" 2122 | version = "0.2.0" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2125 | dependencies = [ 2126 | "log", 2127 | "once_cell", 2128 | "tracing-core", 2129 | ] 2130 | 2131 | [[package]] 2132 | name = "tracing-subscriber" 2133 | version = "0.3.18" 2134 | source = "registry+https://github.com/rust-lang/crates.io-index" 2135 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2136 | dependencies = [ 2137 | "nu-ansi-term", 2138 | "sharded-slab", 2139 | "smallvec", 2140 | "thread_local", 2141 | "tracing-core", 2142 | "tracing-log", 2143 | ] 2144 | 2145 | [[package]] 2146 | name = "typenum" 2147 | version = "1.17.0" 2148 | source = "registry+https://github.com/rust-lang/crates.io-index" 2149 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2150 | 2151 | [[package]] 2152 | name = "unicode-bidi" 2153 | version = "0.3.15" 2154 | source = "registry+https://github.com/rust-lang/crates.io-index" 2155 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2156 | 2157 | [[package]] 2158 | name = "unicode-ident" 2159 | version = "1.0.12" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2162 | 2163 | [[package]] 2164 | name = "unicode-normalization" 2165 | version = "0.1.23" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 2168 | dependencies = [ 2169 | "tinyvec", 2170 | ] 2171 | 2172 | [[package]] 2173 | name = "unicode-segmentation" 2174 | version = "1.11.0" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 2177 | 2178 | [[package]] 2179 | name = "unicode_categories" 2180 | version = "0.1.1" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 2183 | 2184 | [[package]] 2185 | name = "untrusted" 2186 | version = "0.9.0" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2189 | 2190 | [[package]] 2191 | name = "url" 2192 | version = "2.5.0" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2195 | dependencies = [ 2196 | "form_urlencoded", 2197 | "idna", 2198 | "percent-encoding", 2199 | ] 2200 | 2201 | [[package]] 2202 | name = "urlencoding" 2203 | version = "2.1.3" 2204 | source = "registry+https://github.com/rust-lang/crates.io-index" 2205 | checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2206 | 2207 | [[package]] 2208 | name = "valuable" 2209 | version = "0.1.0" 2210 | source = "registry+https://github.com/rust-lang/crates.io-index" 2211 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2212 | 2213 | [[package]] 2214 | name = "vcpkg" 2215 | version = "0.2.15" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2218 | 2219 | [[package]] 2220 | name = "version_check" 2221 | version = "0.9.4" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2224 | 2225 | [[package]] 2226 | name = "wasi" 2227 | version = "0.11.0+wasi-snapshot-preview1" 2228 | source = "registry+https://github.com/rust-lang/crates.io-index" 2229 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2230 | 2231 | [[package]] 2232 | name = "wasite" 2233 | version = "0.1.0" 2234 | source = "registry+https://github.com/rust-lang/crates.io-index" 2235 | checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2236 | 2237 | [[package]] 2238 | name = "wasm-bindgen" 2239 | version = "0.2.92" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2242 | dependencies = [ 2243 | "cfg-if", 2244 | "wasm-bindgen-macro", 2245 | ] 2246 | 2247 | [[package]] 2248 | name = "wasm-bindgen-backend" 2249 | version = "0.2.92" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2252 | dependencies = [ 2253 | "bumpalo", 2254 | "log", 2255 | "once_cell", 2256 | "proc-macro2", 2257 | "quote", 2258 | "syn 2.0.52", 2259 | "wasm-bindgen-shared", 2260 | ] 2261 | 2262 | [[package]] 2263 | name = "wasm-bindgen-macro" 2264 | version = "0.2.92" 2265 | source = "registry+https://github.com/rust-lang/crates.io-index" 2266 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2267 | dependencies = [ 2268 | "quote", 2269 | "wasm-bindgen-macro-support", 2270 | ] 2271 | 2272 | [[package]] 2273 | name = "wasm-bindgen-macro-support" 2274 | version = "0.2.92" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2277 | dependencies = [ 2278 | "proc-macro2", 2279 | "quote", 2280 | "syn 2.0.52", 2281 | "wasm-bindgen-backend", 2282 | "wasm-bindgen-shared", 2283 | ] 2284 | 2285 | [[package]] 2286 | name = "wasm-bindgen-shared" 2287 | version = "0.2.92" 2288 | source = "registry+https://github.com/rust-lang/crates.io-index" 2289 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2290 | 2291 | [[package]] 2292 | name = "webpki-roots" 2293 | version = "0.25.4" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" 2296 | 2297 | [[package]] 2298 | name = "whoami" 2299 | version = "1.5.0" 2300 | source = "registry+https://github.com/rust-lang/crates.io-index" 2301 | checksum = "0fec781d48b41f8163426ed18e8fc2864c12937df9ce54c88ede7bd47270893e" 2302 | dependencies = [ 2303 | "redox_syscall", 2304 | "wasite", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "winapi" 2309 | version = "0.3.9" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2312 | dependencies = [ 2313 | "winapi-i686-pc-windows-gnu", 2314 | "winapi-x86_64-pc-windows-gnu", 2315 | ] 2316 | 2317 | [[package]] 2318 | name = "winapi-i686-pc-windows-gnu" 2319 | version = "0.4.0" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2322 | 2323 | [[package]] 2324 | name = "winapi-x86_64-pc-windows-gnu" 2325 | version = "0.4.0" 2326 | source = "registry+https://github.com/rust-lang/crates.io-index" 2327 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2328 | 2329 | [[package]] 2330 | name = "windows-core" 2331 | version = "0.52.0" 2332 | source = "registry+https://github.com/rust-lang/crates.io-index" 2333 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2334 | dependencies = [ 2335 | "windows-targets 0.52.4", 2336 | ] 2337 | 2338 | [[package]] 2339 | name = "windows-sys" 2340 | version = "0.48.0" 2341 | source = "registry+https://github.com/rust-lang/crates.io-index" 2342 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2343 | dependencies = [ 2344 | "windows-targets 0.48.5", 2345 | ] 2346 | 2347 | [[package]] 2348 | name = "windows-sys" 2349 | version = "0.52.0" 2350 | source = "registry+https://github.com/rust-lang/crates.io-index" 2351 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2352 | dependencies = [ 2353 | "windows-targets 0.52.4", 2354 | ] 2355 | 2356 | [[package]] 2357 | name = "windows-targets" 2358 | version = "0.48.5" 2359 | source = "registry+https://github.com/rust-lang/crates.io-index" 2360 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2361 | dependencies = [ 2362 | "windows_aarch64_gnullvm 0.48.5", 2363 | "windows_aarch64_msvc 0.48.5", 2364 | "windows_i686_gnu 0.48.5", 2365 | "windows_i686_msvc 0.48.5", 2366 | "windows_x86_64_gnu 0.48.5", 2367 | "windows_x86_64_gnullvm 0.48.5", 2368 | "windows_x86_64_msvc 0.48.5", 2369 | ] 2370 | 2371 | [[package]] 2372 | name = "windows-targets" 2373 | version = "0.52.4" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" 2376 | dependencies = [ 2377 | "windows_aarch64_gnullvm 0.52.4", 2378 | "windows_aarch64_msvc 0.52.4", 2379 | "windows_i686_gnu 0.52.4", 2380 | "windows_i686_msvc 0.52.4", 2381 | "windows_x86_64_gnu 0.52.4", 2382 | "windows_x86_64_gnullvm 0.52.4", 2383 | "windows_x86_64_msvc 0.52.4", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "windows_aarch64_gnullvm" 2388 | version = "0.48.5" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2391 | 2392 | [[package]] 2393 | name = "windows_aarch64_gnullvm" 2394 | version = "0.52.4" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" 2397 | 2398 | [[package]] 2399 | name = "windows_aarch64_msvc" 2400 | version = "0.48.5" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2403 | 2404 | [[package]] 2405 | name = "windows_aarch64_msvc" 2406 | version = "0.52.4" 2407 | source = "registry+https://github.com/rust-lang/crates.io-index" 2408 | checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" 2409 | 2410 | [[package]] 2411 | name = "windows_i686_gnu" 2412 | version = "0.48.5" 2413 | source = "registry+https://github.com/rust-lang/crates.io-index" 2414 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2415 | 2416 | [[package]] 2417 | name = "windows_i686_gnu" 2418 | version = "0.52.4" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" 2421 | 2422 | [[package]] 2423 | name = "windows_i686_msvc" 2424 | version = "0.48.5" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2427 | 2428 | [[package]] 2429 | name = "windows_i686_msvc" 2430 | version = "0.52.4" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" 2433 | 2434 | [[package]] 2435 | name = "windows_x86_64_gnu" 2436 | version = "0.48.5" 2437 | source = "registry+https://github.com/rust-lang/crates.io-index" 2438 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2439 | 2440 | [[package]] 2441 | name = "windows_x86_64_gnu" 2442 | version = "0.52.4" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" 2445 | 2446 | [[package]] 2447 | name = "windows_x86_64_gnullvm" 2448 | version = "0.48.5" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2451 | 2452 | [[package]] 2453 | name = "windows_x86_64_gnullvm" 2454 | version = "0.52.4" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" 2457 | 2458 | [[package]] 2459 | name = "windows_x86_64_msvc" 2460 | version = "0.48.5" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2463 | 2464 | [[package]] 2465 | name = "windows_x86_64_msvc" 2466 | version = "0.52.4" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" 2469 | 2470 | [[package]] 2471 | name = "zerocopy" 2472 | version = "0.7.32" 2473 | source = "registry+https://github.com/rust-lang/crates.io-index" 2474 | checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 2475 | dependencies = [ 2476 | "zerocopy-derive", 2477 | ] 2478 | 2479 | [[package]] 2480 | name = "zerocopy-derive" 2481 | version = "0.7.32" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 2484 | dependencies = [ 2485 | "proc-macro2", 2486 | "quote", 2487 | "syn 2.0.52", 2488 | ] 2489 | 2490 | [[package]] 2491 | name = "zeroize" 2492 | version = "1.7.0" 2493 | source = "registry+https://github.com/rust-lang/crates.io-index" 2494 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 2495 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "spellbook" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | axum = "0.7.4" 10 | tokio = { version = "1.36.0", features = ["full"] } 11 | tracing = "0.1" 12 | tracing-subscriber = "0.3.18" 13 | serde = { version = "1", features = ["derive"] } 14 | serde_json = "1" 15 | fred = { version = "8.0", features = ["serde-json", "enable-rustls", "rustls"] } 16 | sqlx = { version = "0.7.3", features = ["postgres", "runtime-tokio", "chrono", "tls-rustls"] } 17 | chrono = { version = "0.4", features = ["serde"]} 18 | names = { version = "0.14.0", default-features = false } 19 | dotenv = "0.15.0" 20 | tower-http = { version = "0.5", features = ["trace"] } 21 | simple-error = "0.3.0" 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Spellbook: A Simple Spell API 2 | 3 | This project is part of the [Dreams of Code](https://youtube.com/@dreamsofcode) video 4 | on caching patterns for handling TTL. 5 | 6 | ## Requirements 7 | 8 | This server is built with Rust, and so requires Rust v1.76. You can install this 9 | using rustup. 10 | 11 | Additionally, the server uses both Redis and PostgreSQL backends for storing data. 12 | 13 | You can deploy an instance yourself locally or use a free instance provided by 14 | Aiven. 15 | 16 | # Running 17 | 18 | First, make sure you have set your`REDIS_URL` and `DATABASE_URL` defined in the .env. 19 | 20 | You can deploy a free instance of both redis and PostgreSQL using the sponsor of this 21 | video: Aiven. 22 | 23 | To do so, head to [https://go.aiven.io/dreamsofcode](https://go.aiven.io/dreamsofcode) 24 | and then sign up. 25 | 26 | You should be then able to create both a redis and PostgreSQL instance at no cost. 27 | 28 | Once configured you can run this server using cargo. 29 | 30 | ``` 31 | cargo run 32 | ``` 33 | -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | // generated by `sqlx migrate build-script` 2 | fn main() { 3 | // trigger recompilation when a new migration is added 4 | println!("cargo:rerun-if-changed=migrations"); 5 | } -------------------------------------------------------------------------------- /migrations/20240309195002_initial.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE spell ( 2 | id bigserial primary key, 3 | name VARCHAR, 4 | damage INT not null, 5 | created_at TIMESTAMPTZ NOT NULL default now(), 6 | updated_at TIMESTAMPTZ NOT NULL default now() 7 | ); 8 | -------------------------------------------------------------------------------- /migrations/20240309202828_data.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO spell (id, name, damage) VALUES 2 | (1, 'Fireball', 30), 3 | (2, 'Ice Shard', 25), 4 | (3, 'Thunderbolt', 35), 5 | (4, 'Earthquake', 40), 6 | (5, 'Healing Light', -25), 7 | (6, 'Arcane Missile', 20), 8 | (7, 'Poison Cloud', 15), 9 | (8, 'Chain Lightning', 45); 10 | -------------------------------------------------------------------------------- /src/handler.rs: -------------------------------------------------------------------------------- 1 | mod create; 2 | mod delete; 3 | mod list; 4 | mod read; 5 | mod update; 6 | 7 | use axum::http::StatusCode; 8 | use axum::{extract::{State, Path}, Json}; 9 | use serde::{Serialize,Deserialize}; 10 | use crate::state::AppState; 11 | use sqlx::FromRow; 12 | 13 | #[derive(Serialize, Deserialize, FromRow, Clone)] 14 | pub struct Spell { 15 | pub id: i64, 16 | pub name: String, 17 | pub damage: i32, 18 | pub created_at: chrono::DateTime, 19 | pub updated_at: chrono::DateTime, 20 | } 21 | 22 | pub async fn list( 23 | State(state): State, 24 | ) -> Result>, StatusCode> { 25 | match list::list_spells(state).await { 26 | Ok(x) => Ok(Json(x)), 27 | Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR), 28 | } 29 | } 30 | 31 | pub async fn read( 32 | State(state): State, 33 | Path(id): Path, 34 | ) -> Result, StatusCode> { 35 | match read::find_by_id(state, id).await { 36 | Ok(x) => match x { 37 | Some(x) => Ok(Json(x)), 38 | None => Err(StatusCode::NOT_FOUND), 39 | }, 40 | Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR), 41 | } 42 | } 43 | 44 | pub async fn create( 45 | State(state): State, 46 | Json(body): Json, 47 | ) -> Result<(StatusCode, Json), StatusCode> { 48 | let res = create::create(state, body).await; 49 | match res { 50 | Ok(x) => Ok((StatusCode::CREATED, Json(x))), 51 | Err(e) => { 52 | tracing::error!("{}", e); 53 | Err(StatusCode::INTERNAL_SERVER_ERROR) 54 | } 55 | } 56 | } 57 | 58 | pub async fn update( 59 | State(state): State, 60 | Path(id): Path, 61 | Json(body): Json, 62 | ) -> StatusCode { 63 | match update::update(state, id, body).await { 64 | Ok(x) => { 65 | match x { 66 | None => StatusCode::NOT_FOUND, 67 | _ => StatusCode::OK, 68 | } 69 | } 70 | Err(_) => StatusCode::INTERNAL_SERVER_ERROR, 71 | } 72 | } 73 | 74 | pub async fn delete( 75 | State(state): State, 76 | Path(id): Path, 77 | ) -> StatusCode { 78 | match delete::delete_spell(state, id).await { 79 | Ok(rows) => { 80 | match rows { 81 | 0 => StatusCode::NOT_FOUND, 82 | _ => StatusCode::OK, 83 | } 84 | }, 85 | Err(_) => StatusCode::INTERNAL_SERVER_ERROR, 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/handler/create.rs: -------------------------------------------------------------------------------- 1 | use crate::handler::Spell; 2 | use crate::state::AppState; 3 | use std::error::Error; 4 | 5 | #[derive(serde::Deserialize)] 6 | pub struct CreateSpellBody { 7 | pub name: String, 8 | pub damage: i32, 9 | } 10 | 11 | static QUERY: &str = " 12 | INSERT INTO spell 13 | (name, damage) 14 | VALUES ($1, $2) 15 | RETURNING (id, name, damage, created_at, updated_at) 16 | "; 17 | 18 | pub async fn create(state: AppState, spell: CreateSpellBody) -> Result> { 19 | let db = &state.lock().await.database; 20 | 21 | let spell = sqlx::query_as(QUERY) 22 | .bind(&spell.name) 23 | .bind(&spell.damage) 24 | .fetch_one(db).await?; 25 | 26 | Ok(spell) 27 | } 28 | -------------------------------------------------------------------------------- /src/handler/delete.rs: -------------------------------------------------------------------------------- 1 | use crate::state::AppState; 2 | use std::error::Error; 3 | 4 | static QUERY: &str = " 5 | DELETE FROM spell WHERE id = $1 6 | "; 7 | 8 | pub async fn delete_spell( 9 | state: AppState, id: i64, 10 | ) -> Result> { 11 | tracing::info!("deleting spell: {}", id); 12 | 13 | let s = state.lock().await; 14 | 15 | let res = sqlx::query(QUERY) 16 | .bind(id) 17 | .execute(&s.database).await?; 18 | 19 | Ok(res.rows_affected()) 20 | } 21 | -------------------------------------------------------------------------------- /src/handler/list.rs: -------------------------------------------------------------------------------- 1 | use crate::handler::Spell; 2 | use crate::state::AppState; 3 | use std::error::Error; 4 | 5 | static QUERY: &str = " 6 | SELECT id, name, damage, created_at, updated_at 7 | FROM spell 8 | "; 9 | 10 | pub async fn list_spells(state: AppState) -> Result, Box> { 11 | let db = &state.lock().await.database; 12 | Ok(sqlx::query_as(QUERY).fetch_all(db).await?) 13 | } 14 | -------------------------------------------------------------------------------- /src/handler/read.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_imports)] 2 | use crate::handler::Spell; 3 | use crate::state::AppState; 4 | use std::error::Error; 5 | use fred::prelude::*; 6 | 7 | static QUERY: &str = " 8 | SELECT id, name, damage, created_at, updated_at 9 | FROM spell 10 | WHERE id = $1 11 | "; 12 | 13 | pub async fn find_by_id( 14 | state: AppState, id: i64, 15 | ) -> Result, Box> { 16 | let s = state.lock().await; 17 | 18 | let res: Option = sqlx::query_as(QUERY) 19 | .bind(id) 20 | .fetch_optional(&s.database).await?; 21 | 22 | tracing::info!("returning database version"); 23 | Ok(res) 24 | } 25 | -------------------------------------------------------------------------------- /src/handler/update.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_imports)] 2 | use crate::state::AppState; 3 | use std::error::Error; 4 | use crate::handler::Spell; 5 | use fred::prelude::*; 6 | 7 | #[derive(serde::Deserialize)] 8 | pub struct UpdateBody { 9 | pub damage: i32 10 | } 11 | 12 | static QUERY: &str = " 13 | UPDATE spell SET damage = $1, updated_at = now() WHERE id = $2 14 | RETURNING id, name, damage, created_at, updated_at 15 | "; 16 | 17 | pub async fn update( 18 | state: AppState, id: i64, body: UpdateBody 19 | ) -> Result, Box> { 20 | tracing::info!("updating spell: {}", id); 21 | 22 | let s = state.lock().await; 23 | 24 | let res: Option = sqlx::query_as(QUERY) 25 | .bind(body.damage) 26 | .bind(id) 27 | .fetch_optional(&s.database).await?; 28 | 29 | Ok(res) 30 | } 31 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod handler; 2 | mod state; 3 | use axum::routing::{delete, get, post, put, Router}; 4 | use std::error::Error; 5 | use sqlx::postgres::PgPoolOptions; 6 | use std::sync::Arc; 7 | use tokio::sync::Mutex; 8 | use dotenv::dotenv; 9 | use fred::prelude::*; 10 | use tower_http::trace::TraceLayer; 11 | 12 | #[tokio::main] 13 | async fn main() -> Result<(), Box> { 14 | dotenv()?; 15 | 16 | // initialize tracing 17 | tracing_subscriber::fmt() 18 | .with_max_level(tracing::Level::INFO) 19 | .init(); 20 | 21 | let pg_url = std::env::var("DATABASE_URL")?; 22 | let redis_url = match std::env::var("REDIS_URL")?.as_str() { 23 | "" => "redis://localhost:5432".to_string(), 24 | x => x.to_string(), 25 | }; 26 | 27 | let dbpool = PgPoolOptions::new() 28 | .max_connections(5) 29 | .connect(&pg_url).await?; 30 | 31 | sqlx::migrate!().run(&dbpool).await?; 32 | 33 | let pool_size = 8; 34 | let config = RedisConfig::from_url(&redis_url)?; 35 | 36 | let redis_pool = Builder::from_config(config) 37 | .with_performance_config(|config| { 38 | config.auto_pipeline = true; 39 | }) 40 | .set_policy(ReconnectPolicy::new_exponential(0, 100, 30_000, 2)) 41 | .build_pool(pool_size) 42 | .expect("Failed to create redis pool"); 43 | 44 | if std::env::var("REDIS_URL")? != "" { 45 | redis_pool.init().await.expect("Failed to connect to redis"); 46 | let _ = redis_pool.flushall::(false).await; 47 | } 48 | 49 | let state = Arc::new( 50 | Mutex::new( 51 | state::StateInternal::new(dbpool, redis_pool) 52 | ) 53 | ); 54 | 55 | // build our application with a route 56 | let app = Router::new() 57 | .route("/spells", post(handler::create)) 58 | .route("/spells", get(handler::list)) 59 | .route("/spells/:id", get(handler::read)) 60 | .route("/spells/:id", put(handler::update)) 61 | .route("/spells/:id", delete(handler::delete)) 62 | .layer(TraceLayer::new_for_http()) 63 | .with_state(state); 64 | 65 | // run our app with hyper, listening globally on port 3000 66 | let listener = tokio::net::TcpListener::bind( 67 | "0.0.0.0:3000", 68 | ).await.unwrap(); 69 | 70 | axum::serve(listener, app).await.unwrap(); 71 | 72 | Ok(()) 73 | } 74 | -------------------------------------------------------------------------------- /src/state.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code)] 2 | use crate::handler::Spell; 3 | use fred::interfaces::KeysInterface; 4 | use fred::{clients::RedisPool, prelude::*}; 5 | use serde_json::Value; 6 | use sqlx::postgres::PgPool; 7 | use std::error::Error; 8 | 9 | pub struct StateInternal { 10 | pub database: sqlx::postgres::PgPool, 11 | pub cache: Cache 12 | } 13 | 14 | impl StateInternal { 15 | pub fn new(db: PgPool, redis: RedisPool) -> Self { 16 | StateInternal{ 17 | database: db, 18 | cache: Cache{ internal: redis }, 19 | } 20 | } 21 | } 22 | 23 | pub struct Cache { 24 | internal: RedisPool, 25 | } 26 | 27 | impl Cache { 28 | fn key_for_id(id: i64) -> String { 29 | format!("spell:{}", id) 30 | } 31 | 32 | pub async fn get(&mut self, id: i64) -> Result, Box> { 33 | if !self.internal.is_connected() { 34 | return Err(Box::new(simple_error::SimpleError::new("not connected redis"))); 35 | } 36 | 37 | let value: Option = self.internal.get(Self::key_for_id(id)).await?; 38 | 39 | let spell = match value { 40 | Some(x) => match serde_json::from_value(x) { 41 | Ok(x) => Some(x), 42 | Err(_) => None, 43 | }, 44 | None => None, 45 | }; 46 | Ok(spell) 47 | } 48 | 49 | pub async fn set( 50 | &mut self, 51 | id: i64, 52 | spell: &Spell, 53 | expiration: Option, 54 | set_opts: Option, 55 | get: bool 56 | ) -> Result<(), Box> { 57 | if !self.internal.is_connected() { 58 | return Err(Box::new(simple_error::SimpleError::new("not connected redis"))); 59 | } 60 | 61 | let value: Value = serde_json::to_value(spell)?; 62 | let key = Self::key_for_id(id); 63 | self.internal.set(key, value.to_string(), expiration, set_opts, get).await?; 64 | Ok(()) 65 | } 66 | 67 | pub async fn del( 68 | &mut self, 69 | id: i64 70 | ) -> Result<(), Box> { 71 | let key = Self::key_for_id(id); 72 | self.internal.del(key).await?; 73 | Ok(()) 74 | } 75 | } 76 | 77 | pub type AppState = std::sync::Arc>; 78 | --------------------------------------------------------------------------------