├── .env ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md └── src ├── dataloaders.rs ├── dataloaders └── users.rs ├── graphql.rs ├── graphql ├── users_mutation.rs ├── users_query.rs └── users_subscription.rs ├── lib.rs ├── main.rs ├── postgres.rs ├── redis.rs ├── types.rs └── types └── users.rs /.env: -------------------------------------------------------------------------------- 1 | POSTGRES_HOST=localhost 2 | POSTGRES_PASSWORD=password 3 | POSTGRES_USER=postgres 4 | POSTGRES_DB=postgres 5 | POSTGRES_PORT=5432 6 | REDIS_HOST=redis://localhost:6379 7 | FIREBASE_PROJECT_ID=firebase_project 8 | ADMIN_SECRET=admin1234 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | dependencies = [ 11 | "lazy_static", 12 | "regex", 13 | ] 14 | 15 | [[package]] 16 | name = "addr2line" 17 | version = "0.24.2" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 20 | dependencies = [ 21 | "gimli", 22 | ] 23 | 24 | [[package]] 25 | name = "adler2" 26 | version = "2.0.0" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 29 | 30 | [[package]] 31 | name = "aho-corasick" 32 | version = "1.1.3" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 35 | dependencies = [ 36 | "memchr", 37 | ] 38 | 39 | [[package]] 40 | name = "allocator-api2" 41 | version = "0.2.21" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 44 | 45 | [[package]] 46 | name = "android-tzdata" 47 | version = "0.1.1" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 50 | 51 | [[package]] 52 | name = "android_system_properties" 53 | version = "0.1.5" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 56 | dependencies = [ 57 | "libc", 58 | ] 59 | 60 | [[package]] 61 | name = "anyhow" 62 | version = "1.0.97" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 65 | 66 | [[package]] 67 | name = "arc-swap" 68 | version = "1.7.1" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 71 | 72 | [[package]] 73 | name = "ascii_utils" 74 | version = "0.9.3" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" 77 | 78 | [[package]] 79 | name = "async-compression" 80 | version = "0.4.21" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "c0cf008e5e1a9e9e22a7d3c9a4992e21a350290069e36d8fb72304ed17e8f2d2" 83 | dependencies = [ 84 | "flate2", 85 | "futures-core", 86 | "memchr", 87 | "pin-project-lite", 88 | "tokio", 89 | ] 90 | 91 | [[package]] 92 | name = "async-graphql" 93 | version = "7.0.16" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "d3ee559e72d983e7e04001ba3bf32e6b71c1d670595780723727fd8a29d36e87" 96 | dependencies = [ 97 | "async-graphql-derive", 98 | "async-graphql-parser", 99 | "async-graphql-value", 100 | "async-stream", 101 | "async-trait", 102 | "base64 0.22.1", 103 | "bytes", 104 | "chrono", 105 | "fast_chemail", 106 | "fnv", 107 | "futures-channel", 108 | "futures-timer", 109 | "futures-util", 110 | "handlebars", 111 | "http 1.3.1", 112 | "indexmap 2.8.0", 113 | "lru", 114 | "mime", 115 | "multer", 116 | "num-traits", 117 | "pin-project-lite", 118 | "regex", 119 | "serde", 120 | "serde_json", 121 | "serde_urlencoded", 122 | "static_assertions_next", 123 | "tempfile", 124 | "thiserror 1.0.69", 125 | ] 126 | 127 | [[package]] 128 | name = "async-graphql-axum" 129 | version = "7.0.16" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "c95b41ba3c0f4ecccd73bf7e7aa7be3c41ff054968e988317bd9133ed210a4a2" 132 | dependencies = [ 133 | "async-graphql", 134 | "axum", 135 | "bytes", 136 | "futures-util", 137 | "serde_json", 138 | "tokio", 139 | "tokio-stream", 140 | "tokio-util", 141 | "tower-service", 142 | ] 143 | 144 | [[package]] 145 | name = "async-graphql-derive" 146 | version = "7.0.16" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "29db05b624fb6352fc11bfe30c54ab1b16a1fe937d7c05a783f4e88ef1292b3b" 149 | dependencies = [ 150 | "Inflector", 151 | "async-graphql-parser", 152 | "darling", 153 | "proc-macro-crate", 154 | "proc-macro2", 155 | "quote", 156 | "strum", 157 | "syn", 158 | "thiserror 1.0.69", 159 | ] 160 | 161 | [[package]] 162 | name = "async-graphql-parser" 163 | version = "7.0.16" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "4904895044116aab098ca82c6cec831ec43ed99efd04db9b70a390419bc88c5b" 166 | dependencies = [ 167 | "async-graphql-value", 168 | "pest", 169 | "serde", 170 | "serde_json", 171 | ] 172 | 173 | [[package]] 174 | name = "async-graphql-value" 175 | version = "7.0.16" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "d0cde74de18e3a00c5dd5cfa002ab6f532e1a06c2a79ee6671e2fc353b400b92" 178 | dependencies = [ 179 | "bytes", 180 | "indexmap 2.8.0", 181 | "serde", 182 | "serde_json", 183 | ] 184 | 185 | [[package]] 186 | name = "async-stream" 187 | version = "0.3.6" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" 190 | dependencies = [ 191 | "async-stream-impl", 192 | "futures-core", 193 | "pin-project-lite", 194 | ] 195 | 196 | [[package]] 197 | name = "async-stream-impl" 198 | version = "0.3.6" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" 201 | dependencies = [ 202 | "proc-macro2", 203 | "quote", 204 | "syn", 205 | ] 206 | 207 | [[package]] 208 | name = "async-trait" 209 | version = "0.1.88" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 212 | dependencies = [ 213 | "proc-macro2", 214 | "quote", 215 | "syn", 216 | ] 217 | 218 | [[package]] 219 | name = "autocfg" 220 | version = "1.4.0" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 223 | 224 | [[package]] 225 | name = "axum" 226 | version = "0.8.1" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" 229 | dependencies = [ 230 | "axum-core", 231 | "base64 0.22.1", 232 | "bytes", 233 | "form_urlencoded", 234 | "futures-util", 235 | "http 1.3.1", 236 | "http-body 1.0.1", 237 | "http-body-util", 238 | "hyper 1.6.0", 239 | "hyper-util", 240 | "itoa", 241 | "matchit", 242 | "memchr", 243 | "mime", 244 | "percent-encoding", 245 | "pin-project-lite", 246 | "rustversion", 247 | "serde", 248 | "serde_json", 249 | "serde_path_to_error", 250 | "serde_urlencoded", 251 | "sha1", 252 | "sync_wrapper 1.0.2", 253 | "tokio", 254 | "tokio-tungstenite", 255 | "tower", 256 | "tower-layer", 257 | "tower-service", 258 | "tracing", 259 | ] 260 | 261 | [[package]] 262 | name = "axum-core" 263 | version = "0.5.0" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" 266 | dependencies = [ 267 | "bytes", 268 | "futures-util", 269 | "http 1.3.1", 270 | "http-body 1.0.1", 271 | "http-body-util", 272 | "mime", 273 | "pin-project-lite", 274 | "rustversion", 275 | "sync_wrapper 1.0.2", 276 | "tower-layer", 277 | "tower-service", 278 | "tracing", 279 | ] 280 | 281 | [[package]] 282 | name = "axum-extra" 283 | version = "0.10.0" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "460fc6f625a1f7705c6cf62d0d070794e94668988b1c38111baeec177c715f7b" 286 | dependencies = [ 287 | "axum", 288 | "axum-core", 289 | "bytes", 290 | "futures-util", 291 | "http 1.3.1", 292 | "http-body 1.0.1", 293 | "http-body-util", 294 | "mime", 295 | "pin-project-lite", 296 | "serde", 297 | "tower", 298 | "tower-layer", 299 | "tower-service", 300 | ] 301 | 302 | [[package]] 303 | name = "backtrace" 304 | version = "0.3.74" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 307 | dependencies = [ 308 | "addr2line", 309 | "cfg-if", 310 | "libc", 311 | "miniz_oxide", 312 | "object", 313 | "rustc-demangle", 314 | "windows-targets 0.52.6", 315 | ] 316 | 317 | [[package]] 318 | name = "base64" 319 | version = "0.21.7" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 322 | 323 | [[package]] 324 | name = "base64" 325 | version = "0.22.1" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 328 | 329 | [[package]] 330 | name = "bb8" 331 | version = "0.9.0" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "212d8b8e1a22743d9241575c6ba822cf9c8fef34771c86ab7e477a4fbfd254e5" 334 | dependencies = [ 335 | "futures-util", 336 | "parking_lot", 337 | "tokio", 338 | ] 339 | 340 | [[package]] 341 | name = "bb8-postgres" 342 | version = "0.9.0" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "e570e6557cd0f88d28d32afa76644873271a70dc22656df565b2021c4036aa9c" 345 | dependencies = [ 346 | "bb8", 347 | "tokio", 348 | "tokio-postgres", 349 | ] 350 | 351 | [[package]] 352 | name = "bb8-redis" 353 | version = "0.21.0" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "8a68215c76c457dccfed027a397ccd72482feabd64c2f93cbb2971a7c4121351" 356 | dependencies = [ 357 | "bb8", 358 | "redis", 359 | ] 360 | 361 | [[package]] 362 | name = "bitflags" 363 | version = "1.3.2" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 366 | 367 | [[package]] 368 | name = "bitflags" 369 | version = "2.9.0" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 372 | 373 | [[package]] 374 | name = "block-buffer" 375 | version = "0.10.4" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 378 | dependencies = [ 379 | "generic-array", 380 | ] 381 | 382 | [[package]] 383 | name = "bumpalo" 384 | version = "3.17.0" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 387 | 388 | [[package]] 389 | name = "byteorder" 390 | version = "1.5.0" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 393 | 394 | [[package]] 395 | name = "bytes" 396 | version = "1.10.1" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 399 | dependencies = [ 400 | "serde", 401 | ] 402 | 403 | [[package]] 404 | name = "cc" 405 | version = "1.2.17" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" 408 | dependencies = [ 409 | "shlex", 410 | ] 411 | 412 | [[package]] 413 | name = "cfg-if" 414 | version = "1.0.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 417 | 418 | [[package]] 419 | name = "chrono" 420 | version = "0.4.40" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" 423 | dependencies = [ 424 | "android-tzdata", 425 | "iana-time-zone", 426 | "num-traits", 427 | "serde", 428 | "windows-link", 429 | ] 430 | 431 | [[package]] 432 | name = "combine" 433 | version = "4.6.7" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 436 | dependencies = [ 437 | "bytes", 438 | "futures-core", 439 | "memchr", 440 | "pin-project-lite", 441 | "tokio", 442 | "tokio-util", 443 | ] 444 | 445 | [[package]] 446 | name = "core-foundation" 447 | version = "0.9.4" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 450 | dependencies = [ 451 | "core-foundation-sys", 452 | "libc", 453 | ] 454 | 455 | [[package]] 456 | name = "core-foundation-sys" 457 | version = "0.8.7" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 460 | 461 | [[package]] 462 | name = "cpufeatures" 463 | version = "0.2.17" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 466 | dependencies = [ 467 | "libc", 468 | ] 469 | 470 | [[package]] 471 | name = "crc32fast" 472 | version = "1.4.2" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 475 | dependencies = [ 476 | "cfg-if", 477 | ] 478 | 479 | [[package]] 480 | name = "crossbeam-deque" 481 | version = "0.8.6" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 484 | dependencies = [ 485 | "crossbeam-epoch", 486 | "crossbeam-utils", 487 | ] 488 | 489 | [[package]] 490 | name = "crossbeam-epoch" 491 | version = "0.9.18" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 494 | dependencies = [ 495 | "crossbeam-utils", 496 | ] 497 | 498 | [[package]] 499 | name = "crossbeam-utils" 500 | version = "0.8.21" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 503 | 504 | [[package]] 505 | name = "crypto-common" 506 | version = "0.1.6" 507 | source = "registry+https://github.com/rust-lang/crates.io-index" 508 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 509 | dependencies = [ 510 | "generic-array", 511 | "typenum", 512 | ] 513 | 514 | [[package]] 515 | name = "darling" 516 | version = "0.20.10" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 519 | dependencies = [ 520 | "darling_core", 521 | "darling_macro", 522 | ] 523 | 524 | [[package]] 525 | name = "darling_core" 526 | version = "0.20.10" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 529 | dependencies = [ 530 | "fnv", 531 | "ident_case", 532 | "proc-macro2", 533 | "quote", 534 | "strsim", 535 | "syn", 536 | ] 537 | 538 | [[package]] 539 | name = "darling_macro" 540 | version = "0.20.10" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 543 | dependencies = [ 544 | "darling_core", 545 | "quote", 546 | "syn", 547 | ] 548 | 549 | [[package]] 550 | name = "data-encoding" 551 | version = "2.8.0" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" 554 | 555 | [[package]] 556 | name = "deranged" 557 | version = "0.4.1" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" 560 | dependencies = [ 561 | "powerfmt", 562 | "serde", 563 | ] 564 | 565 | [[package]] 566 | name = "digest" 567 | version = "0.10.7" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 570 | dependencies = [ 571 | "block-buffer", 572 | "crypto-common", 573 | "subtle", 574 | ] 575 | 576 | [[package]] 577 | name = "displaydoc" 578 | version = "0.2.5" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 581 | dependencies = [ 582 | "proc-macro2", 583 | "quote", 584 | "syn", 585 | ] 586 | 587 | [[package]] 588 | name = "dotenvy" 589 | version = "0.15.7" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 592 | 593 | [[package]] 594 | name = "either" 595 | version = "1.15.0" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 598 | 599 | [[package]] 600 | name = "encoding_rs" 601 | version = "0.8.35" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 604 | dependencies = [ 605 | "cfg-if", 606 | ] 607 | 608 | [[package]] 609 | name = "equivalent" 610 | version = "1.0.2" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 613 | 614 | [[package]] 615 | name = "errno" 616 | version = "0.3.10" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 619 | dependencies = [ 620 | "libc", 621 | "windows-sys 0.59.0", 622 | ] 623 | 624 | [[package]] 625 | name = "fallible-iterator" 626 | version = "0.2.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 629 | 630 | [[package]] 631 | name = "fast_chemail" 632 | version = "0.9.6" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "495a39d30d624c2caabe6312bfead73e7717692b44e0b32df168c275a2e8e9e4" 635 | dependencies = [ 636 | "ascii_utils", 637 | ] 638 | 639 | [[package]] 640 | name = "fastrand" 641 | version = "2.3.0" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 644 | 645 | [[package]] 646 | name = "firebase-auth" 647 | version = "0.5.0" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "d55e8a4dc64f49b9ec5d89dc90d4fd2b6093004a52f733d696ef35bce98f089a" 650 | dependencies = [ 651 | "axum", 652 | "base64 0.22.1", 653 | "futures", 654 | "jsonwebtoken", 655 | "reqwest", 656 | "serde", 657 | "serde_json", 658 | "tokio", 659 | "tracing", 660 | ] 661 | 662 | [[package]] 663 | name = "flate2" 664 | version = "1.1.0" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" 667 | dependencies = [ 668 | "crc32fast", 669 | "miniz_oxide", 670 | ] 671 | 672 | [[package]] 673 | name = "float-cmp" 674 | version = "0.10.0" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" 677 | dependencies = [ 678 | "num-traits", 679 | ] 680 | 681 | [[package]] 682 | name = "fnv" 683 | version = "1.0.7" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 686 | 687 | [[package]] 688 | name = "foldhash" 689 | version = "0.1.5" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 692 | 693 | [[package]] 694 | name = "foreign-types" 695 | version = "0.3.2" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 698 | dependencies = [ 699 | "foreign-types-shared", 700 | ] 701 | 702 | [[package]] 703 | name = "foreign-types-shared" 704 | version = "0.1.1" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 707 | 708 | [[package]] 709 | name = "form_urlencoded" 710 | version = "1.2.1" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 713 | dependencies = [ 714 | "percent-encoding", 715 | ] 716 | 717 | [[package]] 718 | name = "futures" 719 | version = "0.3.31" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 722 | dependencies = [ 723 | "futures-channel", 724 | "futures-core", 725 | "futures-executor", 726 | "futures-io", 727 | "futures-sink", 728 | "futures-task", 729 | "futures-util", 730 | ] 731 | 732 | [[package]] 733 | name = "futures-channel" 734 | version = "0.3.31" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 737 | dependencies = [ 738 | "futures-core", 739 | "futures-sink", 740 | ] 741 | 742 | [[package]] 743 | name = "futures-core" 744 | version = "0.3.31" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 747 | 748 | [[package]] 749 | name = "futures-executor" 750 | version = "0.3.31" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 753 | dependencies = [ 754 | "futures-core", 755 | "futures-task", 756 | "futures-util", 757 | ] 758 | 759 | [[package]] 760 | name = "futures-io" 761 | version = "0.3.31" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 764 | 765 | [[package]] 766 | name = "futures-macro" 767 | version = "0.3.31" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 770 | dependencies = [ 771 | "proc-macro2", 772 | "quote", 773 | "syn", 774 | ] 775 | 776 | [[package]] 777 | name = "futures-sink" 778 | version = "0.3.31" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 781 | 782 | [[package]] 783 | name = "futures-task" 784 | version = "0.3.31" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 787 | 788 | [[package]] 789 | name = "futures-timer" 790 | version = "3.0.3" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" 793 | 794 | [[package]] 795 | name = "futures-util" 796 | version = "0.3.31" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 799 | dependencies = [ 800 | "futures-channel", 801 | "futures-core", 802 | "futures-io", 803 | "futures-macro", 804 | "futures-sink", 805 | "futures-task", 806 | "memchr", 807 | "pin-project-lite", 808 | "pin-utils", 809 | "slab", 810 | ] 811 | 812 | [[package]] 813 | name = "generic-array" 814 | version = "0.14.7" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 817 | dependencies = [ 818 | "typenum", 819 | "version_check", 820 | ] 821 | 822 | [[package]] 823 | name = "getrandom" 824 | version = "0.2.15" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 827 | dependencies = [ 828 | "cfg-if", 829 | "js-sys", 830 | "libc", 831 | "wasi 0.11.0+wasi-snapshot-preview1", 832 | "wasm-bindgen", 833 | ] 834 | 835 | [[package]] 836 | name = "getrandom" 837 | version = "0.3.2" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 840 | dependencies = [ 841 | "cfg-if", 842 | "js-sys", 843 | "libc", 844 | "r-efi", 845 | "wasi 0.14.2+wasi-0.2.4", 846 | "wasm-bindgen", 847 | ] 848 | 849 | [[package]] 850 | name = "gimli" 851 | version = "0.31.1" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 854 | 855 | [[package]] 856 | name = "h2" 857 | version = "0.3.26" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 860 | dependencies = [ 861 | "bytes", 862 | "fnv", 863 | "futures-core", 864 | "futures-sink", 865 | "futures-util", 866 | "http 0.2.12", 867 | "indexmap 2.8.0", 868 | "slab", 869 | "tokio", 870 | "tokio-util", 871 | "tracing", 872 | ] 873 | 874 | [[package]] 875 | name = "halfbrown" 876 | version = "0.3.0" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" 879 | dependencies = [ 880 | "hashbrown 0.15.2", 881 | "serde", 882 | ] 883 | 884 | [[package]] 885 | name = "handlebars" 886 | version = "5.1.2" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" 889 | dependencies = [ 890 | "log", 891 | "pest", 892 | "pest_derive", 893 | "serde", 894 | "serde_json", 895 | "thiserror 1.0.69", 896 | ] 897 | 898 | [[package]] 899 | name = "hashbrown" 900 | version = "0.12.3" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 903 | 904 | [[package]] 905 | name = "hashbrown" 906 | version = "0.15.2" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 909 | dependencies = [ 910 | "allocator-api2", 911 | "equivalent", 912 | "foldhash", 913 | ] 914 | 915 | [[package]] 916 | name = "heck" 917 | version = "0.5.0" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 920 | 921 | [[package]] 922 | name = "hex" 923 | version = "0.4.3" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 926 | 927 | [[package]] 928 | name = "hmac" 929 | version = "0.12.1" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 932 | dependencies = [ 933 | "digest", 934 | ] 935 | 936 | [[package]] 937 | name = "http" 938 | version = "0.2.12" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 941 | dependencies = [ 942 | "bytes", 943 | "fnv", 944 | "itoa", 945 | ] 946 | 947 | [[package]] 948 | name = "http" 949 | version = "1.3.1" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 952 | dependencies = [ 953 | "bytes", 954 | "fnv", 955 | "itoa", 956 | ] 957 | 958 | [[package]] 959 | name = "http-body" 960 | version = "0.4.6" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 963 | dependencies = [ 964 | "bytes", 965 | "http 0.2.12", 966 | "pin-project-lite", 967 | ] 968 | 969 | [[package]] 970 | name = "http-body" 971 | version = "1.0.1" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 974 | dependencies = [ 975 | "bytes", 976 | "http 1.3.1", 977 | ] 978 | 979 | [[package]] 980 | name = "http-body-util" 981 | version = "0.1.3" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 984 | dependencies = [ 985 | "bytes", 986 | "futures-core", 987 | "http 1.3.1", 988 | "http-body 1.0.1", 989 | "pin-project-lite", 990 | ] 991 | 992 | [[package]] 993 | name = "httparse" 994 | version = "1.10.1" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 997 | 998 | [[package]] 999 | name = "httpdate" 1000 | version = "1.0.3" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1003 | 1004 | [[package]] 1005 | name = "hyper" 1006 | version = "0.14.32" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 1009 | dependencies = [ 1010 | "bytes", 1011 | "futures-channel", 1012 | "futures-core", 1013 | "futures-util", 1014 | "h2", 1015 | "http 0.2.12", 1016 | "http-body 0.4.6", 1017 | "httparse", 1018 | "httpdate", 1019 | "itoa", 1020 | "pin-project-lite", 1021 | "socket2", 1022 | "tokio", 1023 | "tower-service", 1024 | "tracing", 1025 | "want", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "hyper" 1030 | version = "1.6.0" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1033 | dependencies = [ 1034 | "bytes", 1035 | "futures-channel", 1036 | "futures-util", 1037 | "http 1.3.1", 1038 | "http-body 1.0.1", 1039 | "httparse", 1040 | "httpdate", 1041 | "itoa", 1042 | "pin-project-lite", 1043 | "smallvec", 1044 | "tokio", 1045 | ] 1046 | 1047 | [[package]] 1048 | name = "hyper-tls" 1049 | version = "0.5.0" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1052 | dependencies = [ 1053 | "bytes", 1054 | "hyper 0.14.32", 1055 | "native-tls", 1056 | "tokio", 1057 | "tokio-native-tls", 1058 | ] 1059 | 1060 | [[package]] 1061 | name = "hyper-util" 1062 | version = "0.1.10" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 1065 | dependencies = [ 1066 | "bytes", 1067 | "futures-util", 1068 | "http 1.3.1", 1069 | "http-body 1.0.1", 1070 | "hyper 1.6.0", 1071 | "pin-project-lite", 1072 | "tokio", 1073 | "tower-service", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "iana-time-zone" 1078 | version = "0.1.61" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1081 | dependencies = [ 1082 | "android_system_properties", 1083 | "core-foundation-sys", 1084 | "iana-time-zone-haiku", 1085 | "js-sys", 1086 | "wasm-bindgen", 1087 | "windows-core", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "iana-time-zone-haiku" 1092 | version = "0.1.2" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1095 | dependencies = [ 1096 | "cc", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "icu_collections" 1101 | version = "1.5.0" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1104 | dependencies = [ 1105 | "displaydoc", 1106 | "yoke", 1107 | "zerofrom", 1108 | "zerovec", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "icu_locid" 1113 | version = "1.5.0" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1116 | dependencies = [ 1117 | "displaydoc", 1118 | "litemap", 1119 | "tinystr", 1120 | "writeable", 1121 | "zerovec", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "icu_locid_transform" 1126 | version = "1.5.0" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1129 | dependencies = [ 1130 | "displaydoc", 1131 | "icu_locid", 1132 | "icu_locid_transform_data", 1133 | "icu_provider", 1134 | "tinystr", 1135 | "zerovec", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "icu_locid_transform_data" 1140 | version = "1.5.0" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1143 | 1144 | [[package]] 1145 | name = "icu_normalizer" 1146 | version = "1.5.0" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1149 | dependencies = [ 1150 | "displaydoc", 1151 | "icu_collections", 1152 | "icu_normalizer_data", 1153 | "icu_properties", 1154 | "icu_provider", 1155 | "smallvec", 1156 | "utf16_iter", 1157 | "utf8_iter", 1158 | "write16", 1159 | "zerovec", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "icu_normalizer_data" 1164 | version = "1.5.0" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1167 | 1168 | [[package]] 1169 | name = "icu_properties" 1170 | version = "1.5.1" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1173 | dependencies = [ 1174 | "displaydoc", 1175 | "icu_collections", 1176 | "icu_locid_transform", 1177 | "icu_properties_data", 1178 | "icu_provider", 1179 | "tinystr", 1180 | "zerovec", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "icu_properties_data" 1185 | version = "1.5.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1188 | 1189 | [[package]] 1190 | name = "icu_provider" 1191 | version = "1.5.0" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1194 | dependencies = [ 1195 | "displaydoc", 1196 | "icu_locid", 1197 | "icu_provider_macros", 1198 | "stable_deref_trait", 1199 | "tinystr", 1200 | "writeable", 1201 | "yoke", 1202 | "zerofrom", 1203 | "zerovec", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "icu_provider_macros" 1208 | version = "1.5.0" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1211 | dependencies = [ 1212 | "proc-macro2", 1213 | "quote", 1214 | "syn", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "ident_case" 1219 | version = "1.0.1" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1222 | 1223 | [[package]] 1224 | name = "idna" 1225 | version = "1.0.3" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1228 | dependencies = [ 1229 | "idna_adapter", 1230 | "smallvec", 1231 | "utf8_iter", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "idna_adapter" 1236 | version = "1.2.0" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1239 | dependencies = [ 1240 | "icu_normalizer", 1241 | "icu_properties", 1242 | ] 1243 | 1244 | [[package]] 1245 | name = "indexmap" 1246 | version = "1.9.3" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1249 | dependencies = [ 1250 | "autocfg", 1251 | "hashbrown 0.12.3", 1252 | "serde", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "indexmap" 1257 | version = "2.8.0" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" 1260 | dependencies = [ 1261 | "equivalent", 1262 | "hashbrown 0.15.2", 1263 | "serde", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "ipnet" 1268 | version = "2.11.0" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1271 | 1272 | [[package]] 1273 | name = "itertools" 1274 | version = "0.14.0" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1277 | dependencies = [ 1278 | "either", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "itoa" 1283 | version = "1.0.15" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1286 | 1287 | [[package]] 1288 | name = "js-sys" 1289 | version = "0.3.77" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1292 | dependencies = [ 1293 | "once_cell", 1294 | "wasm-bindgen", 1295 | ] 1296 | 1297 | [[package]] 1298 | name = "jsonwebtoken" 1299 | version = "9.3.1" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" 1302 | dependencies = [ 1303 | "base64 0.22.1", 1304 | "js-sys", 1305 | "pem", 1306 | "ring", 1307 | "serde", 1308 | "serde_json", 1309 | "simple_asn1", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "lazy_static" 1314 | version = "1.5.0" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1317 | 1318 | [[package]] 1319 | name = "libc" 1320 | version = "0.2.171" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" 1323 | 1324 | [[package]] 1325 | name = "linux-raw-sys" 1326 | version = "0.9.3" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" 1329 | 1330 | [[package]] 1331 | name = "litemap" 1332 | version = "0.7.5" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 1335 | 1336 | [[package]] 1337 | name = "lock_api" 1338 | version = "0.4.12" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1341 | dependencies = [ 1342 | "autocfg", 1343 | "scopeguard", 1344 | ] 1345 | 1346 | [[package]] 1347 | name = "log" 1348 | version = "0.4.26" 1349 | source = "registry+https://github.com/rust-lang/crates.io-index" 1350 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 1351 | 1352 | [[package]] 1353 | name = "lru" 1354 | version = "0.12.5" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1357 | dependencies = [ 1358 | "hashbrown 0.15.2", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "matchit" 1363 | version = "0.8.4" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 1366 | 1367 | [[package]] 1368 | name = "md-5" 1369 | version = "0.10.6" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1372 | dependencies = [ 1373 | "cfg-if", 1374 | "digest", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "memchr" 1379 | version = "2.7.4" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1382 | 1383 | [[package]] 1384 | name = "mime" 1385 | version = "0.3.17" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1388 | 1389 | [[package]] 1390 | name = "miniz_oxide" 1391 | version = "0.8.5" 1392 | source = "registry+https://github.com/rust-lang/crates.io-index" 1393 | checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 1394 | dependencies = [ 1395 | "adler2", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "mio" 1400 | version = "1.0.3" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1403 | dependencies = [ 1404 | "libc", 1405 | "wasi 0.11.0+wasi-snapshot-preview1", 1406 | "windows-sys 0.52.0", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "multer" 1411 | version = "3.1.0" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" 1414 | dependencies = [ 1415 | "bytes", 1416 | "encoding_rs", 1417 | "futures-util", 1418 | "http 1.3.1", 1419 | "httparse", 1420 | "memchr", 1421 | "mime", 1422 | "spin", 1423 | "version_check", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "native-tls" 1428 | version = "0.2.14" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1431 | dependencies = [ 1432 | "libc", 1433 | "log", 1434 | "openssl", 1435 | "openssl-probe", 1436 | "openssl-sys", 1437 | "schannel", 1438 | "security-framework", 1439 | "security-framework-sys", 1440 | "tempfile", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "nu-ansi-term" 1445 | version = "0.46.0" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1448 | dependencies = [ 1449 | "overload", 1450 | "winapi", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "num-bigint" 1455 | version = "0.4.6" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1458 | dependencies = [ 1459 | "num-integer", 1460 | "num-traits", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "num-conv" 1465 | version = "0.1.0" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1468 | 1469 | [[package]] 1470 | name = "num-integer" 1471 | version = "0.1.46" 1472 | source = "registry+https://github.com/rust-lang/crates.io-index" 1473 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1474 | dependencies = [ 1475 | "num-traits", 1476 | ] 1477 | 1478 | [[package]] 1479 | name = "num-traits" 1480 | version = "0.2.19" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1483 | dependencies = [ 1484 | "autocfg", 1485 | ] 1486 | 1487 | [[package]] 1488 | name = "object" 1489 | version = "0.36.7" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1492 | dependencies = [ 1493 | "memchr", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "once_cell" 1498 | version = "1.21.1" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" 1501 | 1502 | [[package]] 1503 | name = "openssl" 1504 | version = "0.10.71" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" 1507 | dependencies = [ 1508 | "bitflags 2.9.0", 1509 | "cfg-if", 1510 | "foreign-types", 1511 | "libc", 1512 | "once_cell", 1513 | "openssl-macros", 1514 | "openssl-sys", 1515 | ] 1516 | 1517 | [[package]] 1518 | name = "openssl-macros" 1519 | version = "0.1.1" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1522 | dependencies = [ 1523 | "proc-macro2", 1524 | "quote", 1525 | "syn", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "openssl-probe" 1530 | version = "0.1.6" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1533 | 1534 | [[package]] 1535 | name = "openssl-sys" 1536 | version = "0.9.106" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" 1539 | dependencies = [ 1540 | "cc", 1541 | "libc", 1542 | "pkg-config", 1543 | "vcpkg", 1544 | ] 1545 | 1546 | [[package]] 1547 | name = "overload" 1548 | version = "0.1.1" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1551 | 1552 | [[package]] 1553 | name = "parking_lot" 1554 | version = "0.12.3" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1557 | dependencies = [ 1558 | "lock_api", 1559 | "parking_lot_core", 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "parking_lot_core" 1564 | version = "0.9.10" 1565 | source = "registry+https://github.com/rust-lang/crates.io-index" 1566 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1567 | dependencies = [ 1568 | "cfg-if", 1569 | "libc", 1570 | "redox_syscall", 1571 | "smallvec", 1572 | "windows-targets 0.52.6", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "pem" 1577 | version = "3.0.5" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" 1580 | dependencies = [ 1581 | "base64 0.22.1", 1582 | "serde", 1583 | ] 1584 | 1585 | [[package]] 1586 | name = "percent-encoding" 1587 | version = "2.3.1" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1590 | 1591 | [[package]] 1592 | name = "pest" 1593 | version = "2.7.15" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" 1596 | dependencies = [ 1597 | "memchr", 1598 | "thiserror 2.0.12", 1599 | "ucd-trie", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "pest_derive" 1604 | version = "2.7.15" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" 1607 | dependencies = [ 1608 | "pest", 1609 | "pest_generator", 1610 | ] 1611 | 1612 | [[package]] 1613 | name = "pest_generator" 1614 | version = "2.7.15" 1615 | source = "registry+https://github.com/rust-lang/crates.io-index" 1616 | checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" 1617 | dependencies = [ 1618 | "pest", 1619 | "pest_meta", 1620 | "proc-macro2", 1621 | "quote", 1622 | "syn", 1623 | ] 1624 | 1625 | [[package]] 1626 | name = "pest_meta" 1627 | version = "2.7.15" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" 1630 | dependencies = [ 1631 | "once_cell", 1632 | "pest", 1633 | "sha2", 1634 | ] 1635 | 1636 | [[package]] 1637 | name = "phf" 1638 | version = "0.11.3" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 1641 | dependencies = [ 1642 | "phf_shared", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "phf_shared" 1647 | version = "0.11.3" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1650 | dependencies = [ 1651 | "siphasher", 1652 | ] 1653 | 1654 | [[package]] 1655 | name = "pin-project-lite" 1656 | version = "0.2.16" 1657 | source = "registry+https://github.com/rust-lang/crates.io-index" 1658 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1659 | 1660 | [[package]] 1661 | name = "pin-utils" 1662 | version = "0.1.0" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1665 | 1666 | [[package]] 1667 | name = "pkg-config" 1668 | version = "0.3.32" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1671 | 1672 | [[package]] 1673 | name = "postgres-protocol" 1674 | version = "0.6.8" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" 1677 | dependencies = [ 1678 | "base64 0.22.1", 1679 | "byteorder", 1680 | "bytes", 1681 | "fallible-iterator", 1682 | "hmac", 1683 | "md-5", 1684 | "memchr", 1685 | "rand", 1686 | "sha2", 1687 | "stringprep", 1688 | ] 1689 | 1690 | [[package]] 1691 | name = "postgres-types" 1692 | version = "0.2.9" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" 1695 | dependencies = [ 1696 | "bytes", 1697 | "fallible-iterator", 1698 | "postgres-protocol", 1699 | ] 1700 | 1701 | [[package]] 1702 | name = "powerfmt" 1703 | version = "0.2.0" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1706 | 1707 | [[package]] 1708 | name = "ppv-lite86" 1709 | version = "0.2.21" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1712 | dependencies = [ 1713 | "zerocopy", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "proc-macro-crate" 1718 | version = "3.3.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 1721 | dependencies = [ 1722 | "toml_edit", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "proc-macro2" 1727 | version = "1.0.94" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 1730 | dependencies = [ 1731 | "unicode-ident", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "quote" 1736 | version = "1.0.40" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1739 | dependencies = [ 1740 | "proc-macro2", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "r-efi" 1745 | version = "5.2.0" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1748 | 1749 | [[package]] 1750 | name = "rand" 1751 | version = "0.9.0" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" 1754 | dependencies = [ 1755 | "rand_chacha", 1756 | "rand_core", 1757 | "zerocopy", 1758 | ] 1759 | 1760 | [[package]] 1761 | name = "rand_chacha" 1762 | version = "0.9.0" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1765 | dependencies = [ 1766 | "ppv-lite86", 1767 | "rand_core", 1768 | ] 1769 | 1770 | [[package]] 1771 | name = "rand_core" 1772 | version = "0.9.3" 1773 | source = "registry+https://github.com/rust-lang/crates.io-index" 1774 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1775 | dependencies = [ 1776 | "getrandom 0.3.2", 1777 | ] 1778 | 1779 | [[package]] 1780 | name = "rayon" 1781 | version = "1.10.0" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1784 | dependencies = [ 1785 | "either", 1786 | "rayon-core", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "rayon-core" 1791 | version = "1.12.1" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1794 | dependencies = [ 1795 | "crossbeam-deque", 1796 | "crossbeam-utils", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "redis" 1801 | version = "0.29.2" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "b110459d6e323b7cda23980c46c77157601199c9da6241552b284cd565a7a133" 1804 | dependencies = [ 1805 | "arc-swap", 1806 | "bytes", 1807 | "combine", 1808 | "futures-util", 1809 | "itoa", 1810 | "num-bigint", 1811 | "percent-encoding", 1812 | "pin-project-lite", 1813 | "ryu", 1814 | "sha1_smol", 1815 | "socket2", 1816 | "tokio", 1817 | "tokio-util", 1818 | "url", 1819 | ] 1820 | 1821 | [[package]] 1822 | name = "redox_syscall" 1823 | version = "0.5.10" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" 1826 | dependencies = [ 1827 | "bitflags 2.9.0", 1828 | ] 1829 | 1830 | [[package]] 1831 | name = "ref-cast" 1832 | version = "1.0.24" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 1835 | dependencies = [ 1836 | "ref-cast-impl", 1837 | ] 1838 | 1839 | [[package]] 1840 | name = "ref-cast-impl" 1841 | version = "1.0.24" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 1844 | dependencies = [ 1845 | "proc-macro2", 1846 | "quote", 1847 | "syn", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "regex" 1852 | version = "1.11.1" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1855 | dependencies = [ 1856 | "aho-corasick", 1857 | "memchr", 1858 | "regex-automata", 1859 | "regex-syntax", 1860 | ] 1861 | 1862 | [[package]] 1863 | name = "regex-automata" 1864 | version = "0.4.9" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1867 | dependencies = [ 1868 | "aho-corasick", 1869 | "memchr", 1870 | "regex-syntax", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "regex-syntax" 1875 | version = "0.8.5" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1878 | 1879 | [[package]] 1880 | name = "reqwest" 1881 | version = "0.11.27" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 1884 | dependencies = [ 1885 | "base64 0.21.7", 1886 | "bytes", 1887 | "encoding_rs", 1888 | "futures-core", 1889 | "futures-util", 1890 | "h2", 1891 | "http 0.2.12", 1892 | "http-body 0.4.6", 1893 | "hyper 0.14.32", 1894 | "hyper-tls", 1895 | "ipnet", 1896 | "js-sys", 1897 | "log", 1898 | "mime", 1899 | "native-tls", 1900 | "once_cell", 1901 | "percent-encoding", 1902 | "pin-project-lite", 1903 | "rustls-pemfile", 1904 | "serde", 1905 | "serde_json", 1906 | "serde_urlencoded", 1907 | "sync_wrapper 0.1.2", 1908 | "system-configuration", 1909 | "tokio", 1910 | "tokio-native-tls", 1911 | "tower-service", 1912 | "url", 1913 | "wasm-bindgen", 1914 | "wasm-bindgen-futures", 1915 | "web-sys", 1916 | "winreg", 1917 | ] 1918 | 1919 | [[package]] 1920 | name = "ring" 1921 | version = "0.17.14" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1924 | dependencies = [ 1925 | "cc", 1926 | "cfg-if", 1927 | "getrandom 0.2.15", 1928 | "libc", 1929 | "untrusted", 1930 | "windows-sys 0.52.0", 1931 | ] 1932 | 1933 | [[package]] 1934 | name = "rust-axum-async-graphql-postgres-redis-starter" 1935 | version = "0.1.0" 1936 | dependencies = [ 1937 | "anyhow", 1938 | "async-graphql", 1939 | "async-graphql-axum", 1940 | "axum", 1941 | "axum-extra", 1942 | "bb8", 1943 | "bb8-postgres", 1944 | "bb8-redis", 1945 | "dotenvy", 1946 | "firebase-auth", 1947 | "itertools", 1948 | "rayon", 1949 | "redis", 1950 | "serde", 1951 | "serde_json", 1952 | "serde_with", 1953 | "serde_with_macros", 1954 | "simd-json", 1955 | "thiserror 2.0.12", 1956 | "tikv-jemallocator", 1957 | "tokio", 1958 | "tokio-postgres", 1959 | "tokio-stream", 1960 | "tower", 1961 | "tower-http", 1962 | "tracing", 1963 | "tracing-subscriber", 1964 | ] 1965 | 1966 | [[package]] 1967 | name = "rustc-demangle" 1968 | version = "0.1.24" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1971 | 1972 | [[package]] 1973 | name = "rustix" 1974 | version = "1.0.3" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" 1977 | dependencies = [ 1978 | "bitflags 2.9.0", 1979 | "errno", 1980 | "libc", 1981 | "linux-raw-sys", 1982 | "windows-sys 0.59.0", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "rustls-pemfile" 1987 | version = "1.0.4" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1990 | dependencies = [ 1991 | "base64 0.21.7", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "rustversion" 1996 | version = "1.0.20" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1999 | 2000 | [[package]] 2001 | name = "ryu" 2002 | version = "1.0.20" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 2005 | 2006 | [[package]] 2007 | name = "schannel" 2008 | version = "0.1.27" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 2011 | dependencies = [ 2012 | "windows-sys 0.59.0", 2013 | ] 2014 | 2015 | [[package]] 2016 | name = "scopeguard" 2017 | version = "1.2.0" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2020 | 2021 | [[package]] 2022 | name = "security-framework" 2023 | version = "2.11.1" 2024 | source = "registry+https://github.com/rust-lang/crates.io-index" 2025 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 2026 | dependencies = [ 2027 | "bitflags 2.9.0", 2028 | "core-foundation", 2029 | "core-foundation-sys", 2030 | "libc", 2031 | "security-framework-sys", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "security-framework-sys" 2036 | version = "2.14.0" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 2039 | dependencies = [ 2040 | "core-foundation-sys", 2041 | "libc", 2042 | ] 2043 | 2044 | [[package]] 2045 | name = "serde" 2046 | version = "1.0.219" 2047 | source = "registry+https://github.com/rust-lang/crates.io-index" 2048 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2049 | dependencies = [ 2050 | "serde_derive", 2051 | ] 2052 | 2053 | [[package]] 2054 | name = "serde_derive" 2055 | version = "1.0.219" 2056 | source = "registry+https://github.com/rust-lang/crates.io-index" 2057 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2058 | dependencies = [ 2059 | "proc-macro2", 2060 | "quote", 2061 | "syn", 2062 | ] 2063 | 2064 | [[package]] 2065 | name = "serde_json" 2066 | version = "1.0.140" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 2069 | dependencies = [ 2070 | "itoa", 2071 | "memchr", 2072 | "ryu", 2073 | "serde", 2074 | ] 2075 | 2076 | [[package]] 2077 | name = "serde_path_to_error" 2078 | version = "0.1.17" 2079 | source = "registry+https://github.com/rust-lang/crates.io-index" 2080 | checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 2081 | dependencies = [ 2082 | "itoa", 2083 | "serde", 2084 | ] 2085 | 2086 | [[package]] 2087 | name = "serde_urlencoded" 2088 | version = "0.7.1" 2089 | source = "registry+https://github.com/rust-lang/crates.io-index" 2090 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2091 | dependencies = [ 2092 | "form_urlencoded", 2093 | "itoa", 2094 | "ryu", 2095 | "serde", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "serde_with" 2100 | version = "3.12.0" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" 2103 | dependencies = [ 2104 | "base64 0.22.1", 2105 | "chrono", 2106 | "hex", 2107 | "indexmap 1.9.3", 2108 | "indexmap 2.8.0", 2109 | "serde", 2110 | "serde_derive", 2111 | "serde_json", 2112 | "serde_with_macros", 2113 | "time", 2114 | ] 2115 | 2116 | [[package]] 2117 | name = "serde_with_macros" 2118 | version = "3.12.0" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" 2121 | dependencies = [ 2122 | "darling", 2123 | "proc-macro2", 2124 | "quote", 2125 | "syn", 2126 | ] 2127 | 2128 | [[package]] 2129 | name = "sha1" 2130 | version = "0.10.6" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2133 | dependencies = [ 2134 | "cfg-if", 2135 | "cpufeatures", 2136 | "digest", 2137 | ] 2138 | 2139 | [[package]] 2140 | name = "sha1_smol" 2141 | version = "1.0.1" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" 2144 | 2145 | [[package]] 2146 | name = "sha2" 2147 | version = "0.10.8" 2148 | source = "registry+https://github.com/rust-lang/crates.io-index" 2149 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2150 | dependencies = [ 2151 | "cfg-if", 2152 | "cpufeatures", 2153 | "digest", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "sharded-slab" 2158 | version = "0.1.7" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2161 | dependencies = [ 2162 | "lazy_static", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "shlex" 2167 | version = "1.3.0" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2170 | 2171 | [[package]] 2172 | name = "simd-json" 2173 | version = "0.15.0" 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" 2175 | checksum = "10b5602e4f1f7d358956f94cac1eff59220f34cf9e26d49f5fde5acef851cbed" 2176 | dependencies = [ 2177 | "getrandom 0.3.2", 2178 | "halfbrown", 2179 | "ref-cast", 2180 | "serde", 2181 | "serde_json", 2182 | "simdutf8", 2183 | "value-trait", 2184 | ] 2185 | 2186 | [[package]] 2187 | name = "simdutf8" 2188 | version = "0.1.5" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" 2191 | 2192 | [[package]] 2193 | name = "simple_asn1" 2194 | version = "0.6.3" 2195 | source = "registry+https://github.com/rust-lang/crates.io-index" 2196 | checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" 2197 | dependencies = [ 2198 | "num-bigint", 2199 | "num-traits", 2200 | "thiserror 2.0.12", 2201 | "time", 2202 | ] 2203 | 2204 | [[package]] 2205 | name = "siphasher" 2206 | version = "1.0.1" 2207 | source = "registry+https://github.com/rust-lang/crates.io-index" 2208 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2209 | 2210 | [[package]] 2211 | name = "slab" 2212 | version = "0.4.9" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2215 | dependencies = [ 2216 | "autocfg", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "smallvec" 2221 | version = "1.14.0" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 2224 | 2225 | [[package]] 2226 | name = "socket2" 2227 | version = "0.5.8" 2228 | source = "registry+https://github.com/rust-lang/crates.io-index" 2229 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 2230 | dependencies = [ 2231 | "libc", 2232 | "windows-sys 0.52.0", 2233 | ] 2234 | 2235 | [[package]] 2236 | name = "spin" 2237 | version = "0.9.8" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2240 | 2241 | [[package]] 2242 | name = "stable_deref_trait" 2243 | version = "1.2.0" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2246 | 2247 | [[package]] 2248 | name = "static_assertions_next" 2249 | version = "1.1.2" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "d7beae5182595e9a8b683fa98c4317f956c9a2dec3b9716990d20023cc60c766" 2252 | 2253 | [[package]] 2254 | name = "stringprep" 2255 | version = "0.1.5" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 2258 | dependencies = [ 2259 | "unicode-bidi", 2260 | "unicode-normalization", 2261 | "unicode-properties", 2262 | ] 2263 | 2264 | [[package]] 2265 | name = "strsim" 2266 | version = "0.11.1" 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" 2268 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2269 | 2270 | [[package]] 2271 | name = "strum" 2272 | version = "0.26.3" 2273 | source = "registry+https://github.com/rust-lang/crates.io-index" 2274 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 2275 | dependencies = [ 2276 | "strum_macros", 2277 | ] 2278 | 2279 | [[package]] 2280 | name = "strum_macros" 2281 | version = "0.26.4" 2282 | source = "registry+https://github.com/rust-lang/crates.io-index" 2283 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 2284 | dependencies = [ 2285 | "heck", 2286 | "proc-macro2", 2287 | "quote", 2288 | "rustversion", 2289 | "syn", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "subtle" 2294 | version = "2.6.1" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2297 | 2298 | [[package]] 2299 | name = "syn" 2300 | version = "2.0.100" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 2303 | dependencies = [ 2304 | "proc-macro2", 2305 | "quote", 2306 | "unicode-ident", 2307 | ] 2308 | 2309 | [[package]] 2310 | name = "sync_wrapper" 2311 | version = "0.1.2" 2312 | source = "registry+https://github.com/rust-lang/crates.io-index" 2313 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 2314 | 2315 | [[package]] 2316 | name = "sync_wrapper" 2317 | version = "1.0.2" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2320 | 2321 | [[package]] 2322 | name = "synstructure" 2323 | version = "0.13.1" 2324 | source = "registry+https://github.com/rust-lang/crates.io-index" 2325 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2326 | dependencies = [ 2327 | "proc-macro2", 2328 | "quote", 2329 | "syn", 2330 | ] 2331 | 2332 | [[package]] 2333 | name = "system-configuration" 2334 | version = "0.5.1" 2335 | source = "registry+https://github.com/rust-lang/crates.io-index" 2336 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 2337 | dependencies = [ 2338 | "bitflags 1.3.2", 2339 | "core-foundation", 2340 | "system-configuration-sys", 2341 | ] 2342 | 2343 | [[package]] 2344 | name = "system-configuration-sys" 2345 | version = "0.5.0" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 2348 | dependencies = [ 2349 | "core-foundation-sys", 2350 | "libc", 2351 | ] 2352 | 2353 | [[package]] 2354 | name = "tempfile" 2355 | version = "3.19.1" 2356 | source = "registry+https://github.com/rust-lang/crates.io-index" 2357 | checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" 2358 | dependencies = [ 2359 | "fastrand", 2360 | "getrandom 0.3.2", 2361 | "once_cell", 2362 | "rustix", 2363 | "windows-sys 0.59.0", 2364 | ] 2365 | 2366 | [[package]] 2367 | name = "thiserror" 2368 | version = "1.0.69" 2369 | source = "registry+https://github.com/rust-lang/crates.io-index" 2370 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2371 | dependencies = [ 2372 | "thiserror-impl 1.0.69", 2373 | ] 2374 | 2375 | [[package]] 2376 | name = "thiserror" 2377 | version = "2.0.12" 2378 | source = "registry+https://github.com/rust-lang/crates.io-index" 2379 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 2380 | dependencies = [ 2381 | "thiserror-impl 2.0.12", 2382 | ] 2383 | 2384 | [[package]] 2385 | name = "thiserror-impl" 2386 | version = "1.0.69" 2387 | source = "registry+https://github.com/rust-lang/crates.io-index" 2388 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2389 | dependencies = [ 2390 | "proc-macro2", 2391 | "quote", 2392 | "syn", 2393 | ] 2394 | 2395 | [[package]] 2396 | name = "thiserror-impl" 2397 | version = "2.0.12" 2398 | source = "registry+https://github.com/rust-lang/crates.io-index" 2399 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 2400 | dependencies = [ 2401 | "proc-macro2", 2402 | "quote", 2403 | "syn", 2404 | ] 2405 | 2406 | [[package]] 2407 | name = "thread_local" 2408 | version = "1.1.8" 2409 | source = "registry+https://github.com/rust-lang/crates.io-index" 2410 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2411 | dependencies = [ 2412 | "cfg-if", 2413 | "once_cell", 2414 | ] 2415 | 2416 | [[package]] 2417 | name = "tikv-jemalloc-sys" 2418 | version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" 2421 | dependencies = [ 2422 | "cc", 2423 | "libc", 2424 | ] 2425 | 2426 | [[package]] 2427 | name = "tikv-jemallocator" 2428 | version = "0.6.0" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" 2431 | dependencies = [ 2432 | "libc", 2433 | "tikv-jemalloc-sys", 2434 | ] 2435 | 2436 | [[package]] 2437 | name = "time" 2438 | version = "0.3.41" 2439 | source = "registry+https://github.com/rust-lang/crates.io-index" 2440 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 2441 | dependencies = [ 2442 | "deranged", 2443 | "itoa", 2444 | "num-conv", 2445 | "powerfmt", 2446 | "serde", 2447 | "time-core", 2448 | "time-macros", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "time-core" 2453 | version = "0.1.4" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 2456 | 2457 | [[package]] 2458 | name = "time-macros" 2459 | version = "0.2.22" 2460 | source = "registry+https://github.com/rust-lang/crates.io-index" 2461 | checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 2462 | dependencies = [ 2463 | "num-conv", 2464 | "time-core", 2465 | ] 2466 | 2467 | [[package]] 2468 | name = "tinystr" 2469 | version = "0.7.6" 2470 | source = "registry+https://github.com/rust-lang/crates.io-index" 2471 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2472 | dependencies = [ 2473 | "displaydoc", 2474 | "zerovec", 2475 | ] 2476 | 2477 | [[package]] 2478 | name = "tinyvec" 2479 | version = "1.9.0" 2480 | source = "registry+https://github.com/rust-lang/crates.io-index" 2481 | checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 2482 | dependencies = [ 2483 | "tinyvec_macros", 2484 | ] 2485 | 2486 | [[package]] 2487 | name = "tinyvec_macros" 2488 | version = "0.1.1" 2489 | source = "registry+https://github.com/rust-lang/crates.io-index" 2490 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2491 | 2492 | [[package]] 2493 | name = "tokio" 2494 | version = "1.44.1" 2495 | source = "registry+https://github.com/rust-lang/crates.io-index" 2496 | checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" 2497 | dependencies = [ 2498 | "backtrace", 2499 | "bytes", 2500 | "libc", 2501 | "mio", 2502 | "parking_lot", 2503 | "pin-project-lite", 2504 | "socket2", 2505 | "tokio-macros", 2506 | "windows-sys 0.52.0", 2507 | ] 2508 | 2509 | [[package]] 2510 | name = "tokio-macros" 2511 | version = "2.5.0" 2512 | source = "registry+https://github.com/rust-lang/crates.io-index" 2513 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2514 | dependencies = [ 2515 | "proc-macro2", 2516 | "quote", 2517 | "syn", 2518 | ] 2519 | 2520 | [[package]] 2521 | name = "tokio-native-tls" 2522 | version = "0.3.1" 2523 | source = "registry+https://github.com/rust-lang/crates.io-index" 2524 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2525 | dependencies = [ 2526 | "native-tls", 2527 | "tokio", 2528 | ] 2529 | 2530 | [[package]] 2531 | name = "tokio-postgres" 2532 | version = "0.7.13" 2533 | source = "registry+https://github.com/rust-lang/crates.io-index" 2534 | checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" 2535 | dependencies = [ 2536 | "async-trait", 2537 | "byteorder", 2538 | "bytes", 2539 | "fallible-iterator", 2540 | "futures-channel", 2541 | "futures-util", 2542 | "log", 2543 | "parking_lot", 2544 | "percent-encoding", 2545 | "phf", 2546 | "pin-project-lite", 2547 | "postgres-protocol", 2548 | "postgres-types", 2549 | "rand", 2550 | "socket2", 2551 | "tokio", 2552 | "tokio-util", 2553 | "whoami", 2554 | ] 2555 | 2556 | [[package]] 2557 | name = "tokio-stream" 2558 | version = "0.1.17" 2559 | source = "registry+https://github.com/rust-lang/crates.io-index" 2560 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 2561 | dependencies = [ 2562 | "futures-core", 2563 | "pin-project-lite", 2564 | "tokio", 2565 | ] 2566 | 2567 | [[package]] 2568 | name = "tokio-tungstenite" 2569 | version = "0.26.2" 2570 | source = "registry+https://github.com/rust-lang/crates.io-index" 2571 | checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" 2572 | dependencies = [ 2573 | "futures-util", 2574 | "log", 2575 | "tokio", 2576 | "tungstenite", 2577 | ] 2578 | 2579 | [[package]] 2580 | name = "tokio-util" 2581 | version = "0.7.14" 2582 | source = "registry+https://github.com/rust-lang/crates.io-index" 2583 | checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" 2584 | dependencies = [ 2585 | "bytes", 2586 | "futures-core", 2587 | "futures-io", 2588 | "futures-sink", 2589 | "pin-project-lite", 2590 | "tokio", 2591 | ] 2592 | 2593 | [[package]] 2594 | name = "toml_datetime" 2595 | version = "0.6.8" 2596 | source = "registry+https://github.com/rust-lang/crates.io-index" 2597 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 2598 | 2599 | [[package]] 2600 | name = "toml_edit" 2601 | version = "0.22.24" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" 2604 | dependencies = [ 2605 | "indexmap 2.8.0", 2606 | "toml_datetime", 2607 | "winnow", 2608 | ] 2609 | 2610 | [[package]] 2611 | name = "tower" 2612 | version = "0.5.2" 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" 2614 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2615 | dependencies = [ 2616 | "futures-core", 2617 | "futures-util", 2618 | "pin-project-lite", 2619 | "sync_wrapper 1.0.2", 2620 | "tokio", 2621 | "tower-layer", 2622 | "tower-service", 2623 | "tracing", 2624 | ] 2625 | 2626 | [[package]] 2627 | name = "tower-http" 2628 | version = "0.6.2" 2629 | source = "registry+https://github.com/rust-lang/crates.io-index" 2630 | checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" 2631 | dependencies = [ 2632 | "async-compression", 2633 | "bitflags 2.9.0", 2634 | "bytes", 2635 | "futures-core", 2636 | "http 1.3.1", 2637 | "http-body 1.0.1", 2638 | "pin-project-lite", 2639 | "tokio", 2640 | "tokio-util", 2641 | "tower-layer", 2642 | "tower-service", 2643 | "tracing", 2644 | ] 2645 | 2646 | [[package]] 2647 | name = "tower-layer" 2648 | version = "0.3.3" 2649 | source = "registry+https://github.com/rust-lang/crates.io-index" 2650 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2651 | 2652 | [[package]] 2653 | name = "tower-service" 2654 | version = "0.3.3" 2655 | source = "registry+https://github.com/rust-lang/crates.io-index" 2656 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2657 | 2658 | [[package]] 2659 | name = "tracing" 2660 | version = "0.1.41" 2661 | source = "registry+https://github.com/rust-lang/crates.io-index" 2662 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2663 | dependencies = [ 2664 | "log", 2665 | "pin-project-lite", 2666 | "tracing-attributes", 2667 | "tracing-core", 2668 | ] 2669 | 2670 | [[package]] 2671 | name = "tracing-attributes" 2672 | version = "0.1.28" 2673 | source = "registry+https://github.com/rust-lang/crates.io-index" 2674 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2675 | dependencies = [ 2676 | "proc-macro2", 2677 | "quote", 2678 | "syn", 2679 | ] 2680 | 2681 | [[package]] 2682 | name = "tracing-core" 2683 | version = "0.1.33" 2684 | source = "registry+https://github.com/rust-lang/crates.io-index" 2685 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2686 | dependencies = [ 2687 | "once_cell", 2688 | "valuable", 2689 | ] 2690 | 2691 | [[package]] 2692 | name = "tracing-log" 2693 | version = "0.2.0" 2694 | source = "registry+https://github.com/rust-lang/crates.io-index" 2695 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2696 | dependencies = [ 2697 | "log", 2698 | "once_cell", 2699 | "tracing-core", 2700 | ] 2701 | 2702 | [[package]] 2703 | name = "tracing-subscriber" 2704 | version = "0.3.19" 2705 | source = "registry+https://github.com/rust-lang/crates.io-index" 2706 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 2707 | dependencies = [ 2708 | "nu-ansi-term", 2709 | "sharded-slab", 2710 | "smallvec", 2711 | "thread_local", 2712 | "tracing-core", 2713 | "tracing-log", 2714 | ] 2715 | 2716 | [[package]] 2717 | name = "try-lock" 2718 | version = "0.2.5" 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" 2720 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2721 | 2722 | [[package]] 2723 | name = "tungstenite" 2724 | version = "0.26.2" 2725 | source = "registry+https://github.com/rust-lang/crates.io-index" 2726 | checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" 2727 | dependencies = [ 2728 | "bytes", 2729 | "data-encoding", 2730 | "http 1.3.1", 2731 | "httparse", 2732 | "log", 2733 | "rand", 2734 | "sha1", 2735 | "thiserror 2.0.12", 2736 | "utf-8", 2737 | ] 2738 | 2739 | [[package]] 2740 | name = "typenum" 2741 | version = "1.18.0" 2742 | source = "registry+https://github.com/rust-lang/crates.io-index" 2743 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2744 | 2745 | [[package]] 2746 | name = "ucd-trie" 2747 | version = "0.1.7" 2748 | source = "registry+https://github.com/rust-lang/crates.io-index" 2749 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2750 | 2751 | [[package]] 2752 | name = "unicode-bidi" 2753 | version = "0.3.18" 2754 | source = "registry+https://github.com/rust-lang/crates.io-index" 2755 | checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2756 | 2757 | [[package]] 2758 | name = "unicode-ident" 2759 | version = "1.0.18" 2760 | source = "registry+https://github.com/rust-lang/crates.io-index" 2761 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2762 | 2763 | [[package]] 2764 | name = "unicode-normalization" 2765 | version = "0.1.24" 2766 | source = "registry+https://github.com/rust-lang/crates.io-index" 2767 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2768 | dependencies = [ 2769 | "tinyvec", 2770 | ] 2771 | 2772 | [[package]] 2773 | name = "unicode-properties" 2774 | version = "0.1.3" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2777 | 2778 | [[package]] 2779 | name = "untrusted" 2780 | version = "0.9.0" 2781 | source = "registry+https://github.com/rust-lang/crates.io-index" 2782 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2783 | 2784 | [[package]] 2785 | name = "url" 2786 | version = "2.5.4" 2787 | source = "registry+https://github.com/rust-lang/crates.io-index" 2788 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2789 | dependencies = [ 2790 | "form_urlencoded", 2791 | "idna", 2792 | "percent-encoding", 2793 | ] 2794 | 2795 | [[package]] 2796 | name = "utf-8" 2797 | version = "0.7.6" 2798 | source = "registry+https://github.com/rust-lang/crates.io-index" 2799 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2800 | 2801 | [[package]] 2802 | name = "utf16_iter" 2803 | version = "1.0.5" 2804 | source = "registry+https://github.com/rust-lang/crates.io-index" 2805 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2806 | 2807 | [[package]] 2808 | name = "utf8_iter" 2809 | version = "1.0.4" 2810 | source = "registry+https://github.com/rust-lang/crates.io-index" 2811 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2812 | 2813 | [[package]] 2814 | name = "valuable" 2815 | version = "0.1.1" 2816 | source = "registry+https://github.com/rust-lang/crates.io-index" 2817 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2818 | 2819 | [[package]] 2820 | name = "value-trait" 2821 | version = "0.11.0" 2822 | source = "registry+https://github.com/rust-lang/crates.io-index" 2823 | checksum = "0508fce11ad19e0aab49ce20b6bec7f8f82902ded31df1c9fc61b90f0eb396b8" 2824 | dependencies = [ 2825 | "float-cmp", 2826 | "halfbrown", 2827 | "itoa", 2828 | "ryu", 2829 | ] 2830 | 2831 | [[package]] 2832 | name = "vcpkg" 2833 | version = "0.2.15" 2834 | source = "registry+https://github.com/rust-lang/crates.io-index" 2835 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2836 | 2837 | [[package]] 2838 | name = "version_check" 2839 | version = "0.9.5" 2840 | source = "registry+https://github.com/rust-lang/crates.io-index" 2841 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2842 | 2843 | [[package]] 2844 | name = "want" 2845 | version = "0.3.1" 2846 | source = "registry+https://github.com/rust-lang/crates.io-index" 2847 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2848 | dependencies = [ 2849 | "try-lock", 2850 | ] 2851 | 2852 | [[package]] 2853 | name = "wasi" 2854 | version = "0.11.0+wasi-snapshot-preview1" 2855 | source = "registry+https://github.com/rust-lang/crates.io-index" 2856 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2857 | 2858 | [[package]] 2859 | name = "wasi" 2860 | version = "0.14.2+wasi-0.2.4" 2861 | source = "registry+https://github.com/rust-lang/crates.io-index" 2862 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2863 | dependencies = [ 2864 | "wit-bindgen-rt", 2865 | ] 2866 | 2867 | [[package]] 2868 | name = "wasite" 2869 | version = "0.1.0" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2872 | 2873 | [[package]] 2874 | name = "wasm-bindgen" 2875 | version = "0.2.100" 2876 | source = "registry+https://github.com/rust-lang/crates.io-index" 2877 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2878 | dependencies = [ 2879 | "cfg-if", 2880 | "once_cell", 2881 | "rustversion", 2882 | "wasm-bindgen-macro", 2883 | ] 2884 | 2885 | [[package]] 2886 | name = "wasm-bindgen-backend" 2887 | version = "0.2.100" 2888 | source = "registry+https://github.com/rust-lang/crates.io-index" 2889 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2890 | dependencies = [ 2891 | "bumpalo", 2892 | "log", 2893 | "proc-macro2", 2894 | "quote", 2895 | "syn", 2896 | "wasm-bindgen-shared", 2897 | ] 2898 | 2899 | [[package]] 2900 | name = "wasm-bindgen-futures" 2901 | version = "0.4.50" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2904 | dependencies = [ 2905 | "cfg-if", 2906 | "js-sys", 2907 | "once_cell", 2908 | "wasm-bindgen", 2909 | "web-sys", 2910 | ] 2911 | 2912 | [[package]] 2913 | name = "wasm-bindgen-macro" 2914 | version = "0.2.100" 2915 | source = "registry+https://github.com/rust-lang/crates.io-index" 2916 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2917 | dependencies = [ 2918 | "quote", 2919 | "wasm-bindgen-macro-support", 2920 | ] 2921 | 2922 | [[package]] 2923 | name = "wasm-bindgen-macro-support" 2924 | version = "0.2.100" 2925 | source = "registry+https://github.com/rust-lang/crates.io-index" 2926 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2927 | dependencies = [ 2928 | "proc-macro2", 2929 | "quote", 2930 | "syn", 2931 | "wasm-bindgen-backend", 2932 | "wasm-bindgen-shared", 2933 | ] 2934 | 2935 | [[package]] 2936 | name = "wasm-bindgen-shared" 2937 | version = "0.2.100" 2938 | source = "registry+https://github.com/rust-lang/crates.io-index" 2939 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2940 | dependencies = [ 2941 | "unicode-ident", 2942 | ] 2943 | 2944 | [[package]] 2945 | name = "web-sys" 2946 | version = "0.3.77" 2947 | source = "registry+https://github.com/rust-lang/crates.io-index" 2948 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2949 | dependencies = [ 2950 | "js-sys", 2951 | "wasm-bindgen", 2952 | ] 2953 | 2954 | [[package]] 2955 | name = "whoami" 2956 | version = "1.5.2" 2957 | source = "registry+https://github.com/rust-lang/crates.io-index" 2958 | checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" 2959 | dependencies = [ 2960 | "redox_syscall", 2961 | "wasite", 2962 | "web-sys", 2963 | ] 2964 | 2965 | [[package]] 2966 | name = "winapi" 2967 | version = "0.3.9" 2968 | source = "registry+https://github.com/rust-lang/crates.io-index" 2969 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2970 | dependencies = [ 2971 | "winapi-i686-pc-windows-gnu", 2972 | "winapi-x86_64-pc-windows-gnu", 2973 | ] 2974 | 2975 | [[package]] 2976 | name = "winapi-i686-pc-windows-gnu" 2977 | version = "0.4.0" 2978 | source = "registry+https://github.com/rust-lang/crates.io-index" 2979 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2980 | 2981 | [[package]] 2982 | name = "winapi-x86_64-pc-windows-gnu" 2983 | version = "0.4.0" 2984 | source = "registry+https://github.com/rust-lang/crates.io-index" 2985 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2986 | 2987 | [[package]] 2988 | name = "windows-core" 2989 | version = "0.52.0" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2992 | dependencies = [ 2993 | "windows-targets 0.52.6", 2994 | ] 2995 | 2996 | [[package]] 2997 | name = "windows-link" 2998 | version = "0.1.1" 2999 | source = "registry+https://github.com/rust-lang/crates.io-index" 3000 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 3001 | 3002 | [[package]] 3003 | name = "windows-sys" 3004 | version = "0.48.0" 3005 | source = "registry+https://github.com/rust-lang/crates.io-index" 3006 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3007 | dependencies = [ 3008 | "windows-targets 0.48.5", 3009 | ] 3010 | 3011 | [[package]] 3012 | name = "windows-sys" 3013 | version = "0.52.0" 3014 | source = "registry+https://github.com/rust-lang/crates.io-index" 3015 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3016 | dependencies = [ 3017 | "windows-targets 0.52.6", 3018 | ] 3019 | 3020 | [[package]] 3021 | name = "windows-sys" 3022 | version = "0.59.0" 3023 | source = "registry+https://github.com/rust-lang/crates.io-index" 3024 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3025 | dependencies = [ 3026 | "windows-targets 0.52.6", 3027 | ] 3028 | 3029 | [[package]] 3030 | name = "windows-targets" 3031 | version = "0.48.5" 3032 | source = "registry+https://github.com/rust-lang/crates.io-index" 3033 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3034 | dependencies = [ 3035 | "windows_aarch64_gnullvm 0.48.5", 3036 | "windows_aarch64_msvc 0.48.5", 3037 | "windows_i686_gnu 0.48.5", 3038 | "windows_i686_msvc 0.48.5", 3039 | "windows_x86_64_gnu 0.48.5", 3040 | "windows_x86_64_gnullvm 0.48.5", 3041 | "windows_x86_64_msvc 0.48.5", 3042 | ] 3043 | 3044 | [[package]] 3045 | name = "windows-targets" 3046 | version = "0.52.6" 3047 | source = "registry+https://github.com/rust-lang/crates.io-index" 3048 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3049 | dependencies = [ 3050 | "windows_aarch64_gnullvm 0.52.6", 3051 | "windows_aarch64_msvc 0.52.6", 3052 | "windows_i686_gnu 0.52.6", 3053 | "windows_i686_gnullvm", 3054 | "windows_i686_msvc 0.52.6", 3055 | "windows_x86_64_gnu 0.52.6", 3056 | "windows_x86_64_gnullvm 0.52.6", 3057 | "windows_x86_64_msvc 0.52.6", 3058 | ] 3059 | 3060 | [[package]] 3061 | name = "windows_aarch64_gnullvm" 3062 | version = "0.48.5" 3063 | source = "registry+https://github.com/rust-lang/crates.io-index" 3064 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3065 | 3066 | [[package]] 3067 | name = "windows_aarch64_gnullvm" 3068 | version = "0.52.6" 3069 | source = "registry+https://github.com/rust-lang/crates.io-index" 3070 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3071 | 3072 | [[package]] 3073 | name = "windows_aarch64_msvc" 3074 | version = "0.48.5" 3075 | source = "registry+https://github.com/rust-lang/crates.io-index" 3076 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3077 | 3078 | [[package]] 3079 | name = "windows_aarch64_msvc" 3080 | version = "0.52.6" 3081 | source = "registry+https://github.com/rust-lang/crates.io-index" 3082 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3083 | 3084 | [[package]] 3085 | name = "windows_i686_gnu" 3086 | version = "0.48.5" 3087 | source = "registry+https://github.com/rust-lang/crates.io-index" 3088 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3089 | 3090 | [[package]] 3091 | name = "windows_i686_gnu" 3092 | version = "0.52.6" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3095 | 3096 | [[package]] 3097 | name = "windows_i686_gnullvm" 3098 | version = "0.52.6" 3099 | source = "registry+https://github.com/rust-lang/crates.io-index" 3100 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3101 | 3102 | [[package]] 3103 | name = "windows_i686_msvc" 3104 | version = "0.48.5" 3105 | source = "registry+https://github.com/rust-lang/crates.io-index" 3106 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3107 | 3108 | [[package]] 3109 | name = "windows_i686_msvc" 3110 | version = "0.52.6" 3111 | source = "registry+https://github.com/rust-lang/crates.io-index" 3112 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3113 | 3114 | [[package]] 3115 | name = "windows_x86_64_gnu" 3116 | version = "0.48.5" 3117 | source = "registry+https://github.com/rust-lang/crates.io-index" 3118 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3119 | 3120 | [[package]] 3121 | name = "windows_x86_64_gnu" 3122 | version = "0.52.6" 3123 | source = "registry+https://github.com/rust-lang/crates.io-index" 3124 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3125 | 3126 | [[package]] 3127 | name = "windows_x86_64_gnullvm" 3128 | version = "0.48.5" 3129 | source = "registry+https://github.com/rust-lang/crates.io-index" 3130 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3131 | 3132 | [[package]] 3133 | name = "windows_x86_64_gnullvm" 3134 | version = "0.52.6" 3135 | source = "registry+https://github.com/rust-lang/crates.io-index" 3136 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3137 | 3138 | [[package]] 3139 | name = "windows_x86_64_msvc" 3140 | version = "0.48.5" 3141 | source = "registry+https://github.com/rust-lang/crates.io-index" 3142 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3143 | 3144 | [[package]] 3145 | name = "windows_x86_64_msvc" 3146 | version = "0.52.6" 3147 | source = "registry+https://github.com/rust-lang/crates.io-index" 3148 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3149 | 3150 | [[package]] 3151 | name = "winnow" 3152 | version = "0.7.4" 3153 | source = "registry+https://github.com/rust-lang/crates.io-index" 3154 | checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" 3155 | dependencies = [ 3156 | "memchr", 3157 | ] 3158 | 3159 | [[package]] 3160 | name = "winreg" 3161 | version = "0.50.0" 3162 | source = "registry+https://github.com/rust-lang/crates.io-index" 3163 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 3164 | dependencies = [ 3165 | "cfg-if", 3166 | "windows-sys 0.48.0", 3167 | ] 3168 | 3169 | [[package]] 3170 | name = "wit-bindgen-rt" 3171 | version = "0.39.0" 3172 | source = "registry+https://github.com/rust-lang/crates.io-index" 3173 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 3174 | dependencies = [ 3175 | "bitflags 2.9.0", 3176 | ] 3177 | 3178 | [[package]] 3179 | name = "write16" 3180 | version = "1.0.0" 3181 | source = "registry+https://github.com/rust-lang/crates.io-index" 3182 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 3183 | 3184 | [[package]] 3185 | name = "writeable" 3186 | version = "0.5.5" 3187 | source = "registry+https://github.com/rust-lang/crates.io-index" 3188 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 3189 | 3190 | [[package]] 3191 | name = "yoke" 3192 | version = "0.7.5" 3193 | source = "registry+https://github.com/rust-lang/crates.io-index" 3194 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 3195 | dependencies = [ 3196 | "serde", 3197 | "stable_deref_trait", 3198 | "yoke-derive", 3199 | "zerofrom", 3200 | ] 3201 | 3202 | [[package]] 3203 | name = "yoke-derive" 3204 | version = "0.7.5" 3205 | source = "registry+https://github.com/rust-lang/crates.io-index" 3206 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 3207 | dependencies = [ 3208 | "proc-macro2", 3209 | "quote", 3210 | "syn", 3211 | "synstructure", 3212 | ] 3213 | 3214 | [[package]] 3215 | name = "zerocopy" 3216 | version = "0.8.24" 3217 | source = "registry+https://github.com/rust-lang/crates.io-index" 3218 | checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" 3219 | dependencies = [ 3220 | "zerocopy-derive", 3221 | ] 3222 | 3223 | [[package]] 3224 | name = "zerocopy-derive" 3225 | version = "0.8.24" 3226 | source = "registry+https://github.com/rust-lang/crates.io-index" 3227 | checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" 3228 | dependencies = [ 3229 | "proc-macro2", 3230 | "quote", 3231 | "syn", 3232 | ] 3233 | 3234 | [[package]] 3235 | name = "zerofrom" 3236 | version = "0.1.6" 3237 | source = "registry+https://github.com/rust-lang/crates.io-index" 3238 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3239 | dependencies = [ 3240 | "zerofrom-derive", 3241 | ] 3242 | 3243 | [[package]] 3244 | name = "zerofrom-derive" 3245 | version = "0.1.6" 3246 | source = "registry+https://github.com/rust-lang/crates.io-index" 3247 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3248 | dependencies = [ 3249 | "proc-macro2", 3250 | "quote", 3251 | "syn", 3252 | "synstructure", 3253 | ] 3254 | 3255 | [[package]] 3256 | name = "zerovec" 3257 | version = "0.10.4" 3258 | source = "registry+https://github.com/rust-lang/crates.io-index" 3259 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 3260 | dependencies = [ 3261 | "yoke", 3262 | "zerofrom", 3263 | "zerovec-derive", 3264 | ] 3265 | 3266 | [[package]] 3267 | name = "zerovec-derive" 3268 | version = "0.10.3" 3269 | source = "registry+https://github.com/rust-lang/crates.io-index" 3270 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 3271 | dependencies = [ 3272 | "proc-macro2", 3273 | "quote", 3274 | "syn", 3275 | ] 3276 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-axum-async-graphql-postgres-redis-starter" 3 | version = "0.1.0" 4 | edition = "2024" 5 | 6 | [dependencies] 7 | anyhow = "1.0.97" 8 | async-graphql = { version = "7.0.15", features = [ 9 | "apollo_tracing", 10 | "dataloader", 11 | ] } 12 | async-graphql-axum = "7.0.15" 13 | axum = { version = "0.8.1", features = ["ws"] } 14 | axum-extra = { version = "0.10.0" } 15 | bb8 = "0.9.0" 16 | bb8-postgres = "0.9.0" 17 | bb8-redis = "0.21.0" 18 | dotenvy = "0.15.7" 19 | firebase-auth = { version = "0.5.0", default-features = false, features = [ 20 | "axum", 21 | ] } 22 | itertools = "0.14.0" 23 | rayon = "1.10.0" 24 | redis = { version = "0.29.1", features = ["aio"] } 25 | serde = "1.0.219" 26 | serde_json = "1.0.140" 27 | serde_with = "3.12.0" 28 | serde_with_macros = "3.12.0" 29 | simd-json = { version = "0.15.0" } 30 | thiserror = "2.0.12" 31 | tikv-jemallocator = "0.6.0" 32 | tokio = { version = "1.44.1", features = ["macros", "rt-multi-thread"] } 33 | tokio-postgres = "0.7.13" 34 | tokio-stream = "0.1.17" 35 | tower = "0.5.2" 36 | tower-http = { version = "0.6.2", features = [ 37 | "compression-gzip", 38 | "cors", 39 | "trace", 40 | ] } 41 | tracing = "0.1.41" 42 | tracing-subscriber = "0.3.19" 43 | 44 | [profile.release] 45 | debug = false 46 | codegen-units = 1 47 | lto = true 48 | 49 | [lib] 50 | name = "rust_axum_async_graphql_postgres_redis_starter" 51 | crate-type = ["lib"] 52 | path = "src/lib.rs" 53 | doctest = false 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Eric Buehler 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rust-axum-async-graphql-postgres-redis-starter 2 | 3 | A modern Rust backend starter template using: 4 | 5 | - **Axum** for HTTP/WebSocket server 6 | - **Async-GraphQL** for GraphQL APIs 7 | - **PostgreSQL** via `tokio-postgres` and `bb8` async connection pool 8 | - **Redis** via `bb8-redis` async connection pool 9 | - **Firebase Auth** integration 10 | - **WebSocket** support 11 | - **Jemalloc** for improved memory performance 12 | 13 | ## Requirements 14 | 15 | - Rust 1.85+ (2024 edition) 16 | - PostgreSQL server 17 | - Redis server 18 | 19 | ## Getting Started 20 | 21 | ### 1. Clone the repo 22 | 23 | ```bash 24 | git clone https://github.com/rust-dd/rust-axum-async-graphql-postgres-redis-starter.git 25 | cd rust-axum-async-graphql-postgres-redis-starter 26 | ``` 27 | 28 | ### 2. Setup environment 29 | 30 | Create a `.env` file in the project root: 31 | 32 | ``` 33 | POSTGRES_HOST=localhost 34 | POSTGRES_PORT=5432 35 | POSTGRES_USER=postgres 36 | POSTGRES_PASSWORD=password 37 | POSTGRES_DB=postgres 38 | 39 | REDIS_HOST=redis://localhost:6379 40 | 41 | FIREBASE_PROJECT_ID=firebase_project 42 | ADMIN_SECRET=admin1234 43 | ``` 44 | 45 | ### 3. Run the project 46 | 47 | ```bash 48 | cargo run 49 | ``` 50 | 51 | ### 4. Access the GraphQL Playground 52 | 53 | Once running, open: [http://localhost:8000/graphql](http://localhost:8000/v1/graphql) 54 | 55 | ## Performance 56 | 57 | This project uses `jemallocator` as the global allocator for improved memory allocation performance in high-throughput environments and simd-json for fast JSON operations. 58 | 59 | ```rust 60 | #[global_allocator] 61 | static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; 62 | ``` 63 | 64 | ## License 65 | 66 | MIT 67 | -------------------------------------------------------------------------------- /src/dataloaders.rs: -------------------------------------------------------------------------------- 1 | pub mod users; 2 | -------------------------------------------------------------------------------- /src/dataloaders/users.rs: -------------------------------------------------------------------------------- 1 | use crate::types::users::User; 2 | use crate::{postgres::PgPool, redis::RedisPool}; 3 | use async_graphql::dataloader::Loader; 4 | 5 | use std::{collections::HashMap, sync::Arc}; 6 | 7 | pub struct DataLoader { 8 | pool: PgPool, 9 | cache: RedisPool, 10 | } 11 | 12 | impl DataLoader { 13 | pub fn new(pool: PgPool, cache: RedisPool) -> Self { 14 | Self { pool, cache } 15 | } 16 | } 17 | 18 | impl Loader for DataLoader { 19 | type Value = User; 20 | type Error = Arc; 21 | 22 | async fn load(&self, _keys: &[String]) -> Result, Self::Error> { 23 | let users = HashMap::::default(); 24 | Ok(users) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/graphql.rs: -------------------------------------------------------------------------------- 1 | use async_graphql::{ 2 | Data, MergedObject, MergedSubscription, Response, 3 | http::{ALL_WEBSOCKET_PROTOCOLS, GraphiQLSource}, 4 | }; 5 | use async_graphql_axum::{GraphQLProtocol, GraphQLRequest, GraphQLResponse, GraphQLWebSocket}; 6 | use axum::{ 7 | extract::{State, WebSocketUpgrade}, 8 | http::{HeaderMap, header::AUTHORIZATION}, 9 | response::{Html, IntoResponse, Response as AxumResponse}, 10 | }; 11 | use firebase_auth::FirebaseUser; 12 | use serde::Deserialize; 13 | use std::env; 14 | 15 | use crate::AppState; 16 | 17 | mod users_mutation; 18 | mod users_query; 19 | mod users_subscription; 20 | 21 | #[derive(MergedObject, Default)] 22 | pub struct QueryRoot(users_query::UsersQueryRoot); 23 | 24 | #[derive(MergedObject, Default)] 25 | pub struct MutationRoot(users_mutation::UsersMutationRoot); 26 | 27 | #[derive(MergedSubscription, Default)] 28 | pub struct SubscriptionRoot(users_subscription::UsersSubscriptionRoot); 29 | 30 | pub async fn playground() -> impl IntoResponse { 31 | let mut playground = GraphiQLSource::build() 32 | .endpoint("/v1/graphql") 33 | .subscription_endpoint("/v1/ws"); 34 | 35 | if cfg!(debug_assertions) { 36 | if let Ok(secret) = env::var("ADMIN_SECRET") { 37 | let leaked = Box::leak(secret.into_boxed_str()); 38 | 39 | playground = playground 40 | .header("x-project-admin-secret", leaked) 41 | .ws_connection_param("x-project-admin-secret", leaked); 42 | } 43 | } 44 | 45 | Html(playground.finish()) 46 | } 47 | 48 | pub async fn handler( 49 | State(AppState { 50 | auth: auth_state, 51 | schema, 52 | .. 53 | }): State, 54 | headers: HeaderMap, 55 | req: GraphQLRequest, 56 | ) -> GraphQLResponse { 57 | let auth = headers.get(AUTHORIZATION); 58 | let admin_secret = env::var("ADMIN_SECRET").ok(); 59 | let project_admin_secret = headers 60 | .get("x-project-admin-secret") 61 | .and_then(|v| v.to_str().ok()); 62 | 63 | if let Some(admin_secret) = admin_secret { 64 | if let Some(project_admin_secret) = project_admin_secret { 65 | if project_admin_secret == admin_secret { 66 | return schema.execute(req.into_inner()).await.into(); 67 | } 68 | } 69 | } 70 | 71 | match auth { 72 | Some(auth) => { 73 | let auth_header = auth.to_str().unwrap(); 74 | if auth_header.is_empty() { 75 | return GraphQLResponse::from(Response::new("Token is empty")); 76 | } 77 | 78 | let prefix_len = "Bearer ".len(); 79 | if auth_header.len() <= prefix_len { 80 | return GraphQLResponse::from(Response::new("Token is empty")); 81 | } 82 | 83 | let token = auth_header[prefix_len..].to_string(); 84 | match auth_state.firebase_auth.verify::(&token) { 85 | Ok(_) => schema.execute(req.into_inner()).await.into(), 86 | Err(_) => return GraphQLResponse::from(Response::new("Invalid token")), 87 | } 88 | } 89 | None => { 90 | return GraphQLResponse::from(Response::new("No Authorization header")); 91 | } 92 | } 93 | } 94 | 95 | #[derive(Deserialize, Debug)] 96 | struct WebSocketAuthPayload { 97 | authorization: Option, 98 | #[serde(rename = "x-project-admin-secret")] 99 | x_project_admin_secret: Option, 100 | } 101 | 102 | pub async fn ws_handler( 103 | State(AppState { auth, schema, .. }): State, 104 | protocol: GraphQLProtocol, 105 | websocket: WebSocketUpgrade, 106 | ) -> AxumResponse { 107 | websocket 108 | .protocols(ALL_WEBSOCKET_PROTOCOLS) 109 | .on_upgrade(move |stream| { 110 | GraphQLWebSocket::new(stream, schema.clone(), protocol) 111 | .on_connection_init(move |value| { 112 | let auth = auth.clone(); 113 | async move { 114 | if let Ok(WebSocketAuthPayload { 115 | authorization, 116 | x_project_admin_secret, 117 | }) = simd_json::serde::from_borrowed_value::( 118 | value.try_into().unwrap(), 119 | ) { 120 | if let Some(x_project_admin_secret) = x_project_admin_secret { 121 | if x_project_admin_secret == env::var("ADMIN_SECRET").ok().unwrap() 122 | { 123 | tracing::info!("Admin connected"); 124 | return Ok(Data::default()); 125 | } 126 | } 127 | 128 | if authorization.is_none() { 129 | tracing::error!("Token is required"); 130 | return Err("Token is required".into()); 131 | } 132 | 133 | let authorization = authorization.unwrap(); 134 | let authorization = authorization[7..].as_ref(); 135 | 136 | if auth 137 | .firebase_auth 138 | .verify::(authorization) 139 | .is_ok() 140 | { 141 | tracing::info!("User connected"); 142 | Ok(Data::default()) 143 | } else { 144 | tracing::error!("Invalid token"); 145 | Err("Invalid token".into()) 146 | } 147 | } else { 148 | tracing::error!("Token is required"); 149 | Err("Token is required".into()) 150 | } 151 | } 152 | }) 153 | .serve() 154 | }) 155 | } 156 | -------------------------------------------------------------------------------- /src/graphql/users_mutation.rs: -------------------------------------------------------------------------------- 1 | use async_graphql::{FieldResult, Object}; 2 | 3 | use crate::types::users::User; 4 | 5 | #[derive(Default, Debug, Clone, Copy)] 6 | pub struct UsersMutationRoot; 7 | 8 | #[Object(rename_fields = "snake_case", rename_args = "snake_case")] 9 | impl UsersMutationRoot { 10 | async fn update_user(&self, user_id: i64, email: String) -> FieldResult { 11 | Ok(User { id: user_id, email }) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/graphql/users_query.rs: -------------------------------------------------------------------------------- 1 | use async_graphql::{Context, FieldResult, Object}; 2 | 3 | use crate::types::users::User; 4 | 5 | #[derive(Default)] 6 | pub struct UsersQueryRoot; 7 | 8 | #[Object(rename_fields = "snake_case", rename_args = "snake_case")] 9 | impl UsersQueryRoot { 10 | async fn select_users( 11 | &self, 12 | _context: &Context<'_>, 13 | _limit: Option, 14 | _offset: Option, 15 | ) -> FieldResult> { 16 | Ok(vec![User { 17 | id: 0, 18 | email: String::from("user@example.com"), 19 | }]) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/graphql/users_subscription.rs: -------------------------------------------------------------------------------- 1 | use crate::types::users::User; 2 | use async_graphql::{Context, FieldResult, Subscription}; 3 | 4 | use std::{pin::Pin, time::Duration}; 5 | use tokio::{sync::mpsc, time::interval}; 6 | use tokio_stream::{Stream, wrappers::ReceiverStream}; 7 | 8 | #[derive(Default)] 9 | pub struct UsersSubscriptionRoot; 10 | 11 | #[Subscription(rename_fields = "snake_case", rename_args = "snake_case")] 12 | impl UsersSubscriptionRoot { 13 | async fn select_user_by_id<'a>( 14 | &self, 15 | _context: &Context<'a>, 16 | _id: i64, 17 | ) -> Pin> + Send + '_>> { 18 | let (tx, rx) = mpsc::channel::>(20); 19 | 20 | tokio::spawn(async move { 21 | let mut interval = interval(Duration::from_secs(1)); 22 | 23 | loop { 24 | interval.tick().await; 25 | let _ = tx 26 | .send(Ok(User { 27 | id: 0, 28 | email: String::from("user@example.com"), 29 | })) 30 | .await; 31 | } 32 | }); 33 | 34 | Box::pin(ReceiverStream::new(rx)) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use async_graphql::Schema; 2 | use firebase_auth::FirebaseAuthState; 3 | use graphql::{MutationRoot, QueryRoot, SubscriptionRoot}; 4 | 5 | pub const DEFAULT_CACHE_EXPIRATION: u64 = 60 * 60; 6 | 7 | #[global_allocator] 8 | static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; 9 | 10 | pub mod dataloaders; 11 | pub mod graphql; 12 | pub mod postgres; 13 | pub mod redis; 14 | pub mod types; 15 | 16 | #[derive(Clone)] 17 | pub struct AppState { 18 | pub auth: FirebaseAuthState, 19 | pub schema: Schema, 20 | } 21 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use async_graphql::{Schema, dataloader::DataLoader}; 3 | use axum::{Router, http::Method, routing::get}; 4 | use dotenvy::dotenv; 5 | use firebase_auth::{FirebaseAuth, FirebaseAuthState}; 6 | use rust_axum_async_graphql_postgres_redis_starter::{ 7 | AppState, 8 | dataloaders::users, 9 | graphql::{self, MutationRoot, QueryRoot, SubscriptionRoot}, 10 | postgres, redis, 11 | }; 12 | use std::env; 13 | use tokio::net::TcpListener; 14 | use tower_http::{ 15 | compression::CompressionLayer, 16 | cors::{AllowOrigin, CorsLayer}, 17 | trace::TraceLayer, 18 | }; 19 | use tracing::Level; 20 | 21 | #[cfg(debug_assertions)] 22 | use async_graphql::extensions::ApolloTracing; 23 | 24 | #[tokio::main] 25 | async fn main() -> Result<()> { 26 | dotenv()?; 27 | 28 | tracing_subscriber::fmt() 29 | .with_file(true) 30 | .with_line_number(true) 31 | .with_max_level(Level::INFO) 32 | .init(); 33 | 34 | let postgres = postgres::pgpool().await?; 35 | let redis = redis::redis_pool().await?; 36 | let firebase_auth = FirebaseAuth::new(&env::var("FIREBASE_PROJECT_ID")?).await; 37 | let schema = Schema::build( 38 | QueryRoot::default(), 39 | MutationRoot::default(), 40 | SubscriptionRoot::default(), 41 | ); 42 | #[cfg(debug_assertions)] 43 | let schema = schema.extension(ApolloTracing); 44 | let schema = schema 45 | .data(postgres.clone()) 46 | .data(redis.clone()) 47 | .data(DataLoader::new( 48 | users::DataLoader::new(postgres, redis), 49 | tokio::spawn, 50 | )) 51 | .finish(); 52 | 53 | let app = Router::new() 54 | .route( 55 | "/v1/graphql", 56 | get(graphql::playground).post(graphql::handler), 57 | ) 58 | .route("/v1/ws", get(graphql::ws_handler)) 59 | .with_state(AppState { 60 | auth: FirebaseAuthState::new(firebase_auth), 61 | schema, 62 | }) 63 | .layer(CompressionLayer::new().gzip(true)) 64 | .layer(TraceLayer::new_for_http()) 65 | .layer( 66 | CorsLayer::new() 67 | .allow_origin(AllowOrigin::predicate(|_, _| true)) 68 | .allow_methods([Method::GET, Method::POST]), 69 | ); 70 | 71 | let listener = TcpListener::bind("0.0.0.0:8080").await?; 72 | tracing::info!("listening on {}", listener.local_addr()?); 73 | tracing::info!("GrahpiQL: http://0.0.0.0:8080/v1/graphql"); 74 | axum::serve(listener, app).await?; 75 | 76 | Ok(()) 77 | } 78 | -------------------------------------------------------------------------------- /src/postgres.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Ok, Result}; 2 | use bb8::Pool as Bb8Pool; 3 | use bb8_postgres::PostgresConnectionManager; 4 | use std::env; 5 | use tokio_postgres::{Config, NoTls}; 6 | 7 | pub type PgPool = Bb8Pool>; 8 | 9 | pub async fn pgpool() -> Result { 10 | let mut config = Config::new(); 11 | config.host(env::var("POSTGRES_HOST")?); 12 | config.password(env::var("POSTGRES_PASSWORD")?); 13 | config.dbname(env::var("POSTGRES_DB")?); 14 | config.user(env::var("POSTGRES_USER")?); 15 | config.port(env::var("POSTGRES_PORT")?.parse()?); 16 | 17 | // TODO: add ssl configuration later 18 | let manager = PostgresConnectionManager::new(config, NoTls); 19 | let pool = PgPool::builder().max_size(50).build(manager).await?; 20 | Ok(pool) 21 | } 22 | -------------------------------------------------------------------------------- /src/redis.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | 3 | use anyhow::Result; 4 | use bb8::Pool as Bb8Pool; 5 | use bb8_redis::RedisConnectionManager; 6 | 7 | pub type RedisPool = Bb8Pool; 8 | 9 | pub async fn redis_pool() -> Result { 10 | let manager = RedisConnectionManager::new(env::var("REDIS_HOST")?)?; 11 | let pool = RedisPool::builder().build(manager).await?; 12 | Ok(pool) 13 | } 14 | -------------------------------------------------------------------------------- /src/types.rs: -------------------------------------------------------------------------------- 1 | pub mod users; 2 | -------------------------------------------------------------------------------- /src/types/users.rs: -------------------------------------------------------------------------------- 1 | use async_graphql::Object; 2 | use serde::{Deserialize, Serialize}; 3 | 4 | #[derive(Debug, Clone, Serialize, Deserialize)] 5 | #[serde(rename_all = "snake_case")] 6 | pub struct User { 7 | pub id: i64, 8 | pub email: String, 9 | } 10 | 11 | #[Object] 12 | impl User { 13 | async fn id(&self) -> i64 { 14 | self.id 15 | } 16 | 17 | async fn email(&self) -> &str { 18 | &self.email 19 | } 20 | } 21 | --------------------------------------------------------------------------------