├── .env ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Makefile ├── Note App.postman_collection.json ├── README.md ├── docker-compose.yml ├── migrations ├── 20230123163655_init.down.sql └── 20230123163655_init.up.sql └── src ├── handler.rs ├── main.rs ├── model.rs └── schema.rs /.env: -------------------------------------------------------------------------------- 1 | MYSQL_DATABASE=rust_sqlx 2 | MYSQL_USER=admin 3 | MYSQL_PASSWORD=password123 4 | MYSQL_ROOT_PASSWORD=password123 5 | 6 | # Don't worry about the placeholders. Rust supports this feature. 7 | DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@localhost:6500/${MYSQL_DATABASE} -------------------------------------------------------------------------------- /.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 = "actix-codec" 7 | version = "0.5.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" 10 | dependencies = [ 11 | "bitflags", 12 | "bytes", 13 | "futures-core", 14 | "futures-sink", 15 | "log", 16 | "memchr", 17 | "pin-project-lite", 18 | "tokio", 19 | "tokio-util", 20 | ] 21 | 22 | [[package]] 23 | name = "actix-cors" 24 | version = "0.6.4" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "b340e9cfa5b08690aae90fb61beb44e9b06f44fe3d0f93781aaa58cfba86245e" 27 | dependencies = [ 28 | "actix-utils", 29 | "actix-web", 30 | "derive_more", 31 | "futures-util", 32 | "log", 33 | "once_cell", 34 | "smallvec", 35 | ] 36 | 37 | [[package]] 38 | name = "actix-http" 39 | version = "3.3.0" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "0070905b2c4a98d184c4e81025253cb192aa8a73827553f38e9410801ceb35bb" 42 | dependencies = [ 43 | "actix-codec", 44 | "actix-rt", 45 | "actix-service", 46 | "actix-utils", 47 | "ahash", 48 | "base64", 49 | "bitflags", 50 | "brotli", 51 | "bytes", 52 | "bytestring", 53 | "derive_more", 54 | "encoding_rs", 55 | "flate2", 56 | "futures-core", 57 | "h2", 58 | "http", 59 | "httparse", 60 | "httpdate", 61 | "itoa", 62 | "language-tags", 63 | "local-channel", 64 | "mime", 65 | "percent-encoding", 66 | "pin-project-lite", 67 | "rand", 68 | "sha1", 69 | "smallvec", 70 | "tokio", 71 | "tokio-util", 72 | "tracing", 73 | "zstd", 74 | ] 75 | 76 | [[package]] 77 | name = "actix-macros" 78 | version = "0.2.3" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" 81 | dependencies = [ 82 | "quote", 83 | "syn", 84 | ] 85 | 86 | [[package]] 87 | name = "actix-router" 88 | version = "0.5.1" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" 91 | dependencies = [ 92 | "bytestring", 93 | "http", 94 | "regex", 95 | "serde", 96 | "tracing", 97 | ] 98 | 99 | [[package]] 100 | name = "actix-rt" 101 | version = "2.8.0" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" 104 | dependencies = [ 105 | "futures-core", 106 | "tokio", 107 | ] 108 | 109 | [[package]] 110 | name = "actix-server" 111 | version = "2.2.0" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" 114 | dependencies = [ 115 | "actix-rt", 116 | "actix-service", 117 | "actix-utils", 118 | "futures-core", 119 | "futures-util", 120 | "mio", 121 | "num_cpus", 122 | "socket2", 123 | "tokio", 124 | "tracing", 125 | ] 126 | 127 | [[package]] 128 | name = "actix-service" 129 | version = "2.0.2" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 132 | dependencies = [ 133 | "futures-core", 134 | "paste", 135 | "pin-project-lite", 136 | ] 137 | 138 | [[package]] 139 | name = "actix-utils" 140 | version = "3.0.1" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 143 | dependencies = [ 144 | "local-waker", 145 | "pin-project-lite", 146 | ] 147 | 148 | [[package]] 149 | name = "actix-web" 150 | version = "4.3.0" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "464e0fddc668ede5f26ec1f9557a8d44eda948732f40c6b0ad79126930eb775f" 153 | dependencies = [ 154 | "actix-codec", 155 | "actix-http", 156 | "actix-macros", 157 | "actix-router", 158 | "actix-rt", 159 | "actix-server", 160 | "actix-service", 161 | "actix-utils", 162 | "actix-web-codegen", 163 | "ahash", 164 | "bytes", 165 | "bytestring", 166 | "cfg-if", 167 | "cookie", 168 | "derive_more", 169 | "encoding_rs", 170 | "futures-core", 171 | "futures-util", 172 | "http", 173 | "itoa", 174 | "language-tags", 175 | "log", 176 | "mime", 177 | "once_cell", 178 | "pin-project-lite", 179 | "regex", 180 | "serde", 181 | "serde_json", 182 | "serde_urlencoded", 183 | "smallvec", 184 | "socket2", 185 | "time 0.3.17", 186 | "url", 187 | ] 188 | 189 | [[package]] 190 | name = "actix-web-codegen" 191 | version = "4.1.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" 194 | dependencies = [ 195 | "actix-router", 196 | "proc-macro2", 197 | "quote", 198 | "syn", 199 | ] 200 | 201 | [[package]] 202 | name = "adler" 203 | version = "1.0.2" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 206 | 207 | [[package]] 208 | name = "ahash" 209 | version = "0.7.6" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 212 | dependencies = [ 213 | "getrandom", 214 | "once_cell", 215 | "version_check", 216 | ] 217 | 218 | [[package]] 219 | name = "aho-corasick" 220 | version = "0.7.20" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 223 | dependencies = [ 224 | "memchr", 225 | ] 226 | 227 | [[package]] 228 | name = "alloc-no-stdlib" 229 | version = "2.0.4" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 232 | 233 | [[package]] 234 | name = "alloc-stdlib" 235 | version = "0.2.2" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 238 | dependencies = [ 239 | "alloc-no-stdlib", 240 | ] 241 | 242 | [[package]] 243 | name = "android_system_properties" 244 | version = "0.1.5" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 247 | dependencies = [ 248 | "libc", 249 | ] 250 | 251 | [[package]] 252 | name = "async-channel" 253 | version = "1.8.0" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" 256 | dependencies = [ 257 | "concurrent-queue", 258 | "event-listener", 259 | "futures-core", 260 | ] 261 | 262 | [[package]] 263 | name = "async-executor" 264 | version = "1.5.0" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" 267 | dependencies = [ 268 | "async-lock", 269 | "async-task", 270 | "concurrent-queue", 271 | "fastrand", 272 | "futures-lite", 273 | "slab", 274 | ] 275 | 276 | [[package]] 277 | name = "async-global-executor" 278 | version = "2.3.1" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" 281 | dependencies = [ 282 | "async-channel", 283 | "async-executor", 284 | "async-io", 285 | "async-lock", 286 | "blocking", 287 | "futures-lite", 288 | "once_cell", 289 | ] 290 | 291 | [[package]] 292 | name = "async-io" 293 | version = "1.12.0" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" 296 | dependencies = [ 297 | "async-lock", 298 | "autocfg", 299 | "concurrent-queue", 300 | "futures-lite", 301 | "libc", 302 | "log", 303 | "parking", 304 | "polling", 305 | "slab", 306 | "socket2", 307 | "waker-fn", 308 | "windows-sys", 309 | ] 310 | 311 | [[package]] 312 | name = "async-lock" 313 | version = "2.6.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" 316 | dependencies = [ 317 | "event-listener", 318 | "futures-lite", 319 | ] 320 | 321 | [[package]] 322 | name = "async-native-tls" 323 | version = "0.4.0" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "d57d4cec3c647232e1094dc013546c0b33ce785d8aeb251e1f20dfaf8a9a13fe" 326 | dependencies = [ 327 | "futures-util", 328 | "native-tls", 329 | "thiserror", 330 | "url", 331 | ] 332 | 333 | [[package]] 334 | name = "async-process" 335 | version = "1.6.0" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "6381ead98388605d0d9ff86371043b5aa922a3905824244de40dc263a14fcba4" 338 | dependencies = [ 339 | "async-io", 340 | "async-lock", 341 | "autocfg", 342 | "blocking", 343 | "cfg-if", 344 | "event-listener", 345 | "futures-lite", 346 | "libc", 347 | "signal-hook", 348 | "windows-sys", 349 | ] 350 | 351 | [[package]] 352 | name = "async-std" 353 | version = "1.12.0" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" 356 | dependencies = [ 357 | "async-channel", 358 | "async-global-executor", 359 | "async-io", 360 | "async-lock", 361 | "async-process", 362 | "crossbeam-utils", 363 | "futures-channel", 364 | "futures-core", 365 | "futures-io", 366 | "futures-lite", 367 | "gloo-timers", 368 | "kv-log-macro", 369 | "log", 370 | "memchr", 371 | "once_cell", 372 | "pin-project-lite", 373 | "pin-utils", 374 | "slab", 375 | "wasm-bindgen-futures", 376 | ] 377 | 378 | [[package]] 379 | name = "async-task" 380 | version = "4.3.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" 383 | 384 | [[package]] 385 | name = "atoi" 386 | version = "1.0.0" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" 389 | dependencies = [ 390 | "num-traits", 391 | ] 392 | 393 | [[package]] 394 | name = "atomic-waker" 395 | version = "1.1.0" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" 398 | 399 | [[package]] 400 | name = "autocfg" 401 | version = "1.1.0" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 404 | 405 | [[package]] 406 | name = "base64" 407 | version = "0.21.0" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 410 | 411 | [[package]] 412 | name = "base64ct" 413 | version = "1.5.3" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" 416 | 417 | [[package]] 418 | name = "bitflags" 419 | version = "1.3.2" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 422 | 423 | [[package]] 424 | name = "block-buffer" 425 | version = "0.10.3" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 428 | dependencies = [ 429 | "generic-array", 430 | ] 431 | 432 | [[package]] 433 | name = "blocking" 434 | version = "1.3.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" 437 | dependencies = [ 438 | "async-channel", 439 | "async-lock", 440 | "async-task", 441 | "atomic-waker", 442 | "fastrand", 443 | "futures-lite", 444 | ] 445 | 446 | [[package]] 447 | name = "brotli" 448 | version = "3.3.4" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 451 | dependencies = [ 452 | "alloc-no-stdlib", 453 | "alloc-stdlib", 454 | "brotli-decompressor", 455 | ] 456 | 457 | [[package]] 458 | name = "brotli-decompressor" 459 | version = "2.3.4" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" 462 | dependencies = [ 463 | "alloc-no-stdlib", 464 | "alloc-stdlib", 465 | ] 466 | 467 | [[package]] 468 | name = "bumpalo" 469 | version = "3.12.0" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 472 | 473 | [[package]] 474 | name = "byteorder" 475 | version = "1.4.3" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 478 | 479 | [[package]] 480 | name = "bytes" 481 | version = "1.3.0" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" 484 | 485 | [[package]] 486 | name = "bytestring" 487 | version = "1.2.0" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "f7f83e57d9154148e355404702e2694463241880b939570d7c97c014da7a69a1" 490 | dependencies = [ 491 | "bytes", 492 | ] 493 | 494 | [[package]] 495 | name = "cc" 496 | version = "1.0.78" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" 499 | dependencies = [ 500 | "jobserver", 501 | ] 502 | 503 | [[package]] 504 | name = "cfg-if" 505 | version = "1.0.0" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 508 | 509 | [[package]] 510 | name = "chrono" 511 | version = "0.4.23" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" 514 | dependencies = [ 515 | "iana-time-zone", 516 | "js-sys", 517 | "num-integer", 518 | "num-traits", 519 | "serde", 520 | "time 0.1.45", 521 | "wasm-bindgen", 522 | "winapi", 523 | ] 524 | 525 | [[package]] 526 | name = "codespan-reporting" 527 | version = "0.11.1" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 530 | dependencies = [ 531 | "termcolor", 532 | "unicode-width", 533 | ] 534 | 535 | [[package]] 536 | name = "concurrent-queue" 537 | version = "2.1.0" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" 540 | dependencies = [ 541 | "crossbeam-utils", 542 | ] 543 | 544 | [[package]] 545 | name = "const-oid" 546 | version = "0.7.1" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" 549 | 550 | [[package]] 551 | name = "convert_case" 552 | version = "0.4.0" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 555 | 556 | [[package]] 557 | name = "cookie" 558 | version = "0.16.2" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" 561 | dependencies = [ 562 | "percent-encoding", 563 | "time 0.3.17", 564 | "version_check", 565 | ] 566 | 567 | [[package]] 568 | name = "core-foundation" 569 | version = "0.9.3" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 572 | dependencies = [ 573 | "core-foundation-sys", 574 | "libc", 575 | ] 576 | 577 | [[package]] 578 | name = "core-foundation-sys" 579 | version = "0.8.3" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 582 | 583 | [[package]] 584 | name = "cpufeatures" 585 | version = "0.2.5" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 588 | dependencies = [ 589 | "libc", 590 | ] 591 | 592 | [[package]] 593 | name = "crc" 594 | version = "3.0.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" 597 | dependencies = [ 598 | "crc-catalog", 599 | ] 600 | 601 | [[package]] 602 | name = "crc-catalog" 603 | version = "2.2.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" 606 | 607 | [[package]] 608 | name = "crc32fast" 609 | version = "1.3.2" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 612 | dependencies = [ 613 | "cfg-if", 614 | ] 615 | 616 | [[package]] 617 | name = "crossbeam-queue" 618 | version = "0.3.8" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" 621 | dependencies = [ 622 | "cfg-if", 623 | "crossbeam-utils", 624 | ] 625 | 626 | [[package]] 627 | name = "crossbeam-utils" 628 | version = "0.8.14" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" 631 | dependencies = [ 632 | "cfg-if", 633 | ] 634 | 635 | [[package]] 636 | name = "crypto-bigint" 637 | version = "0.3.2" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" 640 | dependencies = [ 641 | "generic-array", 642 | "subtle", 643 | ] 644 | 645 | [[package]] 646 | name = "crypto-common" 647 | version = "0.1.6" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 650 | dependencies = [ 651 | "generic-array", 652 | "typenum", 653 | ] 654 | 655 | [[package]] 656 | name = "ctor" 657 | version = "0.1.26" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" 660 | dependencies = [ 661 | "quote", 662 | "syn", 663 | ] 664 | 665 | [[package]] 666 | name = "cxx" 667 | version = "1.0.87" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "b61a7545f753a88bcbe0a70de1fcc0221e10bfc752f576754fa91e663db1622e" 670 | dependencies = [ 671 | "cc", 672 | "cxxbridge-flags", 673 | "cxxbridge-macro", 674 | "link-cplusplus", 675 | ] 676 | 677 | [[package]] 678 | name = "cxx-build" 679 | version = "1.0.87" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "f464457d494b5ed6905c63b0c4704842aba319084a0a3561cdc1359536b53200" 682 | dependencies = [ 683 | "cc", 684 | "codespan-reporting", 685 | "once_cell", 686 | "proc-macro2", 687 | "quote", 688 | "scratch", 689 | "syn", 690 | ] 691 | 692 | [[package]] 693 | name = "cxxbridge-flags" 694 | version = "1.0.87" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | checksum = "43c7119ce3a3701ed81aca8410b9acf6fc399d2629d057b87e2efa4e63a3aaea" 697 | 698 | [[package]] 699 | name = "cxxbridge-macro" 700 | version = "1.0.87" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | checksum = "65e07508b90551e610910fa648a1878991d367064997a596135b86df30daf07e" 703 | dependencies = [ 704 | "proc-macro2", 705 | "quote", 706 | "syn", 707 | ] 708 | 709 | [[package]] 710 | name = "der" 711 | version = "0.5.1" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" 714 | dependencies = [ 715 | "const-oid", 716 | "crypto-bigint", 717 | "pem-rfc7468", 718 | ] 719 | 720 | [[package]] 721 | name = "derive_more" 722 | version = "0.99.17" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 725 | dependencies = [ 726 | "convert_case", 727 | "proc-macro2", 728 | "quote", 729 | "rustc_version", 730 | "syn", 731 | ] 732 | 733 | [[package]] 734 | name = "digest" 735 | version = "0.10.6" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 738 | dependencies = [ 739 | "block-buffer", 740 | "crypto-common", 741 | ] 742 | 743 | [[package]] 744 | name = "dotenv" 745 | version = "0.15.0" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 748 | 749 | [[package]] 750 | name = "dotenvy" 751 | version = "0.15.6" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" 754 | 755 | [[package]] 756 | name = "either" 757 | version = "1.8.0" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 760 | 761 | [[package]] 762 | name = "encoding_rs" 763 | version = "0.8.31" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 766 | dependencies = [ 767 | "cfg-if", 768 | ] 769 | 770 | [[package]] 771 | name = "env_logger" 772 | version = "0.10.0" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" 775 | dependencies = [ 776 | "humantime", 777 | "is-terminal", 778 | "log", 779 | "regex", 780 | "termcolor", 781 | ] 782 | 783 | [[package]] 784 | name = "errno" 785 | version = "0.2.8" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 788 | dependencies = [ 789 | "errno-dragonfly", 790 | "libc", 791 | "winapi", 792 | ] 793 | 794 | [[package]] 795 | name = "errno-dragonfly" 796 | version = "0.1.2" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 799 | dependencies = [ 800 | "cc", 801 | "libc", 802 | ] 803 | 804 | [[package]] 805 | name = "event-listener" 806 | version = "2.5.3" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 809 | 810 | [[package]] 811 | name = "fastrand" 812 | version = "1.8.0" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 815 | dependencies = [ 816 | "instant", 817 | ] 818 | 819 | [[package]] 820 | name = "flate2" 821 | version = "1.0.25" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" 824 | dependencies = [ 825 | "crc32fast", 826 | "miniz_oxide", 827 | ] 828 | 829 | [[package]] 830 | name = "fnv" 831 | version = "1.0.7" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 834 | 835 | [[package]] 836 | name = "foreign-types" 837 | version = "0.3.2" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 840 | dependencies = [ 841 | "foreign-types-shared", 842 | ] 843 | 844 | [[package]] 845 | name = "foreign-types-shared" 846 | version = "0.1.1" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 849 | 850 | [[package]] 851 | name = "form_urlencoded" 852 | version = "1.1.0" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 855 | dependencies = [ 856 | "percent-encoding", 857 | ] 858 | 859 | [[package]] 860 | name = "futures-channel" 861 | version = "0.3.25" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" 864 | dependencies = [ 865 | "futures-core", 866 | "futures-sink", 867 | ] 868 | 869 | [[package]] 870 | name = "futures-core" 871 | version = "0.3.25" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" 874 | 875 | [[package]] 876 | name = "futures-intrusive" 877 | version = "0.4.2" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" 880 | dependencies = [ 881 | "futures-core", 882 | "lock_api", 883 | "parking_lot 0.11.2", 884 | ] 885 | 886 | [[package]] 887 | name = "futures-io" 888 | version = "0.3.25" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" 891 | 892 | [[package]] 893 | name = "futures-lite" 894 | version = "1.12.0" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" 897 | dependencies = [ 898 | "fastrand", 899 | "futures-core", 900 | "futures-io", 901 | "memchr", 902 | "parking", 903 | "pin-project-lite", 904 | "waker-fn", 905 | ] 906 | 907 | [[package]] 908 | name = "futures-macro" 909 | version = "0.3.25" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" 912 | dependencies = [ 913 | "proc-macro2", 914 | "quote", 915 | "syn", 916 | ] 917 | 918 | [[package]] 919 | name = "futures-sink" 920 | version = "0.3.25" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" 923 | 924 | [[package]] 925 | name = "futures-task" 926 | version = "0.3.25" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" 929 | 930 | [[package]] 931 | name = "futures-util" 932 | version = "0.3.25" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" 935 | dependencies = [ 936 | "futures-core", 937 | "futures-io", 938 | "futures-macro", 939 | "futures-sink", 940 | "futures-task", 941 | "memchr", 942 | "pin-project-lite", 943 | "pin-utils", 944 | "slab", 945 | ] 946 | 947 | [[package]] 948 | name = "generic-array" 949 | version = "0.14.6" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 952 | dependencies = [ 953 | "typenum", 954 | "version_check", 955 | ] 956 | 957 | [[package]] 958 | name = "getrandom" 959 | version = "0.2.8" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 962 | dependencies = [ 963 | "cfg-if", 964 | "libc", 965 | "wasi 0.11.0+wasi-snapshot-preview1", 966 | ] 967 | 968 | [[package]] 969 | name = "gloo-timers" 970 | version = "0.2.6" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" 973 | dependencies = [ 974 | "futures-channel", 975 | "futures-core", 976 | "js-sys", 977 | "wasm-bindgen", 978 | ] 979 | 980 | [[package]] 981 | name = "h2" 982 | version = "0.3.15" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" 985 | dependencies = [ 986 | "bytes", 987 | "fnv", 988 | "futures-core", 989 | "futures-sink", 990 | "futures-util", 991 | "http", 992 | "indexmap", 993 | "slab", 994 | "tokio", 995 | "tokio-util", 996 | "tracing", 997 | ] 998 | 999 | [[package]] 1000 | name = "hashbrown" 1001 | version = "0.12.3" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1004 | dependencies = [ 1005 | "ahash", 1006 | ] 1007 | 1008 | [[package]] 1009 | name = "hashlink" 1010 | version = "0.8.1" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" 1013 | dependencies = [ 1014 | "hashbrown", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "heck" 1019 | version = "0.4.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1022 | dependencies = [ 1023 | "unicode-segmentation", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "hermit-abi" 1028 | version = "0.2.6" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 1031 | dependencies = [ 1032 | "libc", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "hex" 1037 | version = "0.4.3" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1040 | 1041 | [[package]] 1042 | name = "http" 1043 | version = "0.2.8" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1046 | dependencies = [ 1047 | "bytes", 1048 | "fnv", 1049 | "itoa", 1050 | ] 1051 | 1052 | [[package]] 1053 | name = "httparse" 1054 | version = "1.8.0" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1057 | 1058 | [[package]] 1059 | name = "httpdate" 1060 | version = "1.0.2" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1063 | 1064 | [[package]] 1065 | name = "humantime" 1066 | version = "2.1.0" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 1069 | 1070 | [[package]] 1071 | name = "iana-time-zone" 1072 | version = "0.1.53" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" 1075 | dependencies = [ 1076 | "android_system_properties", 1077 | "core-foundation-sys", 1078 | "iana-time-zone-haiku", 1079 | "js-sys", 1080 | "wasm-bindgen", 1081 | "winapi", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "iana-time-zone-haiku" 1086 | version = "0.1.1" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" 1089 | dependencies = [ 1090 | "cxx", 1091 | "cxx-build", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "idna" 1096 | version = "0.3.0" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 1099 | dependencies = [ 1100 | "unicode-bidi", 1101 | "unicode-normalization", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "indexmap" 1106 | version = "1.9.2" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 1109 | dependencies = [ 1110 | "autocfg", 1111 | "hashbrown", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "instant" 1116 | version = "0.1.12" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1119 | dependencies = [ 1120 | "cfg-if", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "io-lifetimes" 1125 | version = "1.0.4" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" 1128 | dependencies = [ 1129 | "libc", 1130 | "windows-sys", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "is-terminal" 1135 | version = "0.4.2" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" 1138 | dependencies = [ 1139 | "hermit-abi", 1140 | "io-lifetimes", 1141 | "rustix", 1142 | "windows-sys", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "itertools" 1147 | version = "0.10.5" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1150 | dependencies = [ 1151 | "either", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "itoa" 1156 | version = "1.0.5" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 1159 | 1160 | [[package]] 1161 | name = "jobserver" 1162 | version = "0.1.25" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" 1165 | dependencies = [ 1166 | "libc", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "js-sys" 1171 | version = "0.3.60" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 1174 | dependencies = [ 1175 | "wasm-bindgen", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "kv-log-macro" 1180 | version = "1.0.7" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" 1183 | dependencies = [ 1184 | "log", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "language-tags" 1189 | version = "0.3.2" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1192 | 1193 | [[package]] 1194 | name = "lazy_static" 1195 | version = "1.4.0" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1198 | dependencies = [ 1199 | "spin", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "libc" 1204 | version = "0.2.139" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" 1207 | 1208 | [[package]] 1209 | name = "libm" 1210 | version = "0.2.6" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" 1213 | 1214 | [[package]] 1215 | name = "link-cplusplus" 1216 | version = "1.0.8" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" 1219 | dependencies = [ 1220 | "cc", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "linux-raw-sys" 1225 | version = "0.1.4" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 1228 | 1229 | [[package]] 1230 | name = "local-channel" 1231 | version = "0.1.3" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" 1234 | dependencies = [ 1235 | "futures-core", 1236 | "futures-sink", 1237 | "futures-util", 1238 | "local-waker", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "local-waker" 1243 | version = "0.1.3" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" 1246 | 1247 | [[package]] 1248 | name = "lock_api" 1249 | version = "0.4.9" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1252 | dependencies = [ 1253 | "autocfg", 1254 | "scopeguard", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "log" 1259 | version = "0.4.17" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1262 | dependencies = [ 1263 | "cfg-if", 1264 | "value-bag", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "memchr" 1269 | version = "2.5.0" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1272 | 1273 | [[package]] 1274 | name = "mime" 1275 | version = "0.3.16" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1278 | 1279 | [[package]] 1280 | name = "minimal-lexical" 1281 | version = "0.2.1" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1284 | 1285 | [[package]] 1286 | name = "miniz_oxide" 1287 | version = "0.6.2" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 1290 | dependencies = [ 1291 | "adler", 1292 | ] 1293 | 1294 | [[package]] 1295 | name = "mio" 1296 | version = "0.8.5" 1297 | source = "registry+https://github.com/rust-lang/crates.io-index" 1298 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" 1299 | dependencies = [ 1300 | "libc", 1301 | "log", 1302 | "wasi 0.11.0+wasi-snapshot-preview1", 1303 | "windows-sys", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "native-tls" 1308 | version = "0.2.11" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1311 | dependencies = [ 1312 | "lazy_static", 1313 | "libc", 1314 | "log", 1315 | "openssl", 1316 | "openssl-probe", 1317 | "openssl-sys", 1318 | "schannel", 1319 | "security-framework", 1320 | "security-framework-sys", 1321 | "tempfile", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "nom" 1326 | version = "7.1.3" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1329 | dependencies = [ 1330 | "memchr", 1331 | "minimal-lexical", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "num-bigint" 1336 | version = "0.4.3" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" 1339 | dependencies = [ 1340 | "autocfg", 1341 | "num-integer", 1342 | "num-traits", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "num-bigint-dig" 1347 | version = "0.8.2" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "2399c9463abc5f909349d8aa9ba080e0b88b3ce2885389b60b993f39b1a56905" 1350 | dependencies = [ 1351 | "byteorder", 1352 | "lazy_static", 1353 | "libm", 1354 | "num-integer", 1355 | "num-iter", 1356 | "num-traits", 1357 | "rand", 1358 | "smallvec", 1359 | "zeroize", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "num-integer" 1364 | version = "0.1.45" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1367 | dependencies = [ 1368 | "autocfg", 1369 | "num-traits", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "num-iter" 1374 | version = "0.1.43" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1377 | dependencies = [ 1378 | "autocfg", 1379 | "num-integer", 1380 | "num-traits", 1381 | ] 1382 | 1383 | [[package]] 1384 | name = "num-traits" 1385 | version = "0.2.15" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1388 | dependencies = [ 1389 | "autocfg", 1390 | "libm", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "num_cpus" 1395 | version = "1.15.0" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 1398 | dependencies = [ 1399 | "hermit-abi", 1400 | "libc", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "once_cell" 1405 | version = "1.17.0" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" 1408 | 1409 | [[package]] 1410 | name = "openssl" 1411 | version = "0.10.45" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" 1414 | dependencies = [ 1415 | "bitflags", 1416 | "cfg-if", 1417 | "foreign-types", 1418 | "libc", 1419 | "once_cell", 1420 | "openssl-macros", 1421 | "openssl-sys", 1422 | ] 1423 | 1424 | [[package]] 1425 | name = "openssl-macros" 1426 | version = "0.1.0" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 1429 | dependencies = [ 1430 | "proc-macro2", 1431 | "quote", 1432 | "syn", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "openssl-probe" 1437 | version = "0.1.5" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1440 | 1441 | [[package]] 1442 | name = "openssl-sys" 1443 | version = "0.9.80" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" 1446 | dependencies = [ 1447 | "autocfg", 1448 | "cc", 1449 | "libc", 1450 | "pkg-config", 1451 | "vcpkg", 1452 | ] 1453 | 1454 | [[package]] 1455 | name = "parking" 1456 | version = "2.0.0" 1457 | source = "registry+https://github.com/rust-lang/crates.io-index" 1458 | checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" 1459 | 1460 | [[package]] 1461 | name = "parking_lot" 1462 | version = "0.11.2" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1465 | dependencies = [ 1466 | "instant", 1467 | "lock_api", 1468 | "parking_lot_core 0.8.6", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "parking_lot" 1473 | version = "0.12.1" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1476 | dependencies = [ 1477 | "lock_api", 1478 | "parking_lot_core 0.9.6", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "parking_lot_core" 1483 | version = "0.8.6" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" 1486 | dependencies = [ 1487 | "cfg-if", 1488 | "instant", 1489 | "libc", 1490 | "redox_syscall", 1491 | "smallvec", 1492 | "winapi", 1493 | ] 1494 | 1495 | [[package]] 1496 | name = "parking_lot_core" 1497 | version = "0.9.6" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" 1500 | dependencies = [ 1501 | "cfg-if", 1502 | "libc", 1503 | "redox_syscall", 1504 | "smallvec", 1505 | "windows-sys", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "paste" 1510 | version = "1.0.11" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" 1513 | 1514 | [[package]] 1515 | name = "pem-rfc7468" 1516 | version = "0.3.1" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "01de5d978f34aa4b2296576379fcc416034702fd94117c56ffd8a1a767cefb30" 1519 | dependencies = [ 1520 | "base64ct", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "percent-encoding" 1525 | version = "2.2.0" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 1528 | 1529 | [[package]] 1530 | name = "pin-project-lite" 1531 | version = "0.2.9" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1534 | 1535 | [[package]] 1536 | name = "pin-utils" 1537 | version = "0.1.0" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1540 | 1541 | [[package]] 1542 | name = "pkcs1" 1543 | version = "0.3.3" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "a78f66c04ccc83dd4486fd46c33896f4e17b24a7a3a6400dedc48ed0ddd72320" 1546 | dependencies = [ 1547 | "der", 1548 | "pkcs8", 1549 | "zeroize", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "pkcs8" 1554 | version = "0.8.0" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" 1557 | dependencies = [ 1558 | "der", 1559 | "spki", 1560 | "zeroize", 1561 | ] 1562 | 1563 | [[package]] 1564 | name = "pkg-config" 1565 | version = "0.3.26" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 1568 | 1569 | [[package]] 1570 | name = "polling" 1571 | version = "2.5.2" 1572 | source = "registry+https://github.com/rust-lang/crates.io-index" 1573 | checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" 1574 | dependencies = [ 1575 | "autocfg", 1576 | "cfg-if", 1577 | "libc", 1578 | "log", 1579 | "wepoll-ffi", 1580 | "windows-sys", 1581 | ] 1582 | 1583 | [[package]] 1584 | name = "ppv-lite86" 1585 | version = "0.2.17" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1588 | 1589 | [[package]] 1590 | name = "proc-macro2" 1591 | version = "1.0.50" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" 1594 | dependencies = [ 1595 | "unicode-ident", 1596 | ] 1597 | 1598 | [[package]] 1599 | name = "quote" 1600 | version = "1.0.23" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 1603 | dependencies = [ 1604 | "proc-macro2", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "rand" 1609 | version = "0.8.5" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1612 | dependencies = [ 1613 | "libc", 1614 | "rand_chacha", 1615 | "rand_core", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "rand_chacha" 1620 | version = "0.3.1" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1623 | dependencies = [ 1624 | "ppv-lite86", 1625 | "rand_core", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "rand_core" 1630 | version = "0.6.4" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1633 | dependencies = [ 1634 | "getrandom", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "redox_syscall" 1639 | version = "0.2.16" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1642 | dependencies = [ 1643 | "bitflags", 1644 | ] 1645 | 1646 | [[package]] 1647 | name = "regex" 1648 | version = "1.7.1" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" 1651 | dependencies = [ 1652 | "aho-corasick", 1653 | "memchr", 1654 | "regex-syntax", 1655 | ] 1656 | 1657 | [[package]] 1658 | name = "regex-syntax" 1659 | version = "0.6.28" 1660 | source = "registry+https://github.com/rust-lang/crates.io-index" 1661 | checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" 1662 | 1663 | [[package]] 1664 | name = "remove_dir_all" 1665 | version = "0.5.3" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1668 | dependencies = [ 1669 | "winapi", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "rsa" 1674 | version = "0.6.1" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "4cf22754c49613d2b3b119f0e5d46e34a2c628a937e3024b8762de4e7d8c710b" 1677 | dependencies = [ 1678 | "byteorder", 1679 | "digest", 1680 | "num-bigint-dig", 1681 | "num-integer", 1682 | "num-iter", 1683 | "num-traits", 1684 | "pkcs1", 1685 | "pkcs8", 1686 | "rand_core", 1687 | "smallvec", 1688 | "subtle", 1689 | "zeroize", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "rust-mysql-crud-sqlx" 1694 | version = "0.1.0" 1695 | dependencies = [ 1696 | "actix-cors", 1697 | "actix-web", 1698 | "chrono", 1699 | "dotenv", 1700 | "env_logger", 1701 | "serde", 1702 | "serde_json", 1703 | "sqlx", 1704 | "uuid", 1705 | ] 1706 | 1707 | [[package]] 1708 | name = "rustc_version" 1709 | version = "0.4.0" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1712 | dependencies = [ 1713 | "semver", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "rustix" 1718 | version = "0.36.7" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" 1721 | dependencies = [ 1722 | "bitflags", 1723 | "errno", 1724 | "io-lifetimes", 1725 | "libc", 1726 | "linux-raw-sys", 1727 | "windows-sys", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "ryu" 1732 | version = "1.0.12" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 1735 | 1736 | [[package]] 1737 | name = "schannel" 1738 | version = "0.1.21" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 1741 | dependencies = [ 1742 | "windows-sys", 1743 | ] 1744 | 1745 | [[package]] 1746 | name = "scopeguard" 1747 | version = "1.1.0" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1750 | 1751 | [[package]] 1752 | name = "scratch" 1753 | version = "1.0.3" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" 1756 | 1757 | [[package]] 1758 | name = "security-framework" 1759 | version = "2.8.0" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "645926f31b250a2dca3c232496c2d898d91036e45ca0e97e0e2390c54e11be36" 1762 | dependencies = [ 1763 | "bitflags", 1764 | "core-foundation", 1765 | "core-foundation-sys", 1766 | "libc", 1767 | "security-framework-sys", 1768 | ] 1769 | 1770 | [[package]] 1771 | name = "security-framework-sys" 1772 | version = "2.8.0" 1773 | source = "registry+https://github.com/rust-lang/crates.io-index" 1774 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 1775 | dependencies = [ 1776 | "core-foundation-sys", 1777 | "libc", 1778 | ] 1779 | 1780 | [[package]] 1781 | name = "semver" 1782 | version = "1.0.16" 1783 | source = "registry+https://github.com/rust-lang/crates.io-index" 1784 | checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" 1785 | 1786 | [[package]] 1787 | name = "serde" 1788 | version = "1.0.152" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" 1791 | dependencies = [ 1792 | "serde_derive", 1793 | ] 1794 | 1795 | [[package]] 1796 | name = "serde_derive" 1797 | version = "1.0.152" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" 1800 | dependencies = [ 1801 | "proc-macro2", 1802 | "quote", 1803 | "syn", 1804 | ] 1805 | 1806 | [[package]] 1807 | name = "serde_json" 1808 | version = "1.0.91" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" 1811 | dependencies = [ 1812 | "itoa", 1813 | "ryu", 1814 | "serde", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "serde_urlencoded" 1819 | version = "0.7.1" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1822 | dependencies = [ 1823 | "form_urlencoded", 1824 | "itoa", 1825 | "ryu", 1826 | "serde", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "sha1" 1831 | version = "0.10.5" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 1834 | dependencies = [ 1835 | "cfg-if", 1836 | "cpufeatures", 1837 | "digest", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "sha2" 1842 | version = "0.10.6" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 1845 | dependencies = [ 1846 | "cfg-if", 1847 | "cpufeatures", 1848 | "digest", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "signal-hook" 1853 | version = "0.3.14" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" 1856 | dependencies = [ 1857 | "libc", 1858 | "signal-hook-registry", 1859 | ] 1860 | 1861 | [[package]] 1862 | name = "signal-hook-registry" 1863 | version = "1.4.0" 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" 1865 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 1866 | dependencies = [ 1867 | "libc", 1868 | ] 1869 | 1870 | [[package]] 1871 | name = "slab" 1872 | version = "0.4.7" 1873 | source = "registry+https://github.com/rust-lang/crates.io-index" 1874 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 1875 | dependencies = [ 1876 | "autocfg", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "smallvec" 1881 | version = "1.10.0" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 1884 | 1885 | [[package]] 1886 | name = "socket2" 1887 | version = "0.4.7" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1890 | dependencies = [ 1891 | "libc", 1892 | "winapi", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "spin" 1897 | version = "0.5.2" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1900 | 1901 | [[package]] 1902 | name = "spki" 1903 | version = "0.5.4" 1904 | source = "registry+https://github.com/rust-lang/crates.io-index" 1905 | checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" 1906 | dependencies = [ 1907 | "base64ct", 1908 | "der", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "sqlformat" 1913 | version = "0.2.1" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" 1916 | dependencies = [ 1917 | "itertools", 1918 | "nom", 1919 | "unicode_categories", 1920 | ] 1921 | 1922 | [[package]] 1923 | name = "sqlx" 1924 | version = "0.6.2" 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" 1926 | checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428" 1927 | dependencies = [ 1928 | "sqlx-core", 1929 | "sqlx-macros", 1930 | ] 1931 | 1932 | [[package]] 1933 | name = "sqlx-core" 1934 | version = "0.6.2" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" 1937 | dependencies = [ 1938 | "ahash", 1939 | "atoi", 1940 | "bitflags", 1941 | "byteorder", 1942 | "bytes", 1943 | "chrono", 1944 | "crc", 1945 | "crossbeam-queue", 1946 | "digest", 1947 | "dotenvy", 1948 | "either", 1949 | "event-listener", 1950 | "futures-channel", 1951 | "futures-core", 1952 | "futures-intrusive", 1953 | "futures-util", 1954 | "generic-array", 1955 | "hashlink", 1956 | "hex", 1957 | "indexmap", 1958 | "itoa", 1959 | "libc", 1960 | "log", 1961 | "memchr", 1962 | "num-bigint", 1963 | "once_cell", 1964 | "paste", 1965 | "percent-encoding", 1966 | "rand", 1967 | "rsa", 1968 | "sha1", 1969 | "sha2", 1970 | "smallvec", 1971 | "sqlformat", 1972 | "sqlx-rt", 1973 | "stringprep", 1974 | "thiserror", 1975 | "url", 1976 | "uuid", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "sqlx-macros" 1981 | version = "0.6.2" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" 1984 | dependencies = [ 1985 | "dotenvy", 1986 | "either", 1987 | "heck", 1988 | "once_cell", 1989 | "proc-macro2", 1990 | "quote", 1991 | "sha2", 1992 | "sqlx-core", 1993 | "sqlx-rt", 1994 | "syn", 1995 | "url", 1996 | ] 1997 | 1998 | [[package]] 1999 | name = "sqlx-rt" 2000 | version = "0.6.2" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" 2003 | dependencies = [ 2004 | "async-native-tls", 2005 | "async-std", 2006 | "native-tls", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "stringprep" 2011 | version = "0.1.2" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" 2014 | dependencies = [ 2015 | "unicode-bidi", 2016 | "unicode-normalization", 2017 | ] 2018 | 2019 | [[package]] 2020 | name = "subtle" 2021 | version = "2.4.1" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 2024 | 2025 | [[package]] 2026 | name = "syn" 2027 | version = "1.0.107" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" 2030 | dependencies = [ 2031 | "proc-macro2", 2032 | "quote", 2033 | "unicode-ident", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "tempfile" 2038 | version = "3.3.0" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 2041 | dependencies = [ 2042 | "cfg-if", 2043 | "fastrand", 2044 | "libc", 2045 | "redox_syscall", 2046 | "remove_dir_all", 2047 | "winapi", 2048 | ] 2049 | 2050 | [[package]] 2051 | name = "termcolor" 2052 | version = "1.2.0" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 2055 | dependencies = [ 2056 | "winapi-util", 2057 | ] 2058 | 2059 | [[package]] 2060 | name = "thiserror" 2061 | version = "1.0.38" 2062 | source = "registry+https://github.com/rust-lang/crates.io-index" 2063 | checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" 2064 | dependencies = [ 2065 | "thiserror-impl", 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "thiserror-impl" 2070 | version = "1.0.38" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" 2073 | dependencies = [ 2074 | "proc-macro2", 2075 | "quote", 2076 | "syn", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "time" 2081 | version = "0.1.45" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" 2084 | dependencies = [ 2085 | "libc", 2086 | "wasi 0.10.0+wasi-snapshot-preview1", 2087 | "winapi", 2088 | ] 2089 | 2090 | [[package]] 2091 | name = "time" 2092 | version = "0.3.17" 2093 | source = "registry+https://github.com/rust-lang/crates.io-index" 2094 | checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" 2095 | dependencies = [ 2096 | "itoa", 2097 | "serde", 2098 | "time-core", 2099 | "time-macros", 2100 | ] 2101 | 2102 | [[package]] 2103 | name = "time-core" 2104 | version = "0.1.0" 2105 | source = "registry+https://github.com/rust-lang/crates.io-index" 2106 | checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" 2107 | 2108 | [[package]] 2109 | name = "time-macros" 2110 | version = "0.2.6" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" 2113 | dependencies = [ 2114 | "time-core", 2115 | ] 2116 | 2117 | [[package]] 2118 | name = "tinyvec" 2119 | version = "1.6.0" 2120 | source = "registry+https://github.com/rust-lang/crates.io-index" 2121 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2122 | dependencies = [ 2123 | "tinyvec_macros", 2124 | ] 2125 | 2126 | [[package]] 2127 | name = "tinyvec_macros" 2128 | version = "0.1.0" 2129 | source = "registry+https://github.com/rust-lang/crates.io-index" 2130 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2131 | 2132 | [[package]] 2133 | name = "tokio" 2134 | version = "1.24.2" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" 2137 | dependencies = [ 2138 | "autocfg", 2139 | "bytes", 2140 | "libc", 2141 | "memchr", 2142 | "mio", 2143 | "parking_lot 0.12.1", 2144 | "pin-project-lite", 2145 | "signal-hook-registry", 2146 | "socket2", 2147 | "windows-sys", 2148 | ] 2149 | 2150 | [[package]] 2151 | name = "tokio-util" 2152 | version = "0.7.4" 2153 | source = "registry+https://github.com/rust-lang/crates.io-index" 2154 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 2155 | dependencies = [ 2156 | "bytes", 2157 | "futures-core", 2158 | "futures-sink", 2159 | "pin-project-lite", 2160 | "tokio", 2161 | "tracing", 2162 | ] 2163 | 2164 | [[package]] 2165 | name = "tracing" 2166 | version = "0.1.37" 2167 | source = "registry+https://github.com/rust-lang/crates.io-index" 2168 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 2169 | dependencies = [ 2170 | "cfg-if", 2171 | "log", 2172 | "pin-project-lite", 2173 | "tracing-core", 2174 | ] 2175 | 2176 | [[package]] 2177 | name = "tracing-core" 2178 | version = "0.1.30" 2179 | source = "registry+https://github.com/rust-lang/crates.io-index" 2180 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 2181 | dependencies = [ 2182 | "once_cell", 2183 | ] 2184 | 2185 | [[package]] 2186 | name = "typenum" 2187 | version = "1.16.0" 2188 | source = "registry+https://github.com/rust-lang/crates.io-index" 2189 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 2190 | 2191 | [[package]] 2192 | name = "unicode-bidi" 2193 | version = "0.3.10" 2194 | source = "registry+https://github.com/rust-lang/crates.io-index" 2195 | checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" 2196 | 2197 | [[package]] 2198 | name = "unicode-ident" 2199 | version = "1.0.6" 2200 | source = "registry+https://github.com/rust-lang/crates.io-index" 2201 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 2202 | 2203 | [[package]] 2204 | name = "unicode-normalization" 2205 | version = "0.1.22" 2206 | source = "registry+https://github.com/rust-lang/crates.io-index" 2207 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2208 | dependencies = [ 2209 | "tinyvec", 2210 | ] 2211 | 2212 | [[package]] 2213 | name = "unicode-segmentation" 2214 | version = "1.10.0" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" 2217 | 2218 | [[package]] 2219 | name = "unicode-width" 2220 | version = "0.1.10" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 2223 | 2224 | [[package]] 2225 | name = "unicode_categories" 2226 | version = "0.1.1" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 2229 | 2230 | [[package]] 2231 | name = "url" 2232 | version = "2.3.1" 2233 | source = "registry+https://github.com/rust-lang/crates.io-index" 2234 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 2235 | dependencies = [ 2236 | "form_urlencoded", 2237 | "idna", 2238 | "percent-encoding", 2239 | ] 2240 | 2241 | [[package]] 2242 | name = "uuid" 2243 | version = "1.2.2" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" 2246 | dependencies = [ 2247 | "getrandom", 2248 | "serde", 2249 | ] 2250 | 2251 | [[package]] 2252 | name = "value-bag" 2253 | version = "1.0.0-alpha.9" 2254 | source = "registry+https://github.com/rust-lang/crates.io-index" 2255 | checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" 2256 | dependencies = [ 2257 | "ctor", 2258 | "version_check", 2259 | ] 2260 | 2261 | [[package]] 2262 | name = "vcpkg" 2263 | version = "0.2.15" 2264 | source = "registry+https://github.com/rust-lang/crates.io-index" 2265 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2266 | 2267 | [[package]] 2268 | name = "version_check" 2269 | version = "0.9.4" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2272 | 2273 | [[package]] 2274 | name = "waker-fn" 2275 | version = "1.1.0" 2276 | source = "registry+https://github.com/rust-lang/crates.io-index" 2277 | checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" 2278 | 2279 | [[package]] 2280 | name = "wasi" 2281 | version = "0.10.0+wasi-snapshot-preview1" 2282 | source = "registry+https://github.com/rust-lang/crates.io-index" 2283 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 2284 | 2285 | [[package]] 2286 | name = "wasi" 2287 | version = "0.11.0+wasi-snapshot-preview1" 2288 | source = "registry+https://github.com/rust-lang/crates.io-index" 2289 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2290 | 2291 | [[package]] 2292 | name = "wasm-bindgen" 2293 | version = "0.2.83" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 2296 | dependencies = [ 2297 | "cfg-if", 2298 | "wasm-bindgen-macro", 2299 | ] 2300 | 2301 | [[package]] 2302 | name = "wasm-bindgen-backend" 2303 | version = "0.2.83" 2304 | source = "registry+https://github.com/rust-lang/crates.io-index" 2305 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 2306 | dependencies = [ 2307 | "bumpalo", 2308 | "log", 2309 | "once_cell", 2310 | "proc-macro2", 2311 | "quote", 2312 | "syn", 2313 | "wasm-bindgen-shared", 2314 | ] 2315 | 2316 | [[package]] 2317 | name = "wasm-bindgen-futures" 2318 | version = "0.4.33" 2319 | source = "registry+https://github.com/rust-lang/crates.io-index" 2320 | checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" 2321 | dependencies = [ 2322 | "cfg-if", 2323 | "js-sys", 2324 | "wasm-bindgen", 2325 | "web-sys", 2326 | ] 2327 | 2328 | [[package]] 2329 | name = "wasm-bindgen-macro" 2330 | version = "0.2.83" 2331 | source = "registry+https://github.com/rust-lang/crates.io-index" 2332 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 2333 | dependencies = [ 2334 | "quote", 2335 | "wasm-bindgen-macro-support", 2336 | ] 2337 | 2338 | [[package]] 2339 | name = "wasm-bindgen-macro-support" 2340 | version = "0.2.83" 2341 | source = "registry+https://github.com/rust-lang/crates.io-index" 2342 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 2343 | dependencies = [ 2344 | "proc-macro2", 2345 | "quote", 2346 | "syn", 2347 | "wasm-bindgen-backend", 2348 | "wasm-bindgen-shared", 2349 | ] 2350 | 2351 | [[package]] 2352 | name = "wasm-bindgen-shared" 2353 | version = "0.2.83" 2354 | source = "registry+https://github.com/rust-lang/crates.io-index" 2355 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 2356 | 2357 | [[package]] 2358 | name = "web-sys" 2359 | version = "0.3.60" 2360 | source = "registry+https://github.com/rust-lang/crates.io-index" 2361 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 2362 | dependencies = [ 2363 | "js-sys", 2364 | "wasm-bindgen", 2365 | ] 2366 | 2367 | [[package]] 2368 | name = "wepoll-ffi" 2369 | version = "0.1.2" 2370 | source = "registry+https://github.com/rust-lang/crates.io-index" 2371 | checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" 2372 | dependencies = [ 2373 | "cc", 2374 | ] 2375 | 2376 | [[package]] 2377 | name = "winapi" 2378 | version = "0.3.9" 2379 | source = "registry+https://github.com/rust-lang/crates.io-index" 2380 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2381 | dependencies = [ 2382 | "winapi-i686-pc-windows-gnu", 2383 | "winapi-x86_64-pc-windows-gnu", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "winapi-i686-pc-windows-gnu" 2388 | version = "0.4.0" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2391 | 2392 | [[package]] 2393 | name = "winapi-util" 2394 | version = "0.1.5" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2397 | dependencies = [ 2398 | "winapi", 2399 | ] 2400 | 2401 | [[package]] 2402 | name = "winapi-x86_64-pc-windows-gnu" 2403 | version = "0.4.0" 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" 2405 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2406 | 2407 | [[package]] 2408 | name = "windows-sys" 2409 | version = "0.42.0" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 2412 | dependencies = [ 2413 | "windows_aarch64_gnullvm", 2414 | "windows_aarch64_msvc", 2415 | "windows_i686_gnu", 2416 | "windows_i686_msvc", 2417 | "windows_x86_64_gnu", 2418 | "windows_x86_64_gnullvm", 2419 | "windows_x86_64_msvc", 2420 | ] 2421 | 2422 | [[package]] 2423 | name = "windows_aarch64_gnullvm" 2424 | version = "0.42.1" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 2427 | 2428 | [[package]] 2429 | name = "windows_aarch64_msvc" 2430 | version = "0.42.1" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 2433 | 2434 | [[package]] 2435 | name = "windows_i686_gnu" 2436 | version = "0.42.1" 2437 | source = "registry+https://github.com/rust-lang/crates.io-index" 2438 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 2439 | 2440 | [[package]] 2441 | name = "windows_i686_msvc" 2442 | version = "0.42.1" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 2445 | 2446 | [[package]] 2447 | name = "windows_x86_64_gnu" 2448 | version = "0.42.1" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 2451 | 2452 | [[package]] 2453 | name = "windows_x86_64_gnullvm" 2454 | version = "0.42.1" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 2457 | 2458 | [[package]] 2459 | name = "windows_x86_64_msvc" 2460 | version = "0.42.1" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 2463 | 2464 | [[package]] 2465 | name = "zeroize" 2466 | version = "1.5.7" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" 2469 | 2470 | [[package]] 2471 | name = "zstd" 2472 | version = "0.12.2+zstd.1.5.2" 2473 | source = "registry+https://github.com/rust-lang/crates.io-index" 2474 | checksum = "e9262a83dc741c0b0ffec209881b45dbc232c21b02a2b9cb1adb93266e41303d" 2475 | dependencies = [ 2476 | "zstd-safe", 2477 | ] 2478 | 2479 | [[package]] 2480 | name = "zstd-safe" 2481 | version = "6.0.2+zstd.1.5.2" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "a6cf39f730b440bab43da8fb5faf5f254574462f73f260f85f7987f32154ff17" 2484 | dependencies = [ 2485 | "libc", 2486 | "zstd-sys", 2487 | ] 2488 | 2489 | [[package]] 2490 | name = "zstd-sys" 2491 | version = "2.0.5+zstd.1.5.2" 2492 | source = "registry+https://github.com/rust-lang/crates.io-index" 2493 | checksum = "edc50ffce891ad571e9f9afe5039c4837bede781ac4bb13052ed7ae695518596" 2494 | dependencies = [ 2495 | "cc", 2496 | "libc", 2497 | "pkg-config", 2498 | ] 2499 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-mysql-crud-sqlx" 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 | actix-cors = "0.6.4" 10 | actix-web = "4.3.0" 11 | chrono = { version = "0.4.23", features = ["serde"] } 12 | dotenv = "0.15.0" 13 | env_logger = "0.10.0" 14 | serde = { version = "1.0.152", features = ["derive"] } 15 | serde_json = "1.0.91" 16 | sqlx = { version = "0.6.2", features = ["runtime-async-std-native-tls", "mysql", "chrono", "uuid"] } 17 | uuid = { version = "1.2.2", features = ["serde", "v4"] } 18 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | dev: 2 | docker-compose up -d 3 | 4 | dev-down: 5 | docker-compose down 6 | 7 | migrate-up: 8 | sqlx migrate run 9 | 10 | migrate-down: 11 | sqlx migrate revert 12 | 13 | start-server: 14 | cargo watch -q -c -w src/ -x run 15 | 16 | install: 17 | cargo add actix-web 18 | cargo add actix-cors 19 | cargo add serde --features derive 20 | cargo add serde_json 21 | cargo add chrono --features serde 22 | cargo add env_logger 23 | cargo add dotenv 24 | cargo add uuid --features "serde v4" 25 | cargo add sqlx --features "runtime-async-std-native-tls mysql chrono uuid" 26 | # HotReload 27 | cargo install cargo-watch 28 | # SQLX-CLI 29 | cargo install sqlx-cli -------------------------------------------------------------------------------- /Note App.postman_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "5a0ef1af-7659-43bc-8ecb-aeffd04c6a6c", 4 | "name": "Note App", 5 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", 6 | "_exporter_id": "14791724" 7 | }, 8 | "item": [ 9 | { 10 | "name": "Create Note", 11 | "request": { 12 | "method": "POST", 13 | "header": [], 14 | "body": { 15 | "mode": "raw", 16 | "raw": "{\r\n \"title\": \"You'll learn how to build a CRUD API with FastAPI\",\r\n \"content\": \"Fastapi is really easy to use\",\r\n \"category\": \"FastAPI\"\r\n}", 17 | "options": { 18 | "raw": { 19 | "language": "json" 20 | } 21 | } 22 | }, 23 | "url": { 24 | "raw": "http://localhost:8000/api/notes/", 25 | "protocol": "http", 26 | "host": [ 27 | "localhost" 28 | ], 29 | "port": "8000", 30 | "path": [ 31 | "api", 32 | "notes", 33 | "" 34 | ] 35 | } 36 | }, 37 | "response": [] 38 | }, 39 | { 40 | "name": "Get Note", 41 | "request": { 42 | "method": "GET", 43 | "header": [], 44 | "url": { 45 | "raw": "http://localhost:8000/api/notes/cc5ff528-5352-4ba3-9b75-962dc5dacf2f", 46 | "protocol": "http", 47 | "host": [ 48 | "localhost" 49 | ], 50 | "port": "8000", 51 | "path": [ 52 | "api", 53 | "notes", 54 | "cc5ff528-5352-4ba3-9b75-962dc5dacf2f" 55 | ] 56 | } 57 | }, 58 | "response": [] 59 | }, 60 | { 61 | "name": "Health Checker", 62 | "request": { 63 | "method": "GET", 64 | "header": [], 65 | "url": { 66 | "raw": "http://localhost:8000/api/healthchecker", 67 | "protocol": "http", 68 | "host": [ 69 | "localhost" 70 | ], 71 | "port": "8000", 72 | "path": [ 73 | "api", 74 | "healthchecker" 75 | ] 76 | } 77 | }, 78 | "response": [] 79 | }, 80 | { 81 | "name": "Update Note", 82 | "request": { 83 | "method": "PATCH", 84 | "header": [], 85 | "body": { 86 | "mode": "raw", 87 | "raw": "{\r\n \"title\": \"✅✅👇👇This article will teach Django REST framework\"\r\n}", 88 | "options": { 89 | "raw": { 90 | "language": "json" 91 | } 92 | } 93 | }, 94 | "url": { 95 | "raw": "http://localhost:8000/api/notes/77a9ac3c-7e3b-40c1-b2d4-30729c931d3d", 96 | "protocol": "http", 97 | "host": [ 98 | "localhost" 99 | ], 100 | "port": "8000", 101 | "path": [ 102 | "api", 103 | "notes", 104 | "77a9ac3c-7e3b-40c1-b2d4-30729c931d3d" 105 | ] 106 | } 107 | }, 108 | "response": [] 109 | }, 110 | { 111 | "name": "Delete Note", 112 | "request": { 113 | "method": "DELETE", 114 | "header": [], 115 | "url": { 116 | "raw": "http://localhost:8000/api/notes/04aae95f-de90-4a39-9610-83b84485a042", 117 | "protocol": "http", 118 | "host": [ 119 | "localhost" 120 | ], 121 | "port": "8000", 122 | "path": [ 123 | "api", 124 | "notes", 125 | "04aae95f-de90-4a39-9610-83b84485a042" 126 | ] 127 | } 128 | }, 129 | "response": [] 130 | }, 131 | { 132 | "name": "Get All Notes", 133 | "request": { 134 | "method": "GET", 135 | "header": [], 136 | "url": { 137 | "raw": "http://localhost:8000/api/notes?page=1&limit=10", 138 | "protocol": "http", 139 | "host": [ 140 | "localhost" 141 | ], 142 | "port": "8000", 143 | "path": [ 144 | "api", 145 | "notes" 146 | ], 147 | "query": [ 148 | { 149 | "key": "page", 150 | "value": "1" 151 | }, 152 | { 153 | "key": "limit", 154 | "value": "10" 155 | } 156 | ] 157 | } 158 | }, 159 | "response": [] 160 | } 161 | ] 162 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rust & Actix Web - Build a CRUD API with SQLX and MySQL 2 | 3 | In this article, we will explore how to use Rust, Actix Web, SQLX, and MySQL to build a CRUD (Create, Read, Update, Delete) API. We will start by setting up a MySQL database, defining our data model, and creating the necessary database tables. Next, we will use SQLX to interact with the database and Actix Web to build the API endpoints. 4 | 5 | ![Rust & Actix Web - Build a CRUD API with SQLX and MySQL](https://codevoweb.com/wp-content/uploads/2023/03/Rust-and-Actix-Web-Build-a-CRUD-API-with-SQLX-and-MySQL.webp) 6 | 7 | ## Topics Covered 8 | 9 | - Run the Actix-Web MySQL CRUD API Project 10 | - Run the Actix-Web API with a Frontend App 11 | - Setup the Rust Project with Cargo 12 | - Setup MySQL with Docker 13 | - Run Database Migrations with SQLX 14 | - Create the SQLX Database Model 15 | - Create the Request Validation Structs 16 | - Implement the CRUD Functionalities 17 | - Actix-Web Route Handler to Fetch All Records 18 | - Actix-Web Route Handler to Create a Record 19 | - Actix-Web Route Handler to Get a Record 20 | - Actix-Web Route Handler to Edit a Record 21 | - Actix-Web Route Handler to Delete a Record 22 | - Merge the Route Functions 23 | - Register the Routes and Add CORS 24 | - Test the Actix-Web MySQL CRUD API 25 | - Perform the CREATE Operation of CRUD 26 | - Perform the UPDATE Operation of CRUD 27 | - Perform the READ Operation of CRUD 28 | - Perform the DELETE Operation of CRUD 29 | 30 | Read the entire article here: [https://codevoweb.com/rust-actix-web-build-crud-api-with-sqlx-and-mysql/](https://codevoweb.com/rust-actix-web-build-crud-api-with-sqlx-and-mysql/) 31 | 32 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | mysql: 4 | image: mysql:latest 5 | container_name: mysql 6 | env_file: 7 | - ./.env 8 | ports: 9 | - '6500:3306' 10 | volumes: 11 | - mysqlDB:/var/lib/mysql 12 | volumes: 13 | mysqlDB: -------------------------------------------------------------------------------- /migrations/20230123163655_init.down.sql: -------------------------------------------------------------------------------- 1 | -- Add down migration script here 2 | 3 | DROP TABLE IF EXISTS notes; -------------------------------------------------------------------------------- /migrations/20230123163655_init.up.sql: -------------------------------------------------------------------------------- 1 | -- Add up migration script here 2 | 3 | CREATE TABLE 4 | IF NOT EXISTS notes ( 5 | id CHAR(36) PRIMARY KEY NOT NULL, 6 | title VARCHAR(255) NOT NULL UNIQUE, 7 | content TEXT NOT NULL, 8 | category VARCHAR(100), 9 | published BOOLEAN NOT NULL DEFAULT FALSE, 10 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 11 | updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 12 | ); -------------------------------------------------------------------------------- /src/handler.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | model::{NoteModel, NoteModelResponse}, 3 | schema::{CreateNoteSchema, FilterOptions, UpdateNoteSchema}, 4 | AppState, 5 | }; 6 | use actix_web::{delete, get, patch, post, web, HttpResponse, Responder}; 7 | use serde_json::json; 8 | 9 | #[get("/healthchecker")] 10 | async fn health_checker_handler() -> impl Responder { 11 | const MESSAGE: &str = "Build Simple CRUD API with Rust, SQLX, MySQL, and Actix Web"; 12 | 13 | HttpResponse::Ok().json(json!({"status": "success","message": MESSAGE})) 14 | } 15 | 16 | #[get("/notes")] 17 | pub async fn note_list_handler( 18 | opts: web::Query, 19 | data: web::Data, 20 | ) -> impl Responder { 21 | let limit = opts.limit.unwrap_or(10); 22 | let offset = (opts.page.unwrap_or(1) - 1) * limit; 23 | 24 | let notes: Vec = sqlx::query_as!( 25 | NoteModel, 26 | r#"SELECT * FROM notes ORDER by id LIMIT ? OFFSET ?"#, 27 | limit as i32, 28 | offset as i32 29 | ) 30 | .fetch_all(&data.db) 31 | .await 32 | .unwrap(); 33 | 34 | let note_responses = notes 35 | .into_iter() 36 | .map(|note| filter_db_record(¬e)) 37 | .collect::>(); 38 | 39 | let json_response = serde_json::json!({ 40 | "status": "success", 41 | "results": note_responses.len(), 42 | "notes": note_responses 43 | }); 44 | HttpResponse::Ok().json(json_response) 45 | } 46 | 47 | #[post("/notes/")] 48 | async fn create_note_handler( 49 | body: web::Json, 50 | data: web::Data, 51 | ) -> impl Responder { 52 | let user_id = uuid::Uuid::new_v4().to_string(); 53 | let query_result = 54 | sqlx::query(r#"INSERT INTO notes (id,title,content,category) VALUES (?, ?, ?, ?)"#) 55 | .bind(user_id.clone()) 56 | .bind(body.title.to_string()) 57 | .bind(body.content.to_string()) 58 | .bind(body.category.to_owned().unwrap_or_default()) 59 | .execute(&data.db) 60 | .await 61 | .map_err(|err: sqlx::Error| err.to_string()); 62 | 63 | if let Err(err) = query_result { 64 | if err.contains("Duplicate entry") { 65 | return HttpResponse::BadRequest().json( 66 | serde_json::json!({"status": "fail","message": "Note with that title already exists"}), 67 | ); 68 | } 69 | 70 | return HttpResponse::InternalServerError() 71 | .json(serde_json::json!({"status": "error","message": format!("{:?}", err)})); 72 | } 73 | 74 | let query_result = sqlx::query_as!(NoteModel, r#"SELECT * FROM notes WHERE id = ?"#, user_id) 75 | .fetch_one(&data.db) 76 | .await; 77 | 78 | match query_result { 79 | Ok(note) => { 80 | let note_response = serde_json::json!({"status": "success","data": serde_json::json!({ 81 | "note": filter_db_record(¬e) 82 | })}); 83 | 84 | return HttpResponse::Ok().json(note_response); 85 | } 86 | Err(e) => { 87 | return HttpResponse::InternalServerError() 88 | .json(serde_json::json!({"status": "error","message": format!("{:?}", e)})); 89 | } 90 | } 91 | } 92 | 93 | #[get("/notes/{id}")] 94 | async fn get_note_handler( 95 | path: web::Path, 96 | data: web::Data, 97 | ) -> impl Responder { 98 | let note_id = path.into_inner().to_string(); 99 | let query_result = sqlx::query_as!(NoteModel, r#"SELECT * FROM notes WHERE id = ?"#, note_id) 100 | .fetch_one(&data.db) 101 | .await; 102 | 103 | match query_result { 104 | Ok(note) => { 105 | let note_response = serde_json::json!({"status": "success","data": serde_json::json!({ 106 | "note": filter_db_record(¬e) 107 | })}); 108 | 109 | return HttpResponse::Ok().json(note_response); 110 | } 111 | Err(sqlx::Error::RowNotFound) => { 112 | return HttpResponse::NotFound().json( 113 | serde_json::json!({"status": "fail","message": format!("Note with ID: {} not found", note_id)}), 114 | ); 115 | } 116 | Err(e) => { 117 | return HttpResponse::InternalServerError() 118 | .json(serde_json::json!({"status": "error","message": format!("{:?}", e)})); 119 | } 120 | }; 121 | } 122 | 123 | #[patch("/notes/{id}")] 124 | async fn edit_note_handler( 125 | path: web::Path, 126 | body: web::Json, 127 | data: web::Data, 128 | ) -> impl Responder { 129 | let note_id = path.into_inner().to_string(); 130 | let query_result = sqlx::query_as!(NoteModel, r#"SELECT * FROM notes WHERE id = ?"#, note_id) 131 | .fetch_one(&data.db) 132 | .await; 133 | 134 | let note = match query_result { 135 | Ok(note) => note, 136 | Err(sqlx::Error::RowNotFound) => { 137 | return HttpResponse::NotFound().json( 138 | serde_json::json!({"status": "fail","message": format!("Note with ID: {} not found", note_id)}), 139 | ); 140 | } 141 | Err(e) => { 142 | return HttpResponse::InternalServerError() 143 | .json(serde_json::json!({"status": "error","message": format!("{:?}", e)})); 144 | } 145 | }; 146 | 147 | let published = body.published.unwrap_or(note.published != 0); 148 | let i8_publised = published as i8; 149 | 150 | let update_result = sqlx::query( 151 | r#"UPDATE notes SET title = ?, content = ?, category = ?, published = ? WHERE id = ?"#, 152 | ) 153 | .bind(body.title.to_owned().unwrap_or_else(|| note.title.clone())) 154 | .bind( 155 | body.content 156 | .to_owned() 157 | .unwrap_or_else(|| note.content.clone()), 158 | ) 159 | .bind( 160 | body.category 161 | .to_owned() 162 | .unwrap_or_else(|| note.category.clone().unwrap()), 163 | ) 164 | .bind(i8_publised) 165 | .bind(note_id.to_owned()) 166 | .execute(&data.db) 167 | .await; 168 | 169 | match update_result { 170 | Ok(result) => { 171 | if result.rows_affected() == 0 { 172 | let message = format!("Note with ID: {} not found", note_id); 173 | return HttpResponse::NotFound().json(json!({"status": "fail","message": message})); 174 | } 175 | } 176 | Err(e) => { 177 | let message = format!("Internal server error: {}", e); 178 | return HttpResponse::InternalServerError() 179 | .json(json!({"status": "error","message": message})); 180 | } 181 | } 182 | 183 | let updated_note_result = sqlx::query_as!( 184 | NoteModel, 185 | r#"SELECT * FROM notes WHERE id = ?"#, 186 | note_id.to_owned() 187 | ) 188 | .fetch_one(&data.db) 189 | .await; 190 | 191 | match updated_note_result { 192 | Ok(note) => { 193 | let note_response = serde_json::json!({"status": "success","data": serde_json::json!({ 194 | "note": filter_db_record(¬e) 195 | })}); 196 | 197 | HttpResponse::Ok().json(note_response) 198 | } 199 | Err(e) => HttpResponse::InternalServerError() 200 | .json(serde_json::json!({"status": "error","message": format!("{:?}", e)})), 201 | } 202 | } 203 | 204 | #[delete("/notes/{id}")] 205 | async fn delete_note_handler( 206 | path: web::Path, 207 | data: web::Data, 208 | ) -> impl Responder { 209 | let note_id = path.into_inner().to_string(); 210 | let query_result = sqlx::query!(r#"DELETE FROM notes WHERE id = ?"#, note_id) 211 | .execute(&data.db) 212 | .await; 213 | 214 | match query_result { 215 | Ok(result) => { 216 | if result.rows_affected() == 0 { 217 | let message = format!("Note with ID: {} not found", note_id); 218 | HttpResponse::NotFound().json(json!({"status": "fail","message": message})) 219 | } else { 220 | HttpResponse::NoContent().finish() 221 | } 222 | } 223 | Err(e) => { 224 | let message = format!("Internal server error: {}", e); 225 | HttpResponse::InternalServerError().json(json!({"status": "error","message": message})) 226 | } 227 | } 228 | } 229 | 230 | fn filter_db_record(note: &NoteModel) -> NoteModelResponse { 231 | NoteModelResponse { 232 | id: note.id.to_owned(), 233 | title: note.title.to_owned(), 234 | content: note.content.to_owned(), 235 | category: note.category.to_owned().unwrap(), 236 | published: note.published != 0, 237 | createdAt: note.created_at.unwrap(), 238 | updatedAt: note.updated_at.unwrap(), 239 | } 240 | } 241 | 242 | pub fn config(conf: &mut web::ServiceConfig) { 243 | let scope = web::scope("/api") 244 | .service(health_checker_handler) 245 | .service(note_list_handler) 246 | .service(create_note_handler) 247 | .service(get_note_handler) 248 | .service(edit_note_handler) 249 | .service(delete_note_handler); 250 | 251 | conf.service(scope); 252 | } 253 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod handler; 2 | mod model; 3 | mod schema; 4 | 5 | use actix_cors::Cors; 6 | use actix_web::middleware::Logger; 7 | use actix_web::{http::header, web, App, HttpServer}; 8 | use dotenv::dotenv; 9 | use sqlx::mysql::{MySqlPool, MySqlPoolOptions}; 10 | 11 | pub struct AppState { 12 | db: MySqlPool, 13 | } 14 | 15 | #[actix_web::main] 16 | async fn main() -> std::io::Result<()> { 17 | if std::env::var_os("RUST_LOG").is_none() { 18 | std::env::set_var("RUST_LOG", "actix_web=info"); 19 | } 20 | dotenv().ok(); 21 | env_logger::init(); 22 | 23 | let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); 24 | let pool = match MySqlPoolOptions::new() 25 | .max_connections(10) 26 | .connect(&database_url) 27 | .await 28 | { 29 | Ok(pool) => { 30 | println!("✅Connection to the database is successful!"); 31 | pool 32 | } 33 | Err(err) => { 34 | println!("🔥 Failed to connect to the database: {:?}", err); 35 | std::process::exit(1); 36 | } 37 | }; 38 | 39 | println!("🚀 Server started successfully"); 40 | 41 | HttpServer::new(move || { 42 | let cors = Cors::default() 43 | .allowed_origin("http://localhost:3000") 44 | .allowed_methods(vec!["GET", "POST", "PATCH", "DELETE"]) 45 | .allowed_headers(vec![ 46 | header::CONTENT_TYPE, 47 | header::AUTHORIZATION, 48 | header::ACCEPT, 49 | ]) 50 | .supports_credentials(); 51 | App::new() 52 | .app_data(web::Data::new(AppState { db: pool.clone() })) 53 | .configure(handler::config) 54 | .wrap(cors) 55 | .wrap(Logger::default()) 56 | }) 57 | .bind(("127.0.0.1", 8000))? 58 | .run() 59 | .await 60 | } 61 | -------------------------------------------------------------------------------- /src/model.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | 3 | #[derive(Debug, Deserialize, Serialize, sqlx::FromRow)] 4 | #[allow(non_snake_case)] 5 | pub struct NoteModel { 6 | pub id: String, 7 | pub title: String, 8 | pub content: String, 9 | pub category: Option, 10 | pub published: i8, 11 | pub created_at: Option>, 12 | pub updated_at: Option>, 13 | } 14 | 15 | #[derive(Debug, Deserialize, Serialize)] 16 | #[allow(non_snake_case)] 17 | pub struct NoteModelResponse { 18 | pub id: String, 19 | pub title: String, 20 | pub content: String, 21 | pub category: String, 22 | pub published: bool, 23 | pub createdAt: chrono::DateTime, 24 | pub updatedAt: chrono::DateTime, 25 | } 26 | -------------------------------------------------------------------------------- /src/schema.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | 3 | #[derive(Deserialize, Debug)] 4 | pub struct FilterOptions { 5 | pub page: Option, 6 | pub limit: Option, 7 | } 8 | 9 | #[derive(Deserialize, Debug)] 10 | pub struct ParamOptions { 11 | pub id: String, 12 | } 13 | 14 | #[derive(Serialize, Deserialize, Debug)] 15 | pub struct CreateNoteSchema { 16 | pub title: String, 17 | pub content: String, 18 | #[serde(skip_serializing_if = "Option::is_none")] 19 | pub category: Option, 20 | #[serde(skip_serializing_if = "Option::is_none")] 21 | pub published: Option, 22 | } 23 | 24 | #[derive(Serialize, Deserialize, Debug)] 25 | pub struct UpdateNoteSchema { 26 | pub title: Option, 27 | pub content: Option, 28 | pub category: Option, 29 | pub published: Option, 30 | } 31 | --------------------------------------------------------------------------------