+2434
Cargo.lock
+2434
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 = "addr2line"
7
+
version = "0.24.2"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10
+
dependencies = [
11
+
"gimli",
12
+
]
13
+
14
+
[[package]]
15
+
name = "adler2"
16
+
version = "2.0.0"
17
+
source = "registry+https://github.com/rust-lang/crates.io-index"
18
+
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
19
+
20
+
[[package]]
21
+
name = "ahash"
22
+
version = "0.8.11"
23
+
source = "registry+https://github.com/rust-lang/crates.io-index"
24
+
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
25
+
dependencies = [
26
+
"cfg-if",
27
+
"once_cell",
28
+
"version_check",
29
+
"zerocopy 0.7.35",
30
+
]
31
+
32
+
[[package]]
33
+
name = "allocator-api2"
34
+
version = "0.2.21"
35
+
source = "registry+https://github.com/rust-lang/crates.io-index"
36
+
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
37
+
38
+
[[package]]
39
+
name = "askama"
40
+
version = "0.13.1"
41
+
source = "registry+https://github.com/rust-lang/crates.io-index"
42
+
checksum = "5d4744ed2eef2645831b441d8f5459689ade2ab27c854488fbab1fbe94fce1a7"
43
+
dependencies = [
44
+
"askama_derive",
45
+
"itoa",
46
+
"percent-encoding",
47
+
"serde",
48
+
"serde_json",
49
+
]
50
+
51
+
[[package]]
52
+
name = "askama_derive"
53
+
version = "0.13.1"
54
+
source = "registry+https://github.com/rust-lang/crates.io-index"
55
+
checksum = "d661e0f57be36a5c14c48f78d09011e67e0cb618f269cca9f2fd8d15b68c46ac"
56
+
dependencies = [
57
+
"askama_parser",
58
+
"basic-toml",
59
+
"memchr",
60
+
"proc-macro2",
61
+
"quote",
62
+
"rustc-hash",
63
+
"serde",
64
+
"serde_derive",
65
+
"syn",
66
+
]
67
+
68
+
[[package]]
69
+
name = "askama_parser"
70
+
version = "0.13.0"
71
+
source = "registry+https://github.com/rust-lang/crates.io-index"
72
+
checksum = "cf315ce6524c857bb129ff794935cf6d42c82a6cff60526fe2a63593de4d0d4f"
73
+
dependencies = [
74
+
"memchr",
75
+
"serde",
76
+
"serde_derive",
77
+
"winnow",
78
+
]
79
+
80
+
[[package]]
81
+
name = "async-trait"
82
+
version = "0.1.88"
83
+
source = "registry+https://github.com/rust-lang/crates.io-index"
84
+
checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
85
+
dependencies = [
86
+
"proc-macro2",
87
+
"quote",
88
+
"syn",
89
+
]
90
+
91
+
[[package]]
92
+
name = "atoi"
93
+
version = "2.0.0"
94
+
source = "registry+https://github.com/rust-lang/crates.io-index"
95
+
checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
96
+
dependencies = [
97
+
"num-traits",
98
+
]
99
+
100
+
[[package]]
101
+
name = "autocfg"
102
+
version = "1.4.0"
103
+
source = "registry+https://github.com/rust-lang/crates.io-index"
104
+
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
105
+
106
+
[[package]]
107
+
name = "axum"
108
+
version = "0.8.3"
109
+
source = "registry+https://github.com/rust-lang/crates.io-index"
110
+
checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288"
111
+
dependencies = [
112
+
"axum-core",
113
+
"bytes",
114
+
"form_urlencoded",
115
+
"futures-util",
116
+
"http",
117
+
"http-body",
118
+
"http-body-util",
119
+
"hyper",
120
+
"hyper-util",
121
+
"itoa",
122
+
"matchit",
123
+
"memchr",
124
+
"mime",
125
+
"percent-encoding",
126
+
"pin-project-lite",
127
+
"rustversion",
128
+
"serde",
129
+
"serde_json",
130
+
"serde_path_to_error",
131
+
"serde_urlencoded",
132
+
"sync_wrapper",
133
+
"tokio",
134
+
"tower",
135
+
"tower-layer",
136
+
"tower-service",
137
+
"tracing",
138
+
]
139
+
140
+
[[package]]
141
+
name = "axum-core"
142
+
version = "0.5.2"
143
+
source = "registry+https://github.com/rust-lang/crates.io-index"
144
+
checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
145
+
dependencies = [
146
+
"bytes",
147
+
"futures-core",
148
+
"http",
149
+
"http-body",
150
+
"http-body-util",
151
+
"mime",
152
+
"pin-project-lite",
153
+
"rustversion",
154
+
"sync_wrapper",
155
+
"tower-layer",
156
+
"tower-service",
157
+
"tracing",
158
+
]
159
+
160
+
[[package]]
161
+
name = "backtrace"
162
+
version = "0.3.74"
163
+
source = "registry+https://github.com/rust-lang/crates.io-index"
164
+
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
165
+
dependencies = [
166
+
"addr2line",
167
+
"cfg-if",
168
+
"libc",
169
+
"miniz_oxide",
170
+
"object",
171
+
"rustc-demangle",
172
+
"windows-targets 0.52.6",
173
+
]
174
+
175
+
[[package]]
176
+
name = "base64"
177
+
version = "0.22.1"
178
+
source = "registry+https://github.com/rust-lang/crates.io-index"
179
+
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
180
+
181
+
[[package]]
182
+
name = "base64ct"
183
+
version = "1.7.3"
184
+
source = "registry+https://github.com/rust-lang/crates.io-index"
185
+
checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
186
+
187
+
[[package]]
188
+
name = "basic-toml"
189
+
version = "0.1.10"
190
+
source = "registry+https://github.com/rust-lang/crates.io-index"
191
+
checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a"
192
+
dependencies = [
193
+
"serde",
194
+
]
195
+
196
+
[[package]]
197
+
name = "bitflags"
198
+
version = "2.9.0"
199
+
source = "registry+https://github.com/rust-lang/crates.io-index"
200
+
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
201
+
dependencies = [
202
+
"serde",
203
+
]
204
+
205
+
[[package]]
206
+
name = "block-buffer"
207
+
version = "0.10.4"
208
+
source = "registry+https://github.com/rust-lang/crates.io-index"
209
+
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
210
+
dependencies = [
211
+
"generic-array",
212
+
]
213
+
214
+
[[package]]
215
+
name = "byteorder"
216
+
version = "1.5.0"
217
+
source = "registry+https://github.com/rust-lang/crates.io-index"
218
+
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
219
+
220
+
[[package]]
221
+
name = "bytes"
222
+
version = "1.10.1"
223
+
source = "registry+https://github.com/rust-lang/crates.io-index"
224
+
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
225
+
226
+
[[package]]
227
+
name = "cc"
228
+
version = "1.2.19"
229
+
source = "registry+https://github.com/rust-lang/crates.io-index"
230
+
checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362"
231
+
dependencies = [
232
+
"shlex",
233
+
]
234
+
235
+
[[package]]
236
+
name = "cfg-if"
237
+
version = "1.0.0"
238
+
source = "registry+https://github.com/rust-lang/crates.io-index"
239
+
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
240
+
241
+
[[package]]
242
+
name = "chumsky"
243
+
version = "0.9.3"
244
+
source = "registry+https://github.com/rust-lang/crates.io-index"
245
+
checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9"
246
+
dependencies = [
247
+
"hashbrown 0.14.5",
248
+
"stacker",
249
+
]
250
+
251
+
[[package]]
252
+
name = "concurrent-queue"
253
+
version = "2.5.0"
254
+
source = "registry+https://github.com/rust-lang/crates.io-index"
255
+
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
256
+
dependencies = [
257
+
"crossbeam-utils",
258
+
]
259
+
260
+
[[package]]
261
+
name = "const-oid"
262
+
version = "0.9.6"
263
+
source = "registry+https://github.com/rust-lang/crates.io-index"
264
+
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
265
+
266
+
[[package]]
267
+
name = "core-foundation"
268
+
version = "0.9.4"
269
+
source = "registry+https://github.com/rust-lang/crates.io-index"
270
+
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
271
+
dependencies = [
272
+
"core-foundation-sys",
273
+
"libc",
274
+
]
275
+
276
+
[[package]]
277
+
name = "core-foundation-sys"
278
+
version = "0.8.7"
279
+
source = "registry+https://github.com/rust-lang/crates.io-index"
280
+
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
281
+
282
+
[[package]]
283
+
name = "cpufeatures"
284
+
version = "0.2.17"
285
+
source = "registry+https://github.com/rust-lang/crates.io-index"
286
+
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
287
+
dependencies = [
288
+
"libc",
289
+
]
290
+
291
+
[[package]]
292
+
name = "crc"
293
+
version = "3.2.1"
294
+
source = "registry+https://github.com/rust-lang/crates.io-index"
295
+
checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
296
+
dependencies = [
297
+
"crc-catalog",
298
+
]
299
+
300
+
[[package]]
301
+
name = "crc-catalog"
302
+
version = "2.4.0"
303
+
source = "registry+https://github.com/rust-lang/crates.io-index"
304
+
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
305
+
306
+
[[package]]
307
+
name = "crossbeam-queue"
308
+
version = "0.3.12"
309
+
source = "registry+https://github.com/rust-lang/crates.io-index"
310
+
checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
311
+
dependencies = [
312
+
"crossbeam-utils",
313
+
]
314
+
315
+
[[package]]
316
+
name = "crossbeam-utils"
317
+
version = "0.8.21"
318
+
source = "registry+https://github.com/rust-lang/crates.io-index"
319
+
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
320
+
321
+
[[package]]
322
+
name = "crypto-common"
323
+
version = "0.1.6"
324
+
source = "registry+https://github.com/rust-lang/crates.io-index"
325
+
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
326
+
dependencies = [
327
+
"generic-array",
328
+
"typenum",
329
+
]
330
+
331
+
[[package]]
332
+
name = "der"
333
+
version = "0.7.10"
334
+
source = "registry+https://github.com/rust-lang/crates.io-index"
335
+
checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
336
+
dependencies = [
337
+
"const-oid",
338
+
"pem-rfc7468",
339
+
"zeroize",
340
+
]
341
+
342
+
[[package]]
343
+
name = "digest"
344
+
version = "0.10.7"
345
+
source = "registry+https://github.com/rust-lang/crates.io-index"
346
+
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
347
+
dependencies = [
348
+
"block-buffer",
349
+
"const-oid",
350
+
"crypto-common",
351
+
"subtle",
352
+
]
353
+
354
+
[[package]]
355
+
name = "displaydoc"
356
+
version = "0.2.5"
357
+
source = "registry+https://github.com/rust-lang/crates.io-index"
358
+
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
359
+
dependencies = [
360
+
"proc-macro2",
361
+
"quote",
362
+
"syn",
363
+
]
364
+
365
+
[[package]]
366
+
name = "dotenvy"
367
+
version = "0.15.7"
368
+
source = "registry+https://github.com/rust-lang/crates.io-index"
369
+
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
370
+
371
+
[[package]]
372
+
name = "either"
373
+
version = "1.15.0"
374
+
source = "registry+https://github.com/rust-lang/crates.io-index"
375
+
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
376
+
dependencies = [
377
+
"serde",
378
+
]
379
+
380
+
[[package]]
381
+
name = "email-encoding"
382
+
version = "0.4.1"
383
+
source = "registry+https://github.com/rust-lang/crates.io-index"
384
+
checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6"
385
+
dependencies = [
386
+
"base64",
387
+
"memchr",
388
+
]
389
+
390
+
[[package]]
391
+
name = "email_address"
392
+
version = "0.2.9"
393
+
source = "registry+https://github.com/rust-lang/crates.io-index"
394
+
checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
395
+
396
+
[[package]]
397
+
name = "equivalent"
398
+
version = "1.0.2"
399
+
source = "registry+https://github.com/rust-lang/crates.io-index"
400
+
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
401
+
402
+
[[package]]
403
+
name = "errno"
404
+
version = "0.3.11"
405
+
source = "registry+https://github.com/rust-lang/crates.io-index"
406
+
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
407
+
dependencies = [
408
+
"libc",
409
+
"windows-sys 0.59.0",
410
+
]
411
+
412
+
[[package]]
413
+
name = "etcetera"
414
+
version = "0.8.0"
415
+
source = "registry+https://github.com/rust-lang/crates.io-index"
416
+
checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
417
+
dependencies = [
418
+
"cfg-if",
419
+
"home",
420
+
"windows-sys 0.48.0",
421
+
]
422
+
423
+
[[package]]
424
+
name = "event-listener"
425
+
version = "5.4.0"
426
+
source = "registry+https://github.com/rust-lang/crates.io-index"
427
+
checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae"
428
+
dependencies = [
429
+
"concurrent-queue",
430
+
"parking",
431
+
"pin-project-lite",
432
+
]
433
+
434
+
[[package]]
435
+
name = "fastrand"
436
+
version = "2.3.0"
437
+
source = "registry+https://github.com/rust-lang/crates.io-index"
438
+
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
439
+
440
+
[[package]]
441
+
name = "flume"
442
+
version = "0.11.1"
443
+
source = "registry+https://github.com/rust-lang/crates.io-index"
444
+
checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
445
+
dependencies = [
446
+
"futures-core",
447
+
"futures-sink",
448
+
"spin",
449
+
]
450
+
451
+
[[package]]
452
+
name = "fnv"
453
+
version = "1.0.7"
454
+
source = "registry+https://github.com/rust-lang/crates.io-index"
455
+
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
456
+
457
+
[[package]]
458
+
name = "foldhash"
459
+
version = "0.1.5"
460
+
source = "registry+https://github.com/rust-lang/crates.io-index"
461
+
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
462
+
463
+
[[package]]
464
+
name = "foreign-types"
465
+
version = "0.3.2"
466
+
source = "registry+https://github.com/rust-lang/crates.io-index"
467
+
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
468
+
dependencies = [
469
+
"foreign-types-shared",
470
+
]
471
+
472
+
[[package]]
473
+
name = "foreign-types-shared"
474
+
version = "0.1.1"
475
+
source = "registry+https://github.com/rust-lang/crates.io-index"
476
+
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
477
+
478
+
[[package]]
479
+
name = "form_urlencoded"
480
+
version = "1.2.1"
481
+
source = "registry+https://github.com/rust-lang/crates.io-index"
482
+
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
483
+
dependencies = [
484
+
"percent-encoding",
485
+
]
486
+
487
+
[[package]]
488
+
name = "futures-channel"
489
+
version = "0.3.31"
490
+
source = "registry+https://github.com/rust-lang/crates.io-index"
491
+
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
492
+
dependencies = [
493
+
"futures-core",
494
+
"futures-sink",
495
+
]
496
+
497
+
[[package]]
498
+
name = "futures-core"
499
+
version = "0.3.31"
500
+
source = "registry+https://github.com/rust-lang/crates.io-index"
501
+
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
502
+
503
+
[[package]]
504
+
name = "futures-executor"
505
+
version = "0.3.31"
506
+
source = "registry+https://github.com/rust-lang/crates.io-index"
507
+
checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
508
+
dependencies = [
509
+
"futures-core",
510
+
"futures-task",
511
+
"futures-util",
512
+
]
513
+
514
+
[[package]]
515
+
name = "futures-intrusive"
516
+
version = "0.5.0"
517
+
source = "registry+https://github.com/rust-lang/crates.io-index"
518
+
checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
519
+
dependencies = [
520
+
"futures-core",
521
+
"lock_api",
522
+
"parking_lot",
523
+
]
524
+
525
+
[[package]]
526
+
name = "futures-io"
527
+
version = "0.3.31"
528
+
source = "registry+https://github.com/rust-lang/crates.io-index"
529
+
checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
530
+
531
+
[[package]]
532
+
name = "futures-sink"
533
+
version = "0.3.31"
534
+
source = "registry+https://github.com/rust-lang/crates.io-index"
535
+
checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
536
+
537
+
[[package]]
538
+
name = "futures-task"
539
+
version = "0.3.31"
540
+
source = "registry+https://github.com/rust-lang/crates.io-index"
541
+
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
542
+
543
+
[[package]]
544
+
name = "futures-util"
545
+
version = "0.3.31"
546
+
source = "registry+https://github.com/rust-lang/crates.io-index"
547
+
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
548
+
dependencies = [
549
+
"futures-core",
550
+
"futures-io",
551
+
"futures-sink",
552
+
"futures-task",
553
+
"memchr",
554
+
"pin-project-lite",
555
+
"pin-utils",
556
+
"slab",
557
+
]
558
+
559
+
[[package]]
560
+
name = "generic-array"
561
+
version = "0.14.7"
562
+
source = "registry+https://github.com/rust-lang/crates.io-index"
563
+
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
564
+
dependencies = [
565
+
"typenum",
566
+
"version_check",
567
+
]
568
+
569
+
[[package]]
570
+
name = "getrandom"
571
+
version = "0.2.15"
572
+
source = "registry+https://github.com/rust-lang/crates.io-index"
573
+
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
574
+
dependencies = [
575
+
"cfg-if",
576
+
"libc",
577
+
"wasi 0.11.0+wasi-snapshot-preview1",
578
+
]
579
+
580
+
[[package]]
581
+
name = "getrandom"
582
+
version = "0.3.2"
583
+
source = "registry+https://github.com/rust-lang/crates.io-index"
584
+
checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
585
+
dependencies = [
586
+
"cfg-if",
587
+
"libc",
588
+
"r-efi",
589
+
"wasi 0.14.2+wasi-0.2.4",
590
+
]
591
+
592
+
[[package]]
593
+
name = "gimli"
594
+
version = "0.31.1"
595
+
source = "registry+https://github.com/rust-lang/crates.io-index"
596
+
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
597
+
598
+
[[package]]
599
+
name = "hashbrown"
600
+
version = "0.14.5"
601
+
source = "registry+https://github.com/rust-lang/crates.io-index"
602
+
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
603
+
dependencies = [
604
+
"ahash",
605
+
"allocator-api2",
606
+
]
607
+
608
+
[[package]]
609
+
name = "hashbrown"
610
+
version = "0.15.2"
611
+
source = "registry+https://github.com/rust-lang/crates.io-index"
612
+
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
613
+
dependencies = [
614
+
"allocator-api2",
615
+
"equivalent",
616
+
"foldhash",
617
+
]
618
+
619
+
[[package]]
620
+
name = "hashlink"
621
+
version = "0.10.0"
622
+
source = "registry+https://github.com/rust-lang/crates.io-index"
623
+
checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
624
+
dependencies = [
625
+
"hashbrown 0.15.2",
626
+
]
627
+
628
+
[[package]]
629
+
name = "heck"
630
+
version = "0.5.0"
631
+
source = "registry+https://github.com/rust-lang/crates.io-index"
632
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
633
+
634
+
[[package]]
635
+
name = "hex"
636
+
version = "0.4.3"
637
+
source = "registry+https://github.com/rust-lang/crates.io-index"
638
+
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
639
+
640
+
[[package]]
641
+
name = "hkdf"
642
+
version = "0.12.4"
643
+
source = "registry+https://github.com/rust-lang/crates.io-index"
644
+
checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
645
+
dependencies = [
646
+
"hmac",
647
+
]
648
+
649
+
[[package]]
650
+
name = "hmac"
651
+
version = "0.12.1"
652
+
source = "registry+https://github.com/rust-lang/crates.io-index"
653
+
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
654
+
dependencies = [
655
+
"digest",
656
+
]
657
+
658
+
[[package]]
659
+
name = "home"
660
+
version = "0.5.11"
661
+
source = "registry+https://github.com/rust-lang/crates.io-index"
662
+
checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
663
+
dependencies = [
664
+
"windows-sys 0.59.0",
665
+
]
666
+
667
+
[[package]]
668
+
name = "hostname"
669
+
version = "0.4.1"
670
+
source = "registry+https://github.com/rust-lang/crates.io-index"
671
+
checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65"
672
+
dependencies = [
673
+
"cfg-if",
674
+
"libc",
675
+
"windows-link",
676
+
]
677
+
678
+
[[package]]
679
+
name = "http"
680
+
version = "1.3.1"
681
+
source = "registry+https://github.com/rust-lang/crates.io-index"
682
+
checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
683
+
dependencies = [
684
+
"bytes",
685
+
"fnv",
686
+
"itoa",
687
+
]
688
+
689
+
[[package]]
690
+
name = "http-body"
691
+
version = "1.0.1"
692
+
source = "registry+https://github.com/rust-lang/crates.io-index"
693
+
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
694
+
dependencies = [
695
+
"bytes",
696
+
"http",
697
+
]
698
+
699
+
[[package]]
700
+
name = "http-body-util"
701
+
version = "0.1.3"
702
+
source = "registry+https://github.com/rust-lang/crates.io-index"
703
+
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
704
+
dependencies = [
705
+
"bytes",
706
+
"futures-core",
707
+
"http",
708
+
"http-body",
709
+
"pin-project-lite",
710
+
]
711
+
712
+
[[package]]
713
+
name = "httparse"
714
+
version = "1.10.1"
715
+
source = "registry+https://github.com/rust-lang/crates.io-index"
716
+
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
717
+
718
+
[[package]]
719
+
name = "httpdate"
720
+
version = "1.0.3"
721
+
source = "registry+https://github.com/rust-lang/crates.io-index"
722
+
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
723
+
724
+
[[package]]
725
+
name = "hyper"
726
+
version = "1.6.0"
727
+
source = "registry+https://github.com/rust-lang/crates.io-index"
728
+
checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
729
+
dependencies = [
730
+
"bytes",
731
+
"futures-channel",
732
+
"futures-util",
733
+
"http",
734
+
"http-body",
735
+
"httparse",
736
+
"httpdate",
737
+
"itoa",
738
+
"pin-project-lite",
739
+
"smallvec",
740
+
"tokio",
741
+
]
742
+
743
+
[[package]]
744
+
name = "hyper-util"
745
+
version = "0.1.11"
746
+
source = "registry+https://github.com/rust-lang/crates.io-index"
747
+
checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
748
+
dependencies = [
749
+
"bytes",
750
+
"futures-util",
751
+
"http",
752
+
"http-body",
753
+
"hyper",
754
+
"pin-project-lite",
755
+
"tokio",
756
+
"tower-service",
757
+
]
758
+
759
+
[[package]]
760
+
name = "icu_collections"
761
+
version = "1.5.0"
762
+
source = "registry+https://github.com/rust-lang/crates.io-index"
763
+
checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
764
+
dependencies = [
765
+
"displaydoc",
766
+
"yoke",
767
+
"zerofrom",
768
+
"zerovec",
769
+
]
770
+
771
+
[[package]]
772
+
name = "icu_locid"
773
+
version = "1.5.0"
774
+
source = "registry+https://github.com/rust-lang/crates.io-index"
775
+
checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
776
+
dependencies = [
777
+
"displaydoc",
778
+
"litemap",
779
+
"tinystr",
780
+
"writeable",
781
+
"zerovec",
782
+
]
783
+
784
+
[[package]]
785
+
name = "icu_locid_transform"
786
+
version = "1.5.0"
787
+
source = "registry+https://github.com/rust-lang/crates.io-index"
788
+
checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
789
+
dependencies = [
790
+
"displaydoc",
791
+
"icu_locid",
792
+
"icu_locid_transform_data",
793
+
"icu_provider",
794
+
"tinystr",
795
+
"zerovec",
796
+
]
797
+
798
+
[[package]]
799
+
name = "icu_locid_transform_data"
800
+
version = "1.5.1"
801
+
source = "registry+https://github.com/rust-lang/crates.io-index"
802
+
checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
803
+
804
+
[[package]]
805
+
name = "icu_normalizer"
806
+
version = "1.5.0"
807
+
source = "registry+https://github.com/rust-lang/crates.io-index"
808
+
checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
809
+
dependencies = [
810
+
"displaydoc",
811
+
"icu_collections",
812
+
"icu_normalizer_data",
813
+
"icu_properties",
814
+
"icu_provider",
815
+
"smallvec",
816
+
"utf16_iter",
817
+
"utf8_iter",
818
+
"write16",
819
+
"zerovec",
820
+
]
821
+
822
+
[[package]]
823
+
name = "icu_normalizer_data"
824
+
version = "1.5.1"
825
+
source = "registry+https://github.com/rust-lang/crates.io-index"
826
+
checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
827
+
828
+
[[package]]
829
+
name = "icu_properties"
830
+
version = "1.5.1"
831
+
source = "registry+https://github.com/rust-lang/crates.io-index"
832
+
checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
833
+
dependencies = [
834
+
"displaydoc",
835
+
"icu_collections",
836
+
"icu_locid_transform",
837
+
"icu_properties_data",
838
+
"icu_provider",
839
+
"tinystr",
840
+
"zerovec",
841
+
]
842
+
843
+
[[package]]
844
+
name = "icu_properties_data"
845
+
version = "1.5.1"
846
+
source = "registry+https://github.com/rust-lang/crates.io-index"
847
+
checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
848
+
849
+
[[package]]
850
+
name = "icu_provider"
851
+
version = "1.5.0"
852
+
source = "registry+https://github.com/rust-lang/crates.io-index"
853
+
checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
854
+
dependencies = [
855
+
"displaydoc",
856
+
"icu_locid",
857
+
"icu_provider_macros",
858
+
"stable_deref_trait",
859
+
"tinystr",
860
+
"writeable",
861
+
"yoke",
862
+
"zerofrom",
863
+
"zerovec",
864
+
]
865
+
866
+
[[package]]
867
+
name = "icu_provider_macros"
868
+
version = "1.5.0"
869
+
source = "registry+https://github.com/rust-lang/crates.io-index"
870
+
checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
871
+
dependencies = [
872
+
"proc-macro2",
873
+
"quote",
874
+
"syn",
875
+
]
876
+
877
+
[[package]]
878
+
name = "idna"
879
+
version = "1.0.3"
880
+
source = "registry+https://github.com/rust-lang/crates.io-index"
881
+
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
882
+
dependencies = [
883
+
"idna_adapter",
884
+
"smallvec",
885
+
"utf8_iter",
886
+
]
887
+
888
+
[[package]]
889
+
name = "idna_adapter"
890
+
version = "1.2.0"
891
+
source = "registry+https://github.com/rust-lang/crates.io-index"
892
+
checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
893
+
dependencies = [
894
+
"icu_normalizer",
895
+
"icu_properties",
896
+
]
897
+
898
+
[[package]]
899
+
name = "indexmap"
900
+
version = "2.9.0"
901
+
source = "registry+https://github.com/rust-lang/crates.io-index"
902
+
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
903
+
dependencies = [
904
+
"equivalent",
905
+
"hashbrown 0.15.2",
906
+
]
907
+
908
+
[[package]]
909
+
name = "itoa"
910
+
version = "1.0.15"
911
+
source = "registry+https://github.com/rust-lang/crates.io-index"
912
+
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
913
+
914
+
[[package]]
915
+
name = "kryptori"
916
+
version = "0.1.0"
917
+
dependencies = [
918
+
"askama",
919
+
"axum",
920
+
"dotenvy",
921
+
"lettre",
922
+
"serde",
923
+
"sqlx",
924
+
"tokio",
925
+
"uuid",
926
+
]
927
+
928
+
[[package]]
929
+
name = "lazy_static"
930
+
version = "1.5.0"
931
+
source = "registry+https://github.com/rust-lang/crates.io-index"
932
+
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
933
+
dependencies = [
934
+
"spin",
935
+
]
936
+
937
+
[[package]]
938
+
name = "lettre"
939
+
version = "0.11.15"
940
+
source = "registry+https://github.com/rust-lang/crates.io-index"
941
+
checksum = "759bc2b8eabb6a30b235d6f716f7f36479f4b38cbe65b8747aefee51f89e8437"
942
+
dependencies = [
943
+
"async-trait",
944
+
"base64",
945
+
"chumsky",
946
+
"email-encoding",
947
+
"email_address",
948
+
"fastrand",
949
+
"futures-io",
950
+
"futures-util",
951
+
"hostname",
952
+
"httpdate",
953
+
"idna",
954
+
"mime",
955
+
"native-tls",
956
+
"nom",
957
+
"percent-encoding",
958
+
"quoted_printable",
959
+
"socket2",
960
+
"tokio",
961
+
"tokio-native-tls",
962
+
"url",
963
+
]
964
+
965
+
[[package]]
966
+
name = "libc"
967
+
version = "0.2.172"
968
+
source = "registry+https://github.com/rust-lang/crates.io-index"
969
+
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
970
+
971
+
[[package]]
972
+
name = "libm"
973
+
version = "0.2.11"
974
+
source = "registry+https://github.com/rust-lang/crates.io-index"
975
+
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
976
+
977
+
[[package]]
978
+
name = "libsqlite3-sys"
979
+
version = "0.30.1"
980
+
source = "registry+https://github.com/rust-lang/crates.io-index"
981
+
checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149"
982
+
dependencies = [
983
+
"cc",
984
+
"pkg-config",
985
+
"vcpkg",
986
+
]
987
+
988
+
[[package]]
989
+
name = "linux-raw-sys"
990
+
version = "0.9.4"
991
+
source = "registry+https://github.com/rust-lang/crates.io-index"
992
+
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
993
+
994
+
[[package]]
995
+
name = "litemap"
996
+
version = "0.7.5"
997
+
source = "registry+https://github.com/rust-lang/crates.io-index"
998
+
checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
999
+
1000
+
[[package]]
1001
+
name = "lock_api"
1002
+
version = "0.4.12"
1003
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1004
+
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
1005
+
dependencies = [
1006
+
"autocfg",
1007
+
"scopeguard",
1008
+
]
1009
+
1010
+
[[package]]
1011
+
name = "log"
1012
+
version = "0.4.27"
1013
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1014
+
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
1015
+
1016
+
[[package]]
1017
+
name = "matchit"
1018
+
version = "0.8.4"
1019
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1020
+
checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
1021
+
1022
+
[[package]]
1023
+
name = "md-5"
1024
+
version = "0.10.6"
1025
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1026
+
checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
1027
+
dependencies = [
1028
+
"cfg-if",
1029
+
"digest",
1030
+
]
1031
+
1032
+
[[package]]
1033
+
name = "memchr"
1034
+
version = "2.7.4"
1035
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1036
+
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
1037
+
1038
+
[[package]]
1039
+
name = "mime"
1040
+
version = "0.3.17"
1041
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1042
+
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1043
+
1044
+
[[package]]
1045
+
name = "miniz_oxide"
1046
+
version = "0.8.8"
1047
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1048
+
checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
1049
+
dependencies = [
1050
+
"adler2",
1051
+
]
1052
+
1053
+
[[package]]
1054
+
name = "mio"
1055
+
version = "1.0.3"
1056
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1057
+
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
1058
+
dependencies = [
1059
+
"libc",
1060
+
"wasi 0.11.0+wasi-snapshot-preview1",
1061
+
"windows-sys 0.52.0",
1062
+
]
1063
+
1064
+
[[package]]
1065
+
name = "native-tls"
1066
+
version = "0.2.14"
1067
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1068
+
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
1069
+
dependencies = [
1070
+
"libc",
1071
+
"log",
1072
+
"openssl",
1073
+
"openssl-probe",
1074
+
"openssl-sys",
1075
+
"schannel",
1076
+
"security-framework",
1077
+
"security-framework-sys",
1078
+
"tempfile",
1079
+
]
1080
+
1081
+
[[package]]
1082
+
name = "nom"
1083
+
version = "8.0.0"
1084
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1085
+
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
1086
+
dependencies = [
1087
+
"memchr",
1088
+
]
1089
+
1090
+
[[package]]
1091
+
name = "num-bigint-dig"
1092
+
version = "0.8.4"
1093
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1094
+
checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
1095
+
dependencies = [
1096
+
"byteorder",
1097
+
"lazy_static",
1098
+
"libm",
1099
+
"num-integer",
1100
+
"num-iter",
1101
+
"num-traits",
1102
+
"rand",
1103
+
"smallvec",
1104
+
"zeroize",
1105
+
]
1106
+
1107
+
[[package]]
1108
+
name = "num-integer"
1109
+
version = "0.1.46"
1110
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1111
+
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
1112
+
dependencies = [
1113
+
"num-traits",
1114
+
]
1115
+
1116
+
[[package]]
1117
+
name = "num-iter"
1118
+
version = "0.1.45"
1119
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1120
+
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
1121
+
dependencies = [
1122
+
"autocfg",
1123
+
"num-integer",
1124
+
"num-traits",
1125
+
]
1126
+
1127
+
[[package]]
1128
+
name = "num-traits"
1129
+
version = "0.2.19"
1130
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1131
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1132
+
dependencies = [
1133
+
"autocfg",
1134
+
"libm",
1135
+
]
1136
+
1137
+
[[package]]
1138
+
name = "object"
1139
+
version = "0.36.7"
1140
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1141
+
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
1142
+
dependencies = [
1143
+
"memchr",
1144
+
]
1145
+
1146
+
[[package]]
1147
+
name = "once_cell"
1148
+
version = "1.21.3"
1149
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1150
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
1151
+
1152
+
[[package]]
1153
+
name = "openssl"
1154
+
version = "0.10.72"
1155
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1156
+
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
1157
+
dependencies = [
1158
+
"bitflags",
1159
+
"cfg-if",
1160
+
"foreign-types",
1161
+
"libc",
1162
+
"once_cell",
1163
+
"openssl-macros",
1164
+
"openssl-sys",
1165
+
]
1166
+
1167
+
[[package]]
1168
+
name = "openssl-macros"
1169
+
version = "0.1.1"
1170
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1171
+
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
1172
+
dependencies = [
1173
+
"proc-macro2",
1174
+
"quote",
1175
+
"syn",
1176
+
]
1177
+
1178
+
[[package]]
1179
+
name = "openssl-probe"
1180
+
version = "0.1.6"
1181
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1182
+
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1183
+
1184
+
[[package]]
1185
+
name = "openssl-sys"
1186
+
version = "0.9.107"
1187
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1188
+
checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07"
1189
+
dependencies = [
1190
+
"cc",
1191
+
"libc",
1192
+
"pkg-config",
1193
+
"vcpkg",
1194
+
]
1195
+
1196
+
[[package]]
1197
+
name = "parking"
1198
+
version = "2.2.1"
1199
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1200
+
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
1201
+
1202
+
[[package]]
1203
+
name = "parking_lot"
1204
+
version = "0.12.3"
1205
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1206
+
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
1207
+
dependencies = [
1208
+
"lock_api",
1209
+
"parking_lot_core",
1210
+
]
1211
+
1212
+
[[package]]
1213
+
name = "parking_lot_core"
1214
+
version = "0.9.10"
1215
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1216
+
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
1217
+
dependencies = [
1218
+
"cfg-if",
1219
+
"libc",
1220
+
"redox_syscall",
1221
+
"smallvec",
1222
+
"windows-targets 0.52.6",
1223
+
]
1224
+
1225
+
[[package]]
1226
+
name = "pem-rfc7468"
1227
+
version = "0.7.0"
1228
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1229
+
checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
1230
+
dependencies = [
1231
+
"base64ct",
1232
+
]
1233
+
1234
+
[[package]]
1235
+
name = "percent-encoding"
1236
+
version = "2.3.1"
1237
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1238
+
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1239
+
1240
+
[[package]]
1241
+
name = "pin-project-lite"
1242
+
version = "0.2.16"
1243
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1244
+
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
1245
+
1246
+
[[package]]
1247
+
name = "pin-utils"
1248
+
version = "0.1.0"
1249
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1250
+
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
1251
+
1252
+
[[package]]
1253
+
name = "pkcs1"
1254
+
version = "0.7.5"
1255
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1256
+
checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
1257
+
dependencies = [
1258
+
"der",
1259
+
"pkcs8",
1260
+
"spki",
1261
+
]
1262
+
1263
+
[[package]]
1264
+
name = "pkcs8"
1265
+
version = "0.10.2"
1266
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1267
+
checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
1268
+
dependencies = [
1269
+
"der",
1270
+
"spki",
1271
+
]
1272
+
1273
+
[[package]]
1274
+
name = "pkg-config"
1275
+
version = "0.3.32"
1276
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1277
+
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
1278
+
1279
+
[[package]]
1280
+
name = "ppv-lite86"
1281
+
version = "0.2.21"
1282
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1283
+
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
1284
+
dependencies = [
1285
+
"zerocopy 0.8.24",
1286
+
]
1287
+
1288
+
[[package]]
1289
+
name = "proc-macro2"
1290
+
version = "1.0.95"
1291
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1292
+
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
1293
+
dependencies = [
1294
+
"unicode-ident",
1295
+
]
1296
+
1297
+
[[package]]
1298
+
name = "psm"
1299
+
version = "0.1.25"
1300
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1301
+
checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88"
1302
+
dependencies = [
1303
+
"cc",
1304
+
]
1305
+
1306
+
[[package]]
1307
+
name = "quote"
1308
+
version = "1.0.40"
1309
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1310
+
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
1311
+
dependencies = [
1312
+
"proc-macro2",
1313
+
]
1314
+
1315
+
[[package]]
1316
+
name = "quoted_printable"
1317
+
version = "0.5.1"
1318
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1319
+
checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73"
1320
+
1321
+
[[package]]
1322
+
name = "r-efi"
1323
+
version = "5.2.0"
1324
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1325
+
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
1326
+
1327
+
[[package]]
1328
+
name = "rand"
1329
+
version = "0.8.5"
1330
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1331
+
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1332
+
dependencies = [
1333
+
"libc",
1334
+
"rand_chacha",
1335
+
"rand_core",
1336
+
]
1337
+
1338
+
[[package]]
1339
+
name = "rand_chacha"
1340
+
version = "0.3.1"
1341
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1342
+
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1343
+
dependencies = [
1344
+
"ppv-lite86",
1345
+
"rand_core",
1346
+
]
1347
+
1348
+
[[package]]
1349
+
name = "rand_core"
1350
+
version = "0.6.4"
1351
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1352
+
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1353
+
dependencies = [
1354
+
"getrandom 0.2.15",
1355
+
]
1356
+
1357
+
[[package]]
1358
+
name = "redox_syscall"
1359
+
version = "0.5.11"
1360
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1361
+
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
1362
+
dependencies = [
1363
+
"bitflags",
1364
+
]
1365
+
1366
+
[[package]]
1367
+
name = "rsa"
1368
+
version = "0.9.8"
1369
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1370
+
checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b"
1371
+
dependencies = [
1372
+
"const-oid",
1373
+
"digest",
1374
+
"num-bigint-dig",
1375
+
"num-integer",
1376
+
"num-traits",
1377
+
"pkcs1",
1378
+
"pkcs8",
1379
+
"rand_core",
1380
+
"signature",
1381
+
"spki",
1382
+
"subtle",
1383
+
"zeroize",
1384
+
]
1385
+
1386
+
[[package]]
1387
+
name = "rustc-demangle"
1388
+
version = "0.1.24"
1389
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1390
+
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
1391
+
1392
+
[[package]]
1393
+
name = "rustc-hash"
1394
+
version = "2.1.1"
1395
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1396
+
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
1397
+
1398
+
[[package]]
1399
+
name = "rustix"
1400
+
version = "1.0.5"
1401
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1402
+
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
1403
+
dependencies = [
1404
+
"bitflags",
1405
+
"errno",
1406
+
"libc",
1407
+
"linux-raw-sys",
1408
+
"windows-sys 0.59.0",
1409
+
]
1410
+
1411
+
[[package]]
1412
+
name = "rustversion"
1413
+
version = "1.0.20"
1414
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1415
+
checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
1416
+
1417
+
[[package]]
1418
+
name = "ryu"
1419
+
version = "1.0.20"
1420
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1421
+
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1422
+
1423
+
[[package]]
1424
+
name = "schannel"
1425
+
version = "0.1.27"
1426
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1427
+
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1428
+
dependencies = [
1429
+
"windows-sys 0.59.0",
1430
+
]
1431
+
1432
+
[[package]]
1433
+
name = "scopeguard"
1434
+
version = "1.2.0"
1435
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1436
+
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1437
+
1438
+
[[package]]
1439
+
name = "security-framework"
1440
+
version = "2.11.1"
1441
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1442
+
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1443
+
dependencies = [
1444
+
"bitflags",
1445
+
"core-foundation",
1446
+
"core-foundation-sys",
1447
+
"libc",
1448
+
"security-framework-sys",
1449
+
]
1450
+
1451
+
[[package]]
1452
+
name = "security-framework-sys"
1453
+
version = "2.14.0"
1454
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1455
+
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1456
+
dependencies = [
1457
+
"core-foundation-sys",
1458
+
"libc",
1459
+
]
1460
+
1461
+
[[package]]
1462
+
name = "serde"
1463
+
version = "1.0.219"
1464
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1465
+
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
1466
+
dependencies = [
1467
+
"serde_derive",
1468
+
]
1469
+
1470
+
[[package]]
1471
+
name = "serde_derive"
1472
+
version = "1.0.219"
1473
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1474
+
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
1475
+
dependencies = [
1476
+
"proc-macro2",
1477
+
"quote",
1478
+
"syn",
1479
+
]
1480
+
1481
+
[[package]]
1482
+
name = "serde_json"
1483
+
version = "1.0.140"
1484
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1485
+
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
1486
+
dependencies = [
1487
+
"itoa",
1488
+
"memchr",
1489
+
"ryu",
1490
+
"serde",
1491
+
]
1492
+
1493
+
[[package]]
1494
+
name = "serde_path_to_error"
1495
+
version = "0.1.17"
1496
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1497
+
checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
1498
+
dependencies = [
1499
+
"itoa",
1500
+
"serde",
1501
+
]
1502
+
1503
+
[[package]]
1504
+
name = "serde_urlencoded"
1505
+
version = "0.7.1"
1506
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1507
+
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1508
+
dependencies = [
1509
+
"form_urlencoded",
1510
+
"itoa",
1511
+
"ryu",
1512
+
"serde",
1513
+
]
1514
+
1515
+
[[package]]
1516
+
name = "sha1"
1517
+
version = "0.10.6"
1518
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1519
+
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
1520
+
dependencies = [
1521
+
"cfg-if",
1522
+
"cpufeatures",
1523
+
"digest",
1524
+
]
1525
+
1526
+
[[package]]
1527
+
name = "sha2"
1528
+
version = "0.10.8"
1529
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1530
+
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
1531
+
dependencies = [
1532
+
"cfg-if",
1533
+
"cpufeatures",
1534
+
"digest",
1535
+
]
1536
+
1537
+
[[package]]
1538
+
name = "shlex"
1539
+
version = "1.3.0"
1540
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1541
+
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1542
+
1543
+
[[package]]
1544
+
name = "signal-hook-registry"
1545
+
version = "1.4.4"
1546
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1547
+
checksum = "a1ee1aca2bc74ef9589efa7ccaa0f3752751399940356209b3fd80c078149b5e"
1548
+
dependencies = [
1549
+
"libc",
1550
+
]
1551
+
1552
+
[[package]]
1553
+
name = "signature"
1554
+
version = "2.2.0"
1555
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1556
+
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
1557
+
dependencies = [
1558
+
"digest",
1559
+
"rand_core",
1560
+
]
1561
+
1562
+
[[package]]
1563
+
name = "slab"
1564
+
version = "0.4.9"
1565
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1566
+
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1567
+
dependencies = [
1568
+
"autocfg",
1569
+
]
1570
+
1571
+
[[package]]
1572
+
name = "smallvec"
1573
+
version = "1.15.0"
1574
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1575
+
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
1576
+
dependencies = [
1577
+
"serde",
1578
+
]
1579
+
1580
+
[[package]]
1581
+
name = "socket2"
1582
+
version = "0.5.9"
1583
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1584
+
checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
1585
+
dependencies = [
1586
+
"libc",
1587
+
"windows-sys 0.52.0",
1588
+
]
1589
+
1590
+
[[package]]
1591
+
name = "spin"
1592
+
version = "0.9.8"
1593
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1594
+
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1595
+
dependencies = [
1596
+
"lock_api",
1597
+
]
1598
+
1599
+
[[package]]
1600
+
name = "spki"
1601
+
version = "0.7.3"
1602
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1603
+
checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
1604
+
dependencies = [
1605
+
"base64ct",
1606
+
"der",
1607
+
]
1608
+
1609
+
[[package]]
1610
+
name = "sqlx"
1611
+
version = "0.8.5"
1612
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1613
+
checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e"
1614
+
dependencies = [
1615
+
"sqlx-core",
1616
+
"sqlx-macros",
1617
+
"sqlx-mysql",
1618
+
"sqlx-postgres",
1619
+
"sqlx-sqlite",
1620
+
]
1621
+
1622
+
[[package]]
1623
+
name = "sqlx-core"
1624
+
version = "0.8.5"
1625
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1626
+
checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3"
1627
+
dependencies = [
1628
+
"base64",
1629
+
"bytes",
1630
+
"crc",
1631
+
"crossbeam-queue",
1632
+
"either",
1633
+
"event-listener",
1634
+
"futures-core",
1635
+
"futures-intrusive",
1636
+
"futures-io",
1637
+
"futures-util",
1638
+
"hashbrown 0.15.2",
1639
+
"hashlink",
1640
+
"indexmap",
1641
+
"log",
1642
+
"memchr",
1643
+
"native-tls",
1644
+
"once_cell",
1645
+
"percent-encoding",
1646
+
"serde",
1647
+
"serde_json",
1648
+
"sha2",
1649
+
"smallvec",
1650
+
"thiserror",
1651
+
"tokio",
1652
+
"tokio-stream",
1653
+
"tracing",
1654
+
"url",
1655
+
]
1656
+
1657
+
[[package]]
1658
+
name = "sqlx-macros"
1659
+
version = "0.8.5"
1660
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1661
+
checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce"
1662
+
dependencies = [
1663
+
"proc-macro2",
1664
+
"quote",
1665
+
"sqlx-core",
1666
+
"sqlx-macros-core",
1667
+
"syn",
1668
+
]
1669
+
1670
+
[[package]]
1671
+
name = "sqlx-macros-core"
1672
+
version = "0.8.5"
1673
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1674
+
checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7"
1675
+
dependencies = [
1676
+
"dotenvy",
1677
+
"either",
1678
+
"heck",
1679
+
"hex",
1680
+
"once_cell",
1681
+
"proc-macro2",
1682
+
"quote",
1683
+
"serde",
1684
+
"serde_json",
1685
+
"sha2",
1686
+
"sqlx-core",
1687
+
"sqlx-mysql",
1688
+
"sqlx-postgres",
1689
+
"sqlx-sqlite",
1690
+
"syn",
1691
+
"tempfile",
1692
+
"tokio",
1693
+
"url",
1694
+
]
1695
+
1696
+
[[package]]
1697
+
name = "sqlx-mysql"
1698
+
version = "0.8.5"
1699
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1700
+
checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7"
1701
+
dependencies = [
1702
+
"atoi",
1703
+
"base64",
1704
+
"bitflags",
1705
+
"byteorder",
1706
+
"bytes",
1707
+
"crc",
1708
+
"digest",
1709
+
"dotenvy",
1710
+
"either",
1711
+
"futures-channel",
1712
+
"futures-core",
1713
+
"futures-io",
1714
+
"futures-util",
1715
+
"generic-array",
1716
+
"hex",
1717
+
"hkdf",
1718
+
"hmac",
1719
+
"itoa",
1720
+
"log",
1721
+
"md-5",
1722
+
"memchr",
1723
+
"once_cell",
1724
+
"percent-encoding",
1725
+
"rand",
1726
+
"rsa",
1727
+
"serde",
1728
+
"sha1",
1729
+
"sha2",
1730
+
"smallvec",
1731
+
"sqlx-core",
1732
+
"stringprep",
1733
+
"thiserror",
1734
+
"tracing",
1735
+
"whoami",
1736
+
]
1737
+
1738
+
[[package]]
1739
+
name = "sqlx-postgres"
1740
+
version = "0.8.5"
1741
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1742
+
checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6"
1743
+
dependencies = [
1744
+
"atoi",
1745
+
"base64",
1746
+
"bitflags",
1747
+
"byteorder",
1748
+
"crc",
1749
+
"dotenvy",
1750
+
"etcetera",
1751
+
"futures-channel",
1752
+
"futures-core",
1753
+
"futures-util",
1754
+
"hex",
1755
+
"hkdf",
1756
+
"hmac",
1757
+
"home",
1758
+
"itoa",
1759
+
"log",
1760
+
"md-5",
1761
+
"memchr",
1762
+
"once_cell",
1763
+
"rand",
1764
+
"serde",
1765
+
"serde_json",
1766
+
"sha2",
1767
+
"smallvec",
1768
+
"sqlx-core",
1769
+
"stringprep",
1770
+
"thiserror",
1771
+
"tracing",
1772
+
"whoami",
1773
+
]
1774
+
1775
+
[[package]]
1776
+
name = "sqlx-sqlite"
1777
+
version = "0.8.5"
1778
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1779
+
checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc"
1780
+
dependencies = [
1781
+
"atoi",
1782
+
"flume",
1783
+
"futures-channel",
1784
+
"futures-core",
1785
+
"futures-executor",
1786
+
"futures-intrusive",
1787
+
"futures-util",
1788
+
"libsqlite3-sys",
1789
+
"log",
1790
+
"percent-encoding",
1791
+
"serde",
1792
+
"serde_urlencoded",
1793
+
"sqlx-core",
1794
+
"thiserror",
1795
+
"tracing",
1796
+
"url",
1797
+
]
1798
+
1799
+
[[package]]
1800
+
name = "stable_deref_trait"
1801
+
version = "1.2.0"
1802
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1803
+
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1804
+
1805
+
[[package]]
1806
+
name = "stacker"
1807
+
version = "0.1.20"
1808
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1809
+
checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9"
1810
+
dependencies = [
1811
+
"cc",
1812
+
"cfg-if",
1813
+
"libc",
1814
+
"psm",
1815
+
"windows-sys 0.59.0",
1816
+
]
1817
+
1818
+
[[package]]
1819
+
name = "stringprep"
1820
+
version = "0.1.5"
1821
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1822
+
checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
1823
+
dependencies = [
1824
+
"unicode-bidi",
1825
+
"unicode-normalization",
1826
+
"unicode-properties",
1827
+
]
1828
+
1829
+
[[package]]
1830
+
name = "subtle"
1831
+
version = "2.6.1"
1832
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1833
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1834
+
1835
+
[[package]]
1836
+
name = "syn"
1837
+
version = "2.0.100"
1838
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1839
+
checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
1840
+
dependencies = [
1841
+
"proc-macro2",
1842
+
"quote",
1843
+
"unicode-ident",
1844
+
]
1845
+
1846
+
[[package]]
1847
+
name = "sync_wrapper"
1848
+
version = "1.0.2"
1849
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1850
+
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1851
+
1852
+
[[package]]
1853
+
name = "synstructure"
1854
+
version = "0.13.1"
1855
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1856
+
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
1857
+
dependencies = [
1858
+
"proc-macro2",
1859
+
"quote",
1860
+
"syn",
1861
+
]
1862
+
1863
+
[[package]]
1864
+
name = "tempfile"
1865
+
version = "3.19.1"
1866
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1867
+
checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
1868
+
dependencies = [
1869
+
"fastrand",
1870
+
"getrandom 0.3.2",
1871
+
"once_cell",
1872
+
"rustix",
1873
+
"windows-sys 0.59.0",
1874
+
]
1875
+
1876
+
[[package]]
1877
+
name = "thiserror"
1878
+
version = "2.0.12"
1879
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1880
+
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
1881
+
dependencies = [
1882
+
"thiserror-impl",
1883
+
]
1884
+
1885
+
[[package]]
1886
+
name = "thiserror-impl"
1887
+
version = "2.0.12"
1888
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1889
+
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
1890
+
dependencies = [
1891
+
"proc-macro2",
1892
+
"quote",
1893
+
"syn",
1894
+
]
1895
+
1896
+
[[package]]
1897
+
name = "tinystr"
1898
+
version = "0.7.6"
1899
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1900
+
checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
1901
+
dependencies = [
1902
+
"displaydoc",
1903
+
"zerovec",
1904
+
]
1905
+
1906
+
[[package]]
1907
+
name = "tinyvec"
1908
+
version = "1.9.0"
1909
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1910
+
checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
1911
+
dependencies = [
1912
+
"tinyvec_macros",
1913
+
]
1914
+
1915
+
[[package]]
1916
+
name = "tinyvec_macros"
1917
+
version = "0.1.1"
1918
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1919
+
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1920
+
1921
+
[[package]]
1922
+
name = "tokio"
1923
+
version = "1.44.2"
1924
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1925
+
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
1926
+
dependencies = [
1927
+
"backtrace",
1928
+
"bytes",
1929
+
"libc",
1930
+
"mio",
1931
+
"parking_lot",
1932
+
"pin-project-lite",
1933
+
"signal-hook-registry",
1934
+
"socket2",
1935
+
"tokio-macros",
1936
+
"windows-sys 0.52.0",
1937
+
]
1938
+
1939
+
[[package]]
1940
+
name = "tokio-macros"
1941
+
version = "2.5.0"
1942
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1943
+
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1944
+
dependencies = [
1945
+
"proc-macro2",
1946
+
"quote",
1947
+
"syn",
1948
+
]
1949
+
1950
+
[[package]]
1951
+
name = "tokio-native-tls"
1952
+
version = "0.3.1"
1953
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1954
+
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
1955
+
dependencies = [
1956
+
"native-tls",
1957
+
"tokio",
1958
+
]
1959
+
1960
+
[[package]]
1961
+
name = "tokio-stream"
1962
+
version = "0.1.17"
1963
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1964
+
checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047"
1965
+
dependencies = [
1966
+
"futures-core",
1967
+
"pin-project-lite",
1968
+
"tokio",
1969
+
]
1970
+
1971
+
[[package]]
1972
+
name = "tower"
1973
+
version = "0.5.2"
1974
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1975
+
checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1976
+
dependencies = [
1977
+
"futures-core",
1978
+
"futures-util",
1979
+
"pin-project-lite",
1980
+
"sync_wrapper",
1981
+
"tokio",
1982
+
"tower-layer",
1983
+
"tower-service",
1984
+
"tracing",
1985
+
]
1986
+
1987
+
[[package]]
1988
+
name = "tower-layer"
1989
+
version = "0.3.3"
1990
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1991
+
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
1992
+
1993
+
[[package]]
1994
+
name = "tower-service"
1995
+
version = "0.3.3"
1996
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1997
+
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
1998
+
1999
+
[[package]]
2000
+
name = "tracing"
2001
+
version = "0.1.41"
2002
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2003
+
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
2004
+
dependencies = [
2005
+
"log",
2006
+
"pin-project-lite",
2007
+
"tracing-attributes",
2008
+
"tracing-core",
2009
+
]
2010
+
2011
+
[[package]]
2012
+
name = "tracing-attributes"
2013
+
version = "0.1.28"
2014
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2015
+
checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
2016
+
dependencies = [
2017
+
"proc-macro2",
2018
+
"quote",
2019
+
"syn",
2020
+
]
2021
+
2022
+
[[package]]
2023
+
name = "tracing-core"
2024
+
version = "0.1.33"
2025
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2026
+
checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
2027
+
dependencies = [
2028
+
"once_cell",
2029
+
]
2030
+
2031
+
[[package]]
2032
+
name = "typenum"
2033
+
version = "1.18.0"
2034
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2035
+
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
2036
+
2037
+
[[package]]
2038
+
name = "unicode-bidi"
2039
+
version = "0.3.18"
2040
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2041
+
checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
2042
+
2043
+
[[package]]
2044
+
name = "unicode-ident"
2045
+
version = "1.0.18"
2046
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2047
+
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
2048
+
2049
+
[[package]]
2050
+
name = "unicode-normalization"
2051
+
version = "0.1.24"
2052
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2053
+
checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
2054
+
dependencies = [
2055
+
"tinyvec",
2056
+
]
2057
+
2058
+
[[package]]
2059
+
name = "unicode-properties"
2060
+
version = "0.1.3"
2061
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2062
+
checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
2063
+
2064
+
[[package]]
2065
+
name = "url"
2066
+
version = "2.5.4"
2067
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2068
+
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
2069
+
dependencies = [
2070
+
"form_urlencoded",
2071
+
"idna",
2072
+
"percent-encoding",
2073
+
]
2074
+
2075
+
[[package]]
2076
+
name = "utf16_iter"
2077
+
version = "1.0.5"
2078
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2079
+
checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
2080
+
2081
+
[[package]]
2082
+
name = "utf8_iter"
2083
+
version = "1.0.4"
2084
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2085
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2086
+
2087
+
[[package]]
2088
+
name = "uuid"
2089
+
version = "1.16.0"
2090
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2091
+
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
2092
+
dependencies = [
2093
+
"getrandom 0.3.2",
2094
+
]
2095
+
2096
+
[[package]]
2097
+
name = "vcpkg"
2098
+
version = "0.2.15"
2099
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2100
+
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
2101
+
2102
+
[[package]]
2103
+
name = "version_check"
2104
+
version = "0.9.5"
2105
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2106
+
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2107
+
2108
+
[[package]]
2109
+
name = "wasi"
2110
+
version = "0.11.0+wasi-snapshot-preview1"
2111
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2112
+
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
2113
+
2114
+
[[package]]
2115
+
name = "wasi"
2116
+
version = "0.14.2+wasi-0.2.4"
2117
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2118
+
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
2119
+
dependencies = [
2120
+
"wit-bindgen-rt",
2121
+
]
2122
+
2123
+
[[package]]
2124
+
name = "wasite"
2125
+
version = "0.1.0"
2126
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2127
+
checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
2128
+
2129
+
[[package]]
2130
+
name = "whoami"
2131
+
version = "1.6.0"
2132
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2133
+
checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7"
2134
+
dependencies = [
2135
+
"redox_syscall",
2136
+
"wasite",
2137
+
]
2138
+
2139
+
[[package]]
2140
+
name = "windows-link"
2141
+
version = "0.1.1"
2142
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2143
+
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
2144
+
2145
+
[[package]]
2146
+
name = "windows-sys"
2147
+
version = "0.48.0"
2148
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2149
+
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
2150
+
dependencies = [
2151
+
"windows-targets 0.48.5",
2152
+
]
2153
+
2154
+
[[package]]
2155
+
name = "windows-sys"
2156
+
version = "0.52.0"
2157
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2158
+
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2159
+
dependencies = [
2160
+
"windows-targets 0.52.6",
2161
+
]
2162
+
2163
+
[[package]]
2164
+
name = "windows-sys"
2165
+
version = "0.59.0"
2166
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2167
+
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2168
+
dependencies = [
2169
+
"windows-targets 0.52.6",
2170
+
]
2171
+
2172
+
[[package]]
2173
+
name = "windows-targets"
2174
+
version = "0.48.5"
2175
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2176
+
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
2177
+
dependencies = [
2178
+
"windows_aarch64_gnullvm 0.48.5",
2179
+
"windows_aarch64_msvc 0.48.5",
2180
+
"windows_i686_gnu 0.48.5",
2181
+
"windows_i686_msvc 0.48.5",
2182
+
"windows_x86_64_gnu 0.48.5",
2183
+
"windows_x86_64_gnullvm 0.48.5",
2184
+
"windows_x86_64_msvc 0.48.5",
2185
+
]
2186
+
2187
+
[[package]]
2188
+
name = "windows-targets"
2189
+
version = "0.52.6"
2190
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2191
+
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2192
+
dependencies = [
2193
+
"windows_aarch64_gnullvm 0.52.6",
2194
+
"windows_aarch64_msvc 0.52.6",
2195
+
"windows_i686_gnu 0.52.6",
2196
+
"windows_i686_gnullvm",
2197
+
"windows_i686_msvc 0.52.6",
2198
+
"windows_x86_64_gnu 0.52.6",
2199
+
"windows_x86_64_gnullvm 0.52.6",
2200
+
"windows_x86_64_msvc 0.52.6",
2201
+
]
2202
+
2203
+
[[package]]
2204
+
name = "windows_aarch64_gnullvm"
2205
+
version = "0.48.5"
2206
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2207
+
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
2208
+
2209
+
[[package]]
2210
+
name = "windows_aarch64_gnullvm"
2211
+
version = "0.52.6"
2212
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2213
+
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2214
+
2215
+
[[package]]
2216
+
name = "windows_aarch64_msvc"
2217
+
version = "0.48.5"
2218
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2219
+
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
2220
+
2221
+
[[package]]
2222
+
name = "windows_aarch64_msvc"
2223
+
version = "0.52.6"
2224
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2225
+
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2226
+
2227
+
[[package]]
2228
+
name = "windows_i686_gnu"
2229
+
version = "0.48.5"
2230
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2231
+
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
2232
+
2233
+
[[package]]
2234
+
name = "windows_i686_gnu"
2235
+
version = "0.52.6"
2236
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2237
+
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2238
+
2239
+
[[package]]
2240
+
name = "windows_i686_gnullvm"
2241
+
version = "0.52.6"
2242
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2243
+
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2244
+
2245
+
[[package]]
2246
+
name = "windows_i686_msvc"
2247
+
version = "0.48.5"
2248
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2249
+
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
2250
+
2251
+
[[package]]
2252
+
name = "windows_i686_msvc"
2253
+
version = "0.52.6"
2254
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2255
+
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2256
+
2257
+
[[package]]
2258
+
name = "windows_x86_64_gnu"
2259
+
version = "0.48.5"
2260
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2261
+
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
2262
+
2263
+
[[package]]
2264
+
name = "windows_x86_64_gnu"
2265
+
version = "0.52.6"
2266
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2267
+
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2268
+
2269
+
[[package]]
2270
+
name = "windows_x86_64_gnullvm"
2271
+
version = "0.48.5"
2272
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2273
+
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
2274
+
2275
+
[[package]]
2276
+
name = "windows_x86_64_gnullvm"
2277
+
version = "0.52.6"
2278
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2279
+
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2280
+
2281
+
[[package]]
2282
+
name = "windows_x86_64_msvc"
2283
+
version = "0.48.5"
2284
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2285
+
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
2286
+
2287
+
[[package]]
2288
+
name = "windows_x86_64_msvc"
2289
+
version = "0.52.6"
2290
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2291
+
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2292
+
2293
+
[[package]]
2294
+
name = "winnow"
2295
+
version = "0.7.6"
2296
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2297
+
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
2298
+
dependencies = [
2299
+
"memchr",
2300
+
]
2301
+
2302
+
[[package]]
2303
+
name = "wit-bindgen-rt"
2304
+
version = "0.39.0"
2305
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2306
+
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
2307
+
dependencies = [
2308
+
"bitflags",
2309
+
]
2310
+
2311
+
[[package]]
2312
+
name = "write16"
2313
+
version = "1.0.0"
2314
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2315
+
checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
2316
+
2317
+
[[package]]
2318
+
name = "writeable"
2319
+
version = "0.5.5"
2320
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2321
+
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
2322
+
2323
+
[[package]]
2324
+
name = "yoke"
2325
+
version = "0.7.5"
2326
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2327
+
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
2328
+
dependencies = [
2329
+
"serde",
2330
+
"stable_deref_trait",
2331
+
"yoke-derive",
2332
+
"zerofrom",
2333
+
]
2334
+
2335
+
[[package]]
2336
+
name = "yoke-derive"
2337
+
version = "0.7.5"
2338
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2339
+
checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
2340
+
dependencies = [
2341
+
"proc-macro2",
2342
+
"quote",
2343
+
"syn",
2344
+
"synstructure",
2345
+
]
2346
+
2347
+
[[package]]
2348
+
name = "zerocopy"
2349
+
version = "0.7.35"
2350
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2351
+
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
2352
+
dependencies = [
2353
+
"zerocopy-derive 0.7.35",
2354
+
]
2355
+
2356
+
[[package]]
2357
+
name = "zerocopy"
2358
+
version = "0.8.24"
2359
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2360
+
checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
2361
+
dependencies = [
2362
+
"zerocopy-derive 0.8.24",
2363
+
]
2364
+
2365
+
[[package]]
2366
+
name = "zerocopy-derive"
2367
+
version = "0.7.35"
2368
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2369
+
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
2370
+
dependencies = [
2371
+
"proc-macro2",
2372
+
"quote",
2373
+
"syn",
2374
+
]
2375
+
2376
+
[[package]]
2377
+
name = "zerocopy-derive"
2378
+
version = "0.8.24"
2379
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2380
+
checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
2381
+
dependencies = [
2382
+
"proc-macro2",
2383
+
"quote",
2384
+
"syn",
2385
+
]
2386
+
2387
+
[[package]]
2388
+
name = "zerofrom"
2389
+
version = "0.1.6"
2390
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2391
+
checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
2392
+
dependencies = [
2393
+
"zerofrom-derive",
2394
+
]
2395
+
2396
+
[[package]]
2397
+
name = "zerofrom-derive"
2398
+
version = "0.1.6"
2399
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2400
+
checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
2401
+
dependencies = [
2402
+
"proc-macro2",
2403
+
"quote",
2404
+
"syn",
2405
+
"synstructure",
2406
+
]
2407
+
2408
+
[[package]]
2409
+
name = "zeroize"
2410
+
version = "1.8.1"
2411
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2412
+
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
2413
+
2414
+
[[package]]
2415
+
name = "zerovec"
2416
+
version = "0.10.4"
2417
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2418
+
checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
2419
+
dependencies = [
2420
+
"yoke",
2421
+
"zerofrom",
2422
+
"zerovec-derive",
2423
+
]
2424
+
2425
+
[[package]]
2426
+
name = "zerovec-derive"
2427
+
version = "0.10.3"
2428
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2429
+
checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
2430
+
dependencies = [
2431
+
"proc-macro2",
2432
+
"quote",
2433
+
"syn",
2434
+
]
+14
Cargo.toml
+14
Cargo.toml
···
1
+
[package]
2
+
name = "kryptori"
3
+
version = "0.1.0"
4
+
edition = "2024"
5
+
6
+
[dependencies]
7
+
axum = { version = "0.8" }
8
+
tokio = { version = "1", features = ["full"] }
9
+
sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-native-tls"] }
10
+
uuid = { version = "1", features = ["v4"] }
11
+
lettre = { version = "0.11", features = ["tokio1", "tokio1-native-tls", "smtp-transport", "builder"] }
12
+
dotenvy = "0.15"
13
+
serde = { version = "1", features = ["derive"] }
14
+
askama = "0.13.1"
-35
Makefile
-35
Makefile
···
1
-
VENV_DIR = venv
2
-
3
-
.PHONY: default
4
-
default: run
5
-
6
-
.PHONY: install
7
-
install:
8
-
nix develop
9
-
10
-
run:
11
-
@echo "Starting FastAPI server..."
12
-
$(VENV_DIR)/bin/uvicorn main:app --reload
13
-
14
-
.PHONY: format
15
-
format:
16
-
ruff check --fix .
17
-
ruff format .
18
-
19
-
# Lint the Python code using ruff
20
-
.PHONY: lint
21
-
lint:
22
-
ruff check .
23
-
24
-
.PHONY: test
25
-
test:
26
-
pytest
27
-
28
-
# Clean up virtual environment and cache
29
-
.PHONY: clean
30
-
clean:
31
-
@echo "Cleaning up..."
32
-
rm -rf $(VENV_DIR)
33
-
rm -rf __pycache__
34
-
rm -rf .pytest_cache
35
-
-2
README.md
-2
README.md
-61
flake.lock
-61
flake.lock
···
1
-
{
2
-
"nodes": {
3
-
"flake-utils": {
4
-
"inputs": {
5
-
"systems": "systems"
6
-
},
7
-
"locked": {
8
-
"lastModified": 1731533236,
9
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
10
-
"owner": "numtide",
11
-
"repo": "flake-utils",
12
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
13
-
"type": "github"
14
-
},
15
-
"original": {
16
-
"owner": "numtide",
17
-
"repo": "flake-utils",
18
-
"type": "github"
19
-
}
20
-
},
21
-
"nixpkgs": {
22
-
"locked": {
23
-
"lastModified": 1737632463,
24
-
"narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=",
25
-
"owner": "NixOS",
26
-
"repo": "nixpkgs",
27
-
"rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9",
28
-
"type": "github"
29
-
},
30
-
"original": {
31
-
"owner": "NixOS",
32
-
"ref": "nixos-unstable",
33
-
"repo": "nixpkgs",
34
-
"type": "github"
35
-
}
36
-
},
37
-
"root": {
38
-
"inputs": {
39
-
"flake-utils": "flake-utils",
40
-
"nixpkgs": "nixpkgs"
41
-
}
42
-
},
43
-
"systems": {
44
-
"locked": {
45
-
"lastModified": 1681028828,
46
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
-
"owner": "nix-systems",
48
-
"repo": "default",
49
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
-
"type": "github"
51
-
},
52
-
"original": {
53
-
"owner": "nix-systems",
54
-
"repo": "default",
55
-
"type": "github"
56
-
}
57
-
}
58
-
},
59
-
"root": "root",
60
-
"version": 7
61
-
}
-59
flake.nix
-59
flake.nix
···
1
-
{
2
-
description = "Kryptori environment";
3
-
4
-
inputs = {
5
-
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
6
-
flake-utils.url = "github:numtide/flake-utils";
7
-
};
8
-
9
-
outputs = { self, nixpkgs, flake-utils }:
10
-
flake-utils.lib.eachDefaultSystem (system:
11
-
let
12
-
pkgs = import nixpkgs { inherit system; };
13
-
python = pkgs.python312;
14
-
in
15
-
rec {
16
-
devShell = pkgs.mkShell {
17
-
buildInputs = [
18
-
python
19
-
python.pkgs.setuptools
20
-
python.pkgs.wheel
21
-
python.pkgs.uv
22
-
];
23
-
24
-
shellHook = ''
25
-
echo "Entering Python development environment..."
26
-
export PYTHONPATH=$PWD
27
-
# Create a virtualenv inside the shell if it doesn't exist
28
-
if [ ! -d "venv" ]; then
29
-
uv venv venv
30
-
fi
31
-
32
-
# Activate the virtual environment
33
-
source venv/bin/activate
34
-
35
-
# Install dependencies from requirements.txt
36
-
if [ -f requirements.txt ]; then
37
-
uv pip install -r requirements.txt
38
-
fi
39
-
40
-
echo "All dependencies installed via uv."
41
-
'';
42
-
};
43
-
44
-
packages.default = python.pkgs.buildPythonPackage {
45
-
pname = "kryptori";
46
-
version = "0.1.0";
47
-
48
-
src = ./.;
49
-
50
-
propagatedBuildInputs = [];
51
-
52
-
# Optional: If you need to run tests
53
-
# checkPhase = ''
54
-
# pytest tests/
55
-
# '';
56
-
};
57
-
});
58
-
}
59
-
-345
main.py
-345
main.py
···
1
-
import os
2
-
from fastapi import FastAPI, Request, Form, HTTPException
3
-
from fastapi.responses import HTMLResponse, RedirectResponse
4
-
from jinja2 import Template
5
-
import sqlite3
6
-
import uuid
7
-
import smtplib
8
-
9
-
from email.message import EmailMessage
10
-
11
-
app = FastAPI()
12
-
13
-
DATABASE = "kryptori.db"
14
-
15
-
16
-
def create_tables_if_not_exist():
17
-
conn = sqlite3.connect(DATABASE)
18
-
cursor = conn.cursor()
19
-
20
-
create_advertisement_table_sql = """
21
-
CREATE TABLE IF NOT EXISTS Advertisement (
22
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
23
-
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
24
-
updated_at TEXT,
25
-
title TEXT NOT NULL,
26
-
description TEXT NOT NULL,
27
-
owner_email TEXT NOT NULL,
28
-
active INT NOT NULL DEFAULT 0,
29
-
owner_token TEXT NOT NULL UNIQUE
30
-
);
31
-
"""
32
-
cursor.execute(create_advertisement_table_sql)
33
-
conn.commit()
34
-
conn.close()
35
-
36
-
37
-
def create_advertisement(
38
-
title: str,
39
-
description: str,
40
-
owner_email: str,
41
-
):
42
-
title = title.strip()[0:1000]
43
-
description = description.strip()[0:1000]
44
-
owner_email = owner_email.strip()[0:1000]
45
-
owner_token = uuid.uuid4()
46
-
conn = sqlite3.connect(DATABASE)
47
-
cursor = conn.cursor()
48
-
49
-
insert_sql = """
50
-
INSERT INTO Advertisement (title, description, owner_email, owner_token)
51
-
VALUES (?, ?, ?, ?)
52
-
"""
53
-
54
-
cursor.execute(
55
-
insert_sql,
56
-
(title, description, owner_email, str(owner_token)),
57
-
)
58
-
conn.commit()
59
-
conn.close()
60
-
61
-
msg = EmailMessage()
62
-
msg["From"] = os.environ.get("EMAIL")
63
-
msg["To"] = owner_email
64
-
msg["Subject"] = f"New ad created: {title}"
65
-
msg.set_content(
66
-
(
67
-
f"Thanks for making a new ad!\n"
68
-
f"Title: {title}\n"
69
-
f"Description: {description}\n"
70
-
"Before it goes live, you must go activate the ad by loading the webpage:\n"
71
-
f"kryptori.lu1.sh/manage-ad?token={owner_token}\n\n "
72
-
f"The token for this ad is: {owner_token}\n"
73
-
"and that's what you can use to update and delete the ad."
74
-
)
75
-
)
76
-
77
-
# TODO: send via own email server
78
-
s = smtplib.SMTP('smtp.gmail.com', 587)
79
-
s.ehlo()
80
-
s.starttls()
81
-
s.ehlo()
82
-
s.login(os.environ.get("EMAIL", ""), os.environ.get("PASSWORD", ""))
83
-
s.send_message(msg)
84
-
s.quit()
85
-
86
-
87
-
def fetch_advertisements_html():
88
-
conn = sqlite3.connect(DATABASE)
89
-
cursor = conn.cursor()
90
-
cursor.execute(
91
-
"SELECT id, title, description, created_at, updated_at FROM Advertisement WHERE active = 1 ORDER BY created_at DESC;"
92
-
)
93
-
ads = cursor.fetchall()
94
-
conn.close()
95
-
96
-
html = "<div>"
97
-
for id, title, description, created_at, updated_at in ads:
98
-
html += f"""<div class="ad-container">
99
-
<details>
100
-
<summary>{title}</summary>
101
-
<i>Created on {created_at}{f", updated on {updated_at}" if updated_at is not None else ""}</i>
102
-
<p style="margin-left: 50px;">{description}</p>
103
-
<form action="/send-message" method="post">
104
-
<span>Get in touch with the poster!</span>
105
-
<input type="hidden" id="ad_id" name="ad_id" value="{id}" required>
106
-
107
-
<div style="margin-top: 4px;">
108
-
<label for="user_email">
109
-
<b>Your email</b>
110
-
<br />
111
-
This won't be stored at all, it's just to tell the poster who to reply to.
112
-
<br />
113
-
Check the <a target="_blank" href="https://github.com/lu1a/kryptori">source code</a> if in doubt.
114
-
<br />
115
-
I'm open to suggestions on how to more formally prove that it's not
116
-
<br />
117
-
saved behind the scenes or anything.
118
-
</label>
119
-
<br />
120
-
<input type="email" id="user_email" name="user_email" placeholder="abc@xyz.com" required>
121
-
</div>
122
-
123
-
<div class="input-container">
124
-
<label for="message">
125
-
<b>Message</b>
126
-
</label>
127
-
<br />
128
-
<textarea id="message" name="message" style="width: 100%; height: 6rem;" required></textarea>
129
-
</div>
130
-
131
-
<p>
132
-
Remember, this will just send an email to the poster.
133
-
<br />
134
-
Then you two will hash it out over email.
135
-
<br />
136
-
Don't come crying to me if the poster doesn't get back to you,
137
-
<br />
138
-
or if the poster grifts you or if you grift the poster.
139
-
</p>
140
-
<div class="input-container">
141
-
<button type="submit">Send Message</button>
142
-
</div>
143
-
</form>
144
-
</details>
145
-
</div>"""
146
-
html += "</div>"
147
-
return html
148
-
149
-
150
-
def fetch_advertisement_by_token(token):
151
-
conn = sqlite3.connect(DATABASE)
152
-
cursor = conn.cursor()
153
-
cursor.execute(
154
-
"SELECT title, description, created_at, updated_at, owner_email FROM Advertisement WHERE owner_token = ? LIMIT 1",
155
-
(token,),
156
-
)
157
-
ad = cursor.fetchone()
158
-
159
-
cursor.execute(
160
-
"UPDATE Advertisement SET active = 1 WHERE owner_token = ?",
161
-
(token,),
162
-
)
163
-
conn.commit()
164
-
conn.close()
165
-
166
-
return ad
167
-
168
-
169
-
create_tables_if_not_exist()
170
-
171
-
172
-
@app.get("/", response_class=HTMLResponse)
173
-
async def index():
174
-
with open("pages/index.html", "r") as f:
175
-
index_page = f.read()
176
-
177
-
ads_html = fetch_advertisements_html()
178
-
template = Template(index_page)
179
-
rendered_page = template.render(ads=ads_html)
180
-
181
-
return rendered_page
182
-
183
-
184
-
@app.post("/send-message")
185
-
async def send_message(
186
-
ad_id: int = Form(...), user_email: str = Form(...), message: str = Form(...)
187
-
):
188
-
if user_email == "" or message == "":
189
-
raise HTTPException(status_code=400, detail="Play nice!")
190
-
191
-
conn = sqlite3.connect(DATABASE)
192
-
cursor = conn.cursor()
193
-
194
-
cursor.execute(
195
-
"SELECT owner_email, title FROM Advertisement WHERE id = ?", (ad_id,)
196
-
)
197
-
owner_email, title = cursor.fetchone()
198
-
199
-
if not owner_email:
200
-
conn.close()
201
-
raise HTTPException(status_code=404, detail="Advertisement not found")
202
-
203
-
conn.commit()
204
-
conn.close()
205
-
206
-
# TODO: use own mail server
207
-
s = smtplib.SMTP('smtp.gmail.com', 587)
208
-
s.ehlo()
209
-
s.starttls()
210
-
s.ehlo()
211
-
212
-
msg_to_owner = EmailMessage()
213
-
msg_to_owner["From"] = os.environ.get("EMAIL")
214
-
msg_to_owner["To"] = owner_email
215
-
msg_to_owner["Subject"] = f"New message about your ad: {title}"
216
-
msg_to_owner.set_content(
217
-
(
218
-
f"Here's a message from an interested party about your ad {title}!\n"
219
-
f"Message:\n{message.strip()[0:1000]}\n"
220
-
f"User email: {user_email.strip()[0:1000]}\n"
221
-
"Please reply to their email address."
222
-
)
223
-
)
224
-
s.login(os.environ.get("EMAIL", ""), os.environ.get("PASSWORD", ""))
225
-
s.send_message(msg_to_owner)
226
-
227
-
confirmation_msg_to_user = EmailMessage()
228
-
confirmation_msg_to_user["From"] = os.environ.get("EMAIL")
229
-
confirmation_msg_to_user["To"] = user_email.strip()[0:1000]
230
-
confirmation_msg_to_user["Subject"] = "Confirmation: you sent a msg about an ad"
231
-
confirmation_msg_to_user.set_content(
232
-
f"You just sent a message in reply to this ad: {title}\n"
233
-
f"Your message was: {message.strip()[0:1000]}\n\n"
234
-
"Now you will wait for the ad poster to reply to you via email.\n"
235
-
"Thanks for using kryptori!"
236
-
)
237
-
s.send_message(confirmation_msg_to_user)
238
-
s.quit()
239
-
240
-
return RedirectResponse(url="/?success=true", status_code=303)
241
-
242
-
243
-
@app.post("/create-ad", response_class=HTMLResponse)
244
-
async def create_ad(
245
-
title: str = Form(...),
246
-
description: str = Form(...),
247
-
owner_email: str = Form(...),
248
-
):
249
-
if title == "" or description == "" or owner_email == "":
250
-
raise HTTPException(status_code=400, detail="Play nice!")
251
-
252
-
create_advertisement(
253
-
title,
254
-
description,
255
-
owner_email,
256
-
)
257
-
258
-
return RedirectResponse(url="/", status_code=303)
259
-
260
-
261
-
@app.post("/update-ad", response_class=HTMLResponse)
262
-
async def update_ad(
263
-
title: str = Form(...),
264
-
description: str = Form(...),
265
-
token: str = Form(...),
266
-
):
267
-
if title == "" or description == "":
268
-
raise HTTPException(status_code=400, detail="Play nice!")
269
-
270
-
conn = sqlite3.connect(DATABASE)
271
-
cursor = conn.cursor()
272
-
273
-
cursor.execute("SELECT * FROM Advertisement WHERE owner_token = ?", (token,))
274
-
existing_ad = cursor.fetchone()
275
-
276
-
if not existing_ad:
277
-
conn.close()
278
-
raise HTTPException(status_code=404, detail="Advertisement not found")
279
-
280
-
cursor.execute(
281
-
"""
282
-
UPDATE Advertisement
283
-
SET title = ?, description = ?, updated_at = CURRENT_TIMESTAMP
284
-
WHERE owner_token = ?
285
-
""",
286
-
(title.strip()[0:1000], description.strip()[0:1000], token),
287
-
)
288
-
289
-
conn.commit()
290
-
conn.close()
291
-
292
-
return RedirectResponse(
293
-
url=f"/manage-ad?token={token}&success=true", status_code=303
294
-
)
295
-
296
-
297
-
@app.post("/delete-ad", response_class=HTMLResponse)
298
-
async def delete_at(
299
-
token: str = Form(...),
300
-
):
301
-
conn = sqlite3.connect(DATABASE)
302
-
cursor = conn.cursor()
303
-
304
-
cursor.execute("DELETE FROM Advertisement WHERE owner_token = ?", (token,))
305
-
conn.commit()
306
-
conn.close()
307
-
308
-
return RedirectResponse(url="/?delete-success=true", status_code=303)
309
-
310
-
311
-
@app.get("/manage-ad", response_class=HTMLResponse)
312
-
async def manage_ad(request: Request):
313
-
token = request.query_params.get("token")
314
-
if not token:
315
-
raise HTTPException(status_code=400, detail="Token parameter is required")
316
-
317
-
with open("pages/manage_ad.html", "r") as f:
318
-
manage_ad_page = f.read()
319
-
320
-
ad = fetch_advertisement_by_token(token)
321
-
if not ad:
322
-
return RedirectResponse(url="/", status_code=303)
323
-
title, description, created_at, updated_at, owner_email = ad
324
-
template = Template(manage_ad_page)
325
-
rendered_page = template.render(
326
-
title=title,
327
-
description=description,
328
-
created_at=created_at,
329
-
updated_at=updated_at,
330
-
owner_email=owner_email,
331
-
token=token,
332
-
)
333
-
334
-
return rendered_page
335
-
336
-
337
-
@app.get("/{path:path}", response_class=HTMLResponse)
338
-
async def catch_all(path: str):
339
-
return HTMLResponse(content=f"<h1>Unsupported URI: {path}</h1>", status_code=404)
340
-
341
-
342
-
if __name__ == "__main__":
343
-
import uvicorn
344
-
345
-
uvicorn.run(app, host="0.0.0.0", port=8000)
+1
-1
pages/index.html
+1
-1
pages/index.html
···
58
58
<br />
59
59
<br />
60
60
...what, you don't like the UI?!
61
-
Make a pull request to the source code then: <a href="https://github.com/lu1a/kryptori">github.com/lu1a/kryptori</a>.
61
+
Make a pull request to the source code then: <a href="https://tangled.sh/@lu1.sh/kryptori">tangled.sh/@lu1.sh/kryptori</a>.
62
62
</p>
63
63
</details>
64
64
</div>
pages/manage_ad.html
templates/manage_ad.html
pages/manage_ad.html
templates/manage_ad.html
-38
requirements.txt
-38
requirements.txt
···
1
-
# This file was autogenerated by uv via the following command:
2
-
# uv pip compile requirements.in -o requirements.txt
3
-
annotated-types==0.7.0
4
-
# via pydantic
5
-
anyio==4.8.0
6
-
# via starlette
7
-
click==8.1.8
8
-
# via uvicorn
9
-
fastapi==0.115.7
10
-
# via -r requirements.in
11
-
h11==0.14.0
12
-
# via uvicorn
13
-
idna==3.10
14
-
# via anyio
15
-
jinja2==3.1.5
16
-
# via -r requirements.in
17
-
markupsafe==3.0.2
18
-
# via jinja2
19
-
pydantic==2.10.6
20
-
# via fastapi
21
-
pydantic-core==2.27.2
22
-
# via pydantic
23
-
python-multipart==0.0.20
24
-
# via -r requirements.in
25
-
ruff==0.9.3
26
-
# via -r requirements.in
27
-
sniffio==1.3.1
28
-
# via anyio
29
-
starlette==0.45.3
30
-
# via fastapi
31
-
typing-extensions==4.12.2
32
-
# via
33
-
# anyio
34
-
# fastapi
35
-
# pydantic
36
-
# pydantic-core
37
-
uvicorn==0.34.0
38
-
# via -r requirements.in
+370
src/main.rs
+370
src/main.rs
···
1
+
use axum::{routing::get, response::Html, Form, response::Redirect, Router, extract::{Query, State}, http::StatusCode};
2
+
use sqlx::sqlite::SqlitePoolOptions;
3
+
use sqlx::SqlitePool;
4
+
use std::sync::Arc;
5
+
use std::fs;
6
+
use uuid::Uuid;
7
+
use std::env;
8
+
use lettre::{Message, SmtpTransport, Transport, transport::smtp::authentication::Credentials};
9
+
use serde::Deserialize;
10
+
use askama::Template;
11
+
12
+
#[derive(Clone)]
13
+
struct AppState {
14
+
db: SqlitePool,
15
+
}
16
+
17
+
pub async fn create_tables_if_not_exist(pool: &SqlitePool) -> Result<(), sqlx::Error> {
18
+
let create_advertisement_table_sql = r#"
19
+
CREATE TABLE IF NOT EXISTS Advertisement (
20
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
22
+
updated_at TEXT,
23
+
title TEXT NOT NULL,
24
+
description TEXT NOT NULL,
25
+
owner_email TEXT NOT NULL,
26
+
active INT NOT NULL DEFAULT 0,
27
+
owner_token TEXT NOT NULL UNIQUE
28
+
);
29
+
"#;
30
+
31
+
sqlx::query(create_advertisement_table_sql)
32
+
.execute(pool)
33
+
.await?;
34
+
35
+
Ok(())
36
+
}
37
+
38
+
#[derive(Deserialize)]
39
+
struct CreateAdForm {
40
+
title: String,
41
+
description: String,
42
+
owner_email: String,
43
+
}
44
+
45
+
async fn create_ad(
46
+
State(state): State<Arc<AppState>>,
47
+
Form(input): Form<CreateAdForm>,
48
+
) -> Result<Redirect, (axum::http::StatusCode, String)> {
49
+
let title = input.title.trim().chars().take(1000).collect::<String>();
50
+
let description = input.description.trim().chars().take(1000).collect::<String>();
51
+
let owner_email = input.owner_email.trim().chars().take(1000).collect::<String>();
52
+
53
+
if title.is_empty() || description.is_empty() || owner_email.is_empty() {
54
+
return Err((axum::http::StatusCode::BAD_REQUEST, "Play nice!".into()));
55
+
}
56
+
57
+
let token = Uuid::new_v4().to_string();
58
+
59
+
let insert_result = sqlx::query!(
60
+
r#"
61
+
INSERT INTO Advertisement (title, description, owner_email, owner_token)
62
+
VALUES (?, ?, ?, ?)
63
+
"#,
64
+
title,
65
+
description,
66
+
owner_email,
67
+
token,
68
+
)
69
+
.execute(&state.db)
70
+
.await;
71
+
72
+
if let Err(e) = insert_result {
73
+
eprintln!("DB insert error: {e}");
74
+
return Err((axum::http::StatusCode::INTERNAL_SERVER_ERROR, "Could not insert ad.".into()));
75
+
}
76
+
77
+
if let Err(e) = send_email(&owner_email, &title, &description, &token).await {
78
+
eprintln!("Email error: {e}");
79
+
}
80
+
81
+
Ok(Redirect::to("/"))
82
+
}
83
+
84
+
async fn send_email(
85
+
to: &str,
86
+
title: &str,
87
+
description: &str,
88
+
token: &str,
89
+
) -> Result<(), Box<dyn std::error::Error>> {
90
+
let email = env::var("EMAIL")?;
91
+
let password = env::var("PASSWORD")?;
92
+
93
+
let body = format!(
94
+
"Thanks for making a new ad!\n\
95
+
Title: {title}\n\
96
+
Description: {description}\n\
97
+
Before it goes live, you must go activate the ad by loading the webpage:\n\
98
+
kryptori.lu1.sh/manage-ad?token={token}\n\n\
99
+
The token for this ad is: {token}\n\
100
+
and that's what you can use to update and delete the ad.",
101
+
);
102
+
103
+
let msg = Message::builder()
104
+
.from(email.parse()?)
105
+
.to(to.parse()?)
106
+
.subject(format!("New ad created: {title}"))
107
+
.body(body)?;
108
+
109
+
let creds = Credentials::new(email.clone(), password);
110
+
111
+
let mailer = SmtpTransport::starttls_relay("smtp.gmail.com")?
112
+
.credentials(creds)
113
+
.build();
114
+
115
+
mailer.send(&msg)?;
116
+
Ok(())
117
+
}
118
+
119
+
async fn index(State(state): State<Arc<AppState>>) -> Html<String> {
120
+
let template = fs::read_to_string("pages/index.html").expect("Failed to read template");
121
+
122
+
let ads_html = fetch_advertisements_html(&state.db).await.unwrap_or_else(|e| {
123
+
eprintln!("DB error: {e}");
124
+
"<p>Could not load ads.</p>".to_string()
125
+
});
126
+
127
+
let rendered = template.replace("{{ ads }}", &ads_html);
128
+
129
+
Html(rendered)
130
+
}
131
+
132
+
async fn fetch_advertisements_html(pool: &SqlitePool) -> Result<String, sqlx::Error> {
133
+
let ads = sqlx::query!(
134
+
r#"
135
+
SELECT id, title, description, created_at, updated_at
136
+
FROM Advertisement
137
+
WHERE active = 1
138
+
ORDER BY created_at DESC
139
+
"#
140
+
)
141
+
.fetch_all(pool)
142
+
.await?;
143
+
144
+
let mut html = String::from("<div>");
145
+
146
+
for ad in ads {
147
+
let created = &ad.created_at;
148
+
let updated_str = match &ad.updated_at {
149
+
Some(updated) => format!(", updated on {}", updated),
150
+
None => "".to_string(),
151
+
};
152
+
153
+
html.push_str(&format!(
154
+
r#"<div class="ad-container">
155
+
<details>
156
+
<summary>{title}</summary>
157
+
<i>Created on {created}{updated}</i>
158
+
<p style="margin-left: 50px;">{desc}</p>
159
+
<form action="/send-message" method="post">
160
+
<span>Get in touch with the poster!</span>
161
+
<input type="hidden" id="ad_id" name="ad_id" value="{id}" required>
162
+
<div style="margin-top: 4px;">
163
+
<label for="user_email">
164
+
<b>Your email</b><br />
165
+
This won't be stored at all...<br />
166
+
Check the <a target="_blank" href="https://github.com/lu1a/kryptori">source code</a>...
167
+
</label><br />
168
+
<input type="email" id="user_email" name="user_email" placeholder="abc@xyz.com" required>
169
+
</div>
170
+
<div class="input-container">
171
+
<label for="message"><b>Message</b></label><br />
172
+
<textarea id="message" name="message" style="width: 100%; height: 6rem;" required></textarea>
173
+
</div>
174
+
<p>Remember, this will just send an email to the poster... etc</p>
175
+
<div class="input-container">
176
+
<button type="submit">Send Message</button>
177
+
</div>
178
+
</form>
179
+
</details>
180
+
</div>"#,
181
+
title = ad.title,
182
+
created = created,
183
+
updated = updated_str,
184
+
desc = ad.description,
185
+
id = ad.id,
186
+
));
187
+
}
188
+
189
+
html.push_str("</div>");
190
+
Ok(html)
191
+
}
192
+
193
+
async fn fetch_advertisement_by_token(
194
+
pool: &SqlitePool,
195
+
token: &str
196
+
) -> Result<Option<(String, String, String, Option<String>, String)>, sqlx::Error> {
197
+
let row = sqlx::query!(
198
+
r#"
199
+
SELECT title, description, created_at, updated_at, owner_email
200
+
FROM Advertisement
201
+
WHERE owner_token = ?
202
+
LIMIT 1
203
+
"#,
204
+
token
205
+
)
206
+
.fetch_optional(pool)
207
+
.await?;
208
+
209
+
if let Some(ad) = row {
210
+
sqlx::query!(
211
+
r#"
212
+
UPDATE Advertisement
213
+
SET active = 1
214
+
WHERE owner_token = ?
215
+
"#,
216
+
token
217
+
)
218
+
.execute(pool)
219
+
.await?;
220
+
221
+
Ok(Some((
222
+
ad.title,
223
+
ad.description,
224
+
ad.created_at,
225
+
ad.updated_at,
226
+
ad.owner_email,
227
+
)))
228
+
} else {
229
+
Ok(None)
230
+
}
231
+
}
232
+
233
+
#[derive(Deserialize)]
234
+
struct ManageAdQuery {
235
+
token: String,
236
+
}
237
+
238
+
#[derive(Template)]
239
+
#[template(path = "manage_ad.html")]
240
+
struct ManageAdTemplate {
241
+
title: String,
242
+
description: String,
243
+
created_at: String,
244
+
updated_at: String,
245
+
owner_email: String,
246
+
token: String,
247
+
}
248
+
249
+
fn render_updated_at(updated_at: Option<String>) -> String {
250
+
updated_at.unwrap_or_else(|| "".to_string())
251
+
}
252
+
253
+
async fn manage_ad(
254
+
State(state): State<Arc<AppState>>,
255
+
Query(query): Query<ManageAdQuery>,
256
+
) -> Result<Html<String>, Redirect> {
257
+
let token = &query.token;
258
+
259
+
match fetch_advertisement_by_token(&state.db, token).await {
260
+
Ok(Some((title, description, created_at, updated_at, owner_email))) => {
261
+
let updated_at_str = render_updated_at(updated_at);
262
+
let template = ManageAdTemplate {
263
+
title,
264
+
description,
265
+
created_at,
266
+
updated_at: updated_at_str,
267
+
owner_email,
268
+
token: token.to_string(),
269
+
};
270
+
271
+
let rendered_page = template.render().unwrap();
272
+
273
+
Ok(Html(rendered_page))
274
+
}
275
+
Ok(None) => {
276
+
Err(Redirect::to("/"))
277
+
}
278
+
Err(_) => {
279
+
Err(Redirect::to("/"))
280
+
}
281
+
}
282
+
}
283
+
284
+
#[derive(Deserialize)]
285
+
struct UpdateAdForm {
286
+
title: String,
287
+
description: String,
288
+
token: String,
289
+
}
290
+
291
+
#[derive(Deserialize)]
292
+
struct DeleteAdForm {
293
+
token: String,
294
+
}
295
+
296
+
async fn update_ad(
297
+
State(state): State<Arc<AppState>>,
298
+
Form(form): Form<UpdateAdForm>,
299
+
) -> Result<Redirect, StatusCode> {
300
+
let title = form.title.trim().to_string();
301
+
let description = form.description.trim().to_string();
302
+
let token = form.token.trim();
303
+
304
+
if title.is_empty() || description.is_empty() {
305
+
return Err(StatusCode::BAD_REQUEST);
306
+
}
307
+
308
+
let row = sqlx::query!("SELECT * FROM Advertisement WHERE owner_token = ?", token)
309
+
.fetch_optional(&state.db)
310
+
.await
311
+
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
312
+
313
+
if row.is_none() {
314
+
return Err(StatusCode::NOT_FOUND);
315
+
}
316
+
317
+
sqlx::query!(
318
+
"UPDATE Advertisement SET title = ?, description = ?, updated_at = CURRENT_TIMESTAMP WHERE owner_token = ?",
319
+
title, description, token
320
+
)
321
+
.execute(&state.db)
322
+
.await
323
+
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
324
+
325
+
Ok(Redirect::to(format!("/manage-ad?token={}&success=true", token).as_str()))
326
+
}
327
+
328
+
async fn delete_ad(
329
+
State(state): State<Arc<AppState>>,
330
+
Form(form): Form<DeleteAdForm>,
331
+
) -> Result<Redirect, StatusCode> {
332
+
let token = form.token.trim();
333
+
334
+
let rows_deleted = sqlx::query!("DELETE FROM Advertisement WHERE owner_token = ?", token)
335
+
.execute(&state.db)
336
+
.await
337
+
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
338
+
339
+
if rows_deleted.rows_affected() == 0 {
340
+
return Err(StatusCode::NOT_FOUND);
341
+
}
342
+
343
+
Ok(Redirect::to("/?delete-success=true"))
344
+
}
345
+
346
+
#[tokio::main]
347
+
async fn main() -> Result<(), sqlx::Error> {
348
+
let database_url = env::var("DATABASE_URL").unwrap_or("sqlite://kryptori.db".to_string());
349
+
let pool = SqlitePoolOptions::new()
350
+
.connect(&database_url)
351
+
.await?;
352
+
353
+
create_tables_if_not_exist(&pool).await?;
354
+
355
+
let state = Arc::new(AppState { db: pool });
356
+
357
+
let app = Router::new()
358
+
.route("/", get(index))
359
+
.route("/create-ad", axum::routing::post(create_ad))
360
+
.route("/manage-ad", axum::routing::get(manage_ad))
361
+
.route("/update-ad", axum::routing::post(update_ad))
362
+
.route("/delete-ad", axum::routing::post(delete_ad))
363
+
.with_state(state);
364
+
365
+
let listener = tokio::net::TcpListener::bind("127.0.0.1:8000").await.unwrap();
366
+
println!("Listening on {}", listener.local_addr().unwrap());
367
+
axum::serve(listener, app).await.unwrap();
368
+
369
+
Ok(())
370
+
}