variphx commited on
Commit
8c9f41d
·
0 Parent(s):
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ /target
2
+ /.envrc
3
+ /diesel.toml
.sqlfluff ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ [sqlfluff]
2
+ dialect=postgres
Cargo.lock ADDED
@@ -0,0 +1,1553 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.1"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
19
+
20
+ [[package]]
21
+ name = "aho-corasick"
22
+ version = "1.1.3"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
25
+ dependencies = [
26
+ "memchr",
27
+ ]
28
+
29
+ [[package]]
30
+ name = "aic-server"
31
+ version = "0.1.0"
32
+ dependencies = [
33
+ "anyhow",
34
+ "axum",
35
+ "deadpool-diesel",
36
+ "diesel",
37
+ "futures",
38
+ "serde",
39
+ "tokio",
40
+ "tower",
41
+ "tower-http",
42
+ "tracing",
43
+ "utoipa",
44
+ "utoipa-axum",
45
+ "utoipa-swagger-ui",
46
+ ]
47
+
48
+ [[package]]
49
+ name = "anyhow"
50
+ version = "1.0.99"
51
+ source = "registry+https://github.com/rust-lang/crates.io-index"
52
+ checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
53
+
54
+ [[package]]
55
+ name = "arbitrary"
56
+ version = "1.4.2"
57
+ source = "registry+https://github.com/rust-lang/crates.io-index"
58
+ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
59
+ dependencies = [
60
+ "derive_arbitrary",
61
+ ]
62
+
63
+ [[package]]
64
+ name = "axum"
65
+ version = "0.8.4"
66
+ source = "registry+https://github.com/rust-lang/crates.io-index"
67
+ checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
68
+ dependencies = [
69
+ "axum-core",
70
+ "bytes",
71
+ "form_urlencoded",
72
+ "futures-util",
73
+ "http",
74
+ "http-body",
75
+ "http-body-util",
76
+ "hyper",
77
+ "hyper-util",
78
+ "itoa",
79
+ "matchit",
80
+ "memchr",
81
+ "mime",
82
+ "percent-encoding",
83
+ "pin-project-lite",
84
+ "rustversion",
85
+ "serde",
86
+ "serde_json",
87
+ "serde_path_to_error",
88
+ "serde_urlencoded",
89
+ "sync_wrapper",
90
+ "tokio",
91
+ "tower",
92
+ "tower-layer",
93
+ "tower-service",
94
+ "tracing",
95
+ ]
96
+
97
+ [[package]]
98
+ name = "axum-core"
99
+ version = "0.5.2"
100
+ source = "registry+https://github.com/rust-lang/crates.io-index"
101
+ checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
102
+ dependencies = [
103
+ "bytes",
104
+ "futures-core",
105
+ "http",
106
+ "http-body",
107
+ "http-body-util",
108
+ "mime",
109
+ "pin-project-lite",
110
+ "rustversion",
111
+ "sync_wrapper",
112
+ "tower-layer",
113
+ "tower-service",
114
+ "tracing",
115
+ ]
116
+
117
+ [[package]]
118
+ name = "backtrace"
119
+ version = "0.3.75"
120
+ source = "registry+https://github.com/rust-lang/crates.io-index"
121
+ checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
122
+ dependencies = [
123
+ "addr2line",
124
+ "cfg-if",
125
+ "libc",
126
+ "miniz_oxide",
127
+ "object",
128
+ "rustc-demangle",
129
+ "windows-targets",
130
+ ]
131
+
132
+ [[package]]
133
+ name = "base64"
134
+ version = "0.22.1"
135
+ source = "registry+https://github.com/rust-lang/crates.io-index"
136
+ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
137
+
138
+ [[package]]
139
+ name = "bitflags"
140
+ version = "2.9.2"
141
+ source = "registry+https://github.com/rust-lang/crates.io-index"
142
+ checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29"
143
+
144
+ [[package]]
145
+ name = "block-buffer"
146
+ version = "0.10.4"
147
+ source = "registry+https://github.com/rust-lang/crates.io-index"
148
+ checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
149
+ dependencies = [
150
+ "generic-array",
151
+ ]
152
+
153
+ [[package]]
154
+ name = "bumpalo"
155
+ version = "3.19.0"
156
+ source = "registry+https://github.com/rust-lang/crates.io-index"
157
+ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
158
+
159
+ [[package]]
160
+ name = "byteorder"
161
+ version = "1.5.0"
162
+ source = "registry+https://github.com/rust-lang/crates.io-index"
163
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
164
+
165
+ [[package]]
166
+ name = "bytes"
167
+ version = "1.10.1"
168
+ source = "registry+https://github.com/rust-lang/crates.io-index"
169
+ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
170
+
171
+ [[package]]
172
+ name = "cfg-if"
173
+ version = "1.0.1"
174
+ source = "registry+https://github.com/rust-lang/crates.io-index"
175
+ checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
176
+
177
+ [[package]]
178
+ name = "cpufeatures"
179
+ version = "0.2.17"
180
+ source = "registry+https://github.com/rust-lang/crates.io-index"
181
+ checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
182
+ dependencies = [
183
+ "libc",
184
+ ]
185
+
186
+ [[package]]
187
+ name = "crc32fast"
188
+ version = "1.5.0"
189
+ source = "registry+https://github.com/rust-lang/crates.io-index"
190
+ checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
191
+ dependencies = [
192
+ "cfg-if",
193
+ ]
194
+
195
+ [[package]]
196
+ name = "crypto-common"
197
+ version = "0.1.6"
198
+ source = "registry+https://github.com/rust-lang/crates.io-index"
199
+ checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
200
+ dependencies = [
201
+ "generic-array",
202
+ "typenum",
203
+ ]
204
+
205
+ [[package]]
206
+ name = "darling"
207
+ version = "0.20.11"
208
+ source = "registry+https://github.com/rust-lang/crates.io-index"
209
+ checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
210
+ dependencies = [
211
+ "darling_core",
212
+ "darling_macro",
213
+ ]
214
+
215
+ [[package]]
216
+ name = "darling_core"
217
+ version = "0.20.11"
218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
219
+ checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
220
+ dependencies = [
221
+ "fnv",
222
+ "ident_case",
223
+ "proc-macro2",
224
+ "quote",
225
+ "strsim",
226
+ "syn",
227
+ ]
228
+
229
+ [[package]]
230
+ name = "darling_macro"
231
+ version = "0.20.11"
232
+ source = "registry+https://github.com/rust-lang/crates.io-index"
233
+ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
234
+ dependencies = [
235
+ "darling_core",
236
+ "quote",
237
+ "syn",
238
+ ]
239
+
240
+ [[package]]
241
+ name = "deadpool"
242
+ version = "0.12.2"
243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
244
+ checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f"
245
+ dependencies = [
246
+ "deadpool-runtime",
247
+ "num_cpus",
248
+ "tokio",
249
+ ]
250
+
251
+ [[package]]
252
+ name = "deadpool-diesel"
253
+ version = "0.6.1"
254
+ source = "registry+https://github.com/rust-lang/crates.io-index"
255
+ checksum = "590573e9e29c5190a5ff782136f871e6e652e35d598a349888e028693601adf1"
256
+ dependencies = [
257
+ "deadpool",
258
+ "deadpool-sync",
259
+ "diesel",
260
+ ]
261
+
262
+ [[package]]
263
+ name = "deadpool-runtime"
264
+ version = "0.1.4"
265
+ source = "registry+https://github.com/rust-lang/crates.io-index"
266
+ checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b"
267
+ dependencies = [
268
+ "tokio",
269
+ ]
270
+
271
+ [[package]]
272
+ name = "deadpool-sync"
273
+ version = "0.1.4"
274
+ source = "registry+https://github.com/rust-lang/crates.io-index"
275
+ checksum = "524bc3df0d57e98ecd022e21ba31166c2625e7d3e5bcc4510efaeeab4abcab04"
276
+ dependencies = [
277
+ "deadpool-runtime",
278
+ ]
279
+
280
+ [[package]]
281
+ name = "derive_arbitrary"
282
+ version = "1.4.2"
283
+ source = "registry+https://github.com/rust-lang/crates.io-index"
284
+ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
285
+ dependencies = [
286
+ "proc-macro2",
287
+ "quote",
288
+ "syn",
289
+ ]
290
+
291
+ [[package]]
292
+ name = "diesel"
293
+ version = "2.2.12"
294
+ source = "registry+https://github.com/rust-lang/crates.io-index"
295
+ checksum = "229850a212cd9b84d4f0290ad9d294afc0ae70fccaa8949dbe8b43ffafa1e20c"
296
+ dependencies = [
297
+ "bitflags",
298
+ "byteorder",
299
+ "diesel_derives",
300
+ "itoa",
301
+ "pq-sys",
302
+ ]
303
+
304
+ [[package]]
305
+ name = "diesel_derives"
306
+ version = "2.2.7"
307
+ source = "registry+https://github.com/rust-lang/crates.io-index"
308
+ checksum = "1b96984c469425cb577bf6f17121ecb3e4fe1e81de5d8f780dd372802858d756"
309
+ dependencies = [
310
+ "diesel_table_macro_syntax",
311
+ "dsl_auto_type",
312
+ "proc-macro2",
313
+ "quote",
314
+ "syn",
315
+ ]
316
+
317
+ [[package]]
318
+ name = "diesel_table_macro_syntax"
319
+ version = "0.2.0"
320
+ source = "registry+https://github.com/rust-lang/crates.io-index"
321
+ checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25"
322
+ dependencies = [
323
+ "syn",
324
+ ]
325
+
326
+ [[package]]
327
+ name = "digest"
328
+ version = "0.10.7"
329
+ source = "registry+https://github.com/rust-lang/crates.io-index"
330
+ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
331
+ dependencies = [
332
+ "block-buffer",
333
+ "crypto-common",
334
+ ]
335
+
336
+ [[package]]
337
+ name = "displaydoc"
338
+ version = "0.2.5"
339
+ source = "registry+https://github.com/rust-lang/crates.io-index"
340
+ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
341
+ dependencies = [
342
+ "proc-macro2",
343
+ "quote",
344
+ "syn",
345
+ ]
346
+
347
+ [[package]]
348
+ name = "dsl_auto_type"
349
+ version = "0.1.3"
350
+ source = "registry+https://github.com/rust-lang/crates.io-index"
351
+ checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b"
352
+ dependencies = [
353
+ "darling",
354
+ "either",
355
+ "heck",
356
+ "proc-macro2",
357
+ "quote",
358
+ "syn",
359
+ ]
360
+
361
+ [[package]]
362
+ name = "either"
363
+ version = "1.15.0"
364
+ source = "registry+https://github.com/rust-lang/crates.io-index"
365
+ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
366
+
367
+ [[package]]
368
+ name = "equivalent"
369
+ version = "1.0.2"
370
+ source = "registry+https://github.com/rust-lang/crates.io-index"
371
+ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
372
+
373
+ [[package]]
374
+ name = "flate2"
375
+ version = "1.1.2"
376
+ source = "registry+https://github.com/rust-lang/crates.io-index"
377
+ checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d"
378
+ dependencies = [
379
+ "crc32fast",
380
+ "libz-rs-sys",
381
+ "miniz_oxide",
382
+ ]
383
+
384
+ [[package]]
385
+ name = "fnv"
386
+ version = "1.0.7"
387
+ source = "registry+https://github.com/rust-lang/crates.io-index"
388
+ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
389
+
390
+ [[package]]
391
+ name = "form_urlencoded"
392
+ version = "1.2.1"
393
+ source = "registry+https://github.com/rust-lang/crates.io-index"
394
+ checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
395
+ dependencies = [
396
+ "percent-encoding",
397
+ ]
398
+
399
+ [[package]]
400
+ name = "futures"
401
+ version = "0.3.31"
402
+ source = "registry+https://github.com/rust-lang/crates.io-index"
403
+ checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
404
+ dependencies = [
405
+ "futures-channel",
406
+ "futures-core",
407
+ "futures-executor",
408
+ "futures-io",
409
+ "futures-sink",
410
+ "futures-task",
411
+ "futures-util",
412
+ ]
413
+
414
+ [[package]]
415
+ name = "futures-channel"
416
+ version = "0.3.31"
417
+ source = "registry+https://github.com/rust-lang/crates.io-index"
418
+ checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
419
+ dependencies = [
420
+ "futures-core",
421
+ "futures-sink",
422
+ ]
423
+
424
+ [[package]]
425
+ name = "futures-core"
426
+ version = "0.3.31"
427
+ source = "registry+https://github.com/rust-lang/crates.io-index"
428
+ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
429
+
430
+ [[package]]
431
+ name = "futures-executor"
432
+ version = "0.3.31"
433
+ source = "registry+https://github.com/rust-lang/crates.io-index"
434
+ checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
435
+ dependencies = [
436
+ "futures-core",
437
+ "futures-task",
438
+ "futures-util",
439
+ ]
440
+
441
+ [[package]]
442
+ name = "futures-io"
443
+ version = "0.3.31"
444
+ source = "registry+https://github.com/rust-lang/crates.io-index"
445
+ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
446
+
447
+ [[package]]
448
+ name = "futures-macro"
449
+ version = "0.3.31"
450
+ source = "registry+https://github.com/rust-lang/crates.io-index"
451
+ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
452
+ dependencies = [
453
+ "proc-macro2",
454
+ "quote",
455
+ "syn",
456
+ ]
457
+
458
+ [[package]]
459
+ name = "futures-sink"
460
+ version = "0.3.31"
461
+ source = "registry+https://github.com/rust-lang/crates.io-index"
462
+ checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
463
+
464
+ [[package]]
465
+ name = "futures-task"
466
+ version = "0.3.31"
467
+ source = "registry+https://github.com/rust-lang/crates.io-index"
468
+ checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
469
+
470
+ [[package]]
471
+ name = "futures-util"
472
+ version = "0.3.31"
473
+ source = "registry+https://github.com/rust-lang/crates.io-index"
474
+ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
475
+ dependencies = [
476
+ "futures-channel",
477
+ "futures-core",
478
+ "futures-io",
479
+ "futures-macro",
480
+ "futures-sink",
481
+ "futures-task",
482
+ "memchr",
483
+ "pin-project-lite",
484
+ "pin-utils",
485
+ "slab",
486
+ ]
487
+
488
+ [[package]]
489
+ name = "generic-array"
490
+ version = "0.14.7"
491
+ source = "registry+https://github.com/rust-lang/crates.io-index"
492
+ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
493
+ dependencies = [
494
+ "typenum",
495
+ "version_check",
496
+ ]
497
+
498
+ [[package]]
499
+ name = "gimli"
500
+ version = "0.31.1"
501
+ source = "registry+https://github.com/rust-lang/crates.io-index"
502
+ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
503
+
504
+ [[package]]
505
+ name = "hashbrown"
506
+ version = "0.15.5"
507
+ source = "registry+https://github.com/rust-lang/crates.io-index"
508
+ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
509
+
510
+ [[package]]
511
+ name = "heck"
512
+ version = "0.5.0"
513
+ source = "registry+https://github.com/rust-lang/crates.io-index"
514
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
515
+
516
+ [[package]]
517
+ name = "hermit-abi"
518
+ version = "0.5.2"
519
+ source = "registry+https://github.com/rust-lang/crates.io-index"
520
+ checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
521
+
522
+ [[package]]
523
+ name = "http"
524
+ version = "1.3.1"
525
+ source = "registry+https://github.com/rust-lang/crates.io-index"
526
+ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
527
+ dependencies = [
528
+ "bytes",
529
+ "fnv",
530
+ "itoa",
531
+ ]
532
+
533
+ [[package]]
534
+ name = "http-body"
535
+ version = "1.0.1"
536
+ source = "registry+https://github.com/rust-lang/crates.io-index"
537
+ checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
538
+ dependencies = [
539
+ "bytes",
540
+ "http",
541
+ ]
542
+
543
+ [[package]]
544
+ name = "http-body-util"
545
+ version = "0.1.3"
546
+ source = "registry+https://github.com/rust-lang/crates.io-index"
547
+ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
548
+ dependencies = [
549
+ "bytes",
550
+ "futures-core",
551
+ "http",
552
+ "http-body",
553
+ "pin-project-lite",
554
+ ]
555
+
556
+ [[package]]
557
+ name = "httparse"
558
+ version = "1.10.1"
559
+ source = "registry+https://github.com/rust-lang/crates.io-index"
560
+ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
561
+
562
+ [[package]]
563
+ name = "httpdate"
564
+ version = "1.0.3"
565
+ source = "registry+https://github.com/rust-lang/crates.io-index"
566
+ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
567
+
568
+ [[package]]
569
+ name = "hyper"
570
+ version = "1.6.0"
571
+ source = "registry+https://github.com/rust-lang/crates.io-index"
572
+ checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
573
+ dependencies = [
574
+ "bytes",
575
+ "futures-channel",
576
+ "futures-util",
577
+ "http",
578
+ "http-body",
579
+ "httparse",
580
+ "httpdate",
581
+ "itoa",
582
+ "pin-project-lite",
583
+ "smallvec",
584
+ "tokio",
585
+ ]
586
+
587
+ [[package]]
588
+ name = "hyper-util"
589
+ version = "0.1.16"
590
+ source = "registry+https://github.com/rust-lang/crates.io-index"
591
+ checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
592
+ dependencies = [
593
+ "bytes",
594
+ "futures-core",
595
+ "http",
596
+ "http-body",
597
+ "hyper",
598
+ "pin-project-lite",
599
+ "tokio",
600
+ "tower-service",
601
+ ]
602
+
603
+ [[package]]
604
+ name = "icu_collections"
605
+ version = "2.0.0"
606
+ source = "registry+https://github.com/rust-lang/crates.io-index"
607
+ checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
608
+ dependencies = [
609
+ "displaydoc",
610
+ "potential_utf",
611
+ "yoke",
612
+ "zerofrom",
613
+ "zerovec",
614
+ ]
615
+
616
+ [[package]]
617
+ name = "icu_locale_core"
618
+ version = "2.0.0"
619
+ source = "registry+https://github.com/rust-lang/crates.io-index"
620
+ checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
621
+ dependencies = [
622
+ "displaydoc",
623
+ "litemap",
624
+ "tinystr",
625
+ "writeable",
626
+ "zerovec",
627
+ ]
628
+
629
+ [[package]]
630
+ name = "icu_normalizer"
631
+ version = "2.0.0"
632
+ source = "registry+https://github.com/rust-lang/crates.io-index"
633
+ checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
634
+ dependencies = [
635
+ "displaydoc",
636
+ "icu_collections",
637
+ "icu_normalizer_data",
638
+ "icu_properties",
639
+ "icu_provider",
640
+ "smallvec",
641
+ "zerovec",
642
+ ]
643
+
644
+ [[package]]
645
+ name = "icu_normalizer_data"
646
+ version = "2.0.0"
647
+ source = "registry+https://github.com/rust-lang/crates.io-index"
648
+ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
649
+
650
+ [[package]]
651
+ name = "icu_properties"
652
+ version = "2.0.1"
653
+ source = "registry+https://github.com/rust-lang/crates.io-index"
654
+ checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
655
+ dependencies = [
656
+ "displaydoc",
657
+ "icu_collections",
658
+ "icu_locale_core",
659
+ "icu_properties_data",
660
+ "icu_provider",
661
+ "potential_utf",
662
+ "zerotrie",
663
+ "zerovec",
664
+ ]
665
+
666
+ [[package]]
667
+ name = "icu_properties_data"
668
+ version = "2.0.1"
669
+ source = "registry+https://github.com/rust-lang/crates.io-index"
670
+ checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
671
+
672
+ [[package]]
673
+ name = "icu_provider"
674
+ version = "2.0.0"
675
+ source = "registry+https://github.com/rust-lang/crates.io-index"
676
+ checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
677
+ dependencies = [
678
+ "displaydoc",
679
+ "icu_locale_core",
680
+ "stable_deref_trait",
681
+ "tinystr",
682
+ "writeable",
683
+ "yoke",
684
+ "zerofrom",
685
+ "zerotrie",
686
+ "zerovec",
687
+ ]
688
+
689
+ [[package]]
690
+ name = "ident_case"
691
+ version = "1.0.1"
692
+ source = "registry+https://github.com/rust-lang/crates.io-index"
693
+ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
694
+
695
+ [[package]]
696
+ name = "idna"
697
+ version = "1.0.3"
698
+ source = "registry+https://github.com/rust-lang/crates.io-index"
699
+ checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
700
+ dependencies = [
701
+ "idna_adapter",
702
+ "smallvec",
703
+ "utf8_iter",
704
+ ]
705
+
706
+ [[package]]
707
+ name = "idna_adapter"
708
+ version = "1.2.1"
709
+ source = "registry+https://github.com/rust-lang/crates.io-index"
710
+ checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
711
+ dependencies = [
712
+ "icu_normalizer",
713
+ "icu_properties",
714
+ ]
715
+
716
+ [[package]]
717
+ name = "indexmap"
718
+ version = "2.10.0"
719
+ source = "registry+https://github.com/rust-lang/crates.io-index"
720
+ checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
721
+ dependencies = [
722
+ "equivalent",
723
+ "hashbrown",
724
+ "serde",
725
+ ]
726
+
727
+ [[package]]
728
+ name = "io-uring"
729
+ version = "0.7.9"
730
+ source = "registry+https://github.com/rust-lang/crates.io-index"
731
+ checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
732
+ dependencies = [
733
+ "bitflags",
734
+ "cfg-if",
735
+ "libc",
736
+ ]
737
+
738
+ [[package]]
739
+ name = "itoa"
740
+ version = "1.0.15"
741
+ source = "registry+https://github.com/rust-lang/crates.io-index"
742
+ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
743
+
744
+ [[package]]
745
+ name = "libc"
746
+ version = "0.2.175"
747
+ source = "registry+https://github.com/rust-lang/crates.io-index"
748
+ checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
749
+
750
+ [[package]]
751
+ name = "libz-rs-sys"
752
+ version = "0.5.1"
753
+ source = "registry+https://github.com/rust-lang/crates.io-index"
754
+ checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221"
755
+ dependencies = [
756
+ "zlib-rs",
757
+ ]
758
+
759
+ [[package]]
760
+ name = "litemap"
761
+ version = "0.8.0"
762
+ source = "registry+https://github.com/rust-lang/crates.io-index"
763
+ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
764
+
765
+ [[package]]
766
+ name = "log"
767
+ version = "0.4.27"
768
+ source = "registry+https://github.com/rust-lang/crates.io-index"
769
+ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
770
+
771
+ [[package]]
772
+ name = "matchit"
773
+ version = "0.8.4"
774
+ source = "registry+https://github.com/rust-lang/crates.io-index"
775
+ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
776
+
777
+ [[package]]
778
+ name = "memchr"
779
+ version = "2.7.5"
780
+ source = "registry+https://github.com/rust-lang/crates.io-index"
781
+ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
782
+
783
+ [[package]]
784
+ name = "mime"
785
+ version = "0.3.17"
786
+ source = "registry+https://github.com/rust-lang/crates.io-index"
787
+ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
788
+
789
+ [[package]]
790
+ name = "mime_guess"
791
+ version = "2.0.5"
792
+ source = "registry+https://github.com/rust-lang/crates.io-index"
793
+ checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
794
+ dependencies = [
795
+ "mime",
796
+ "unicase",
797
+ ]
798
+
799
+ [[package]]
800
+ name = "miniz_oxide"
801
+ version = "0.8.9"
802
+ source = "registry+https://github.com/rust-lang/crates.io-index"
803
+ checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
804
+ dependencies = [
805
+ "adler2",
806
+ ]
807
+
808
+ [[package]]
809
+ name = "mio"
810
+ version = "1.0.4"
811
+ source = "registry+https://github.com/rust-lang/crates.io-index"
812
+ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
813
+ dependencies = [
814
+ "libc",
815
+ "wasi",
816
+ "windows-sys",
817
+ ]
818
+
819
+ [[package]]
820
+ name = "num_cpus"
821
+ version = "1.17.0"
822
+ source = "registry+https://github.com/rust-lang/crates.io-index"
823
+ checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
824
+ dependencies = [
825
+ "hermit-abi",
826
+ "libc",
827
+ ]
828
+
829
+ [[package]]
830
+ name = "object"
831
+ version = "0.36.7"
832
+ source = "registry+https://github.com/rust-lang/crates.io-index"
833
+ checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
834
+ dependencies = [
835
+ "memchr",
836
+ ]
837
+
838
+ [[package]]
839
+ name = "once_cell"
840
+ version = "1.21.3"
841
+ source = "registry+https://github.com/rust-lang/crates.io-index"
842
+ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
843
+
844
+ [[package]]
845
+ name = "paste"
846
+ version = "1.0.15"
847
+ source = "registry+https://github.com/rust-lang/crates.io-index"
848
+ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
849
+
850
+ [[package]]
851
+ name = "percent-encoding"
852
+ version = "2.3.1"
853
+ source = "registry+https://github.com/rust-lang/crates.io-index"
854
+ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
855
+
856
+ [[package]]
857
+ name = "pin-project-lite"
858
+ version = "0.2.16"
859
+ source = "registry+https://github.com/rust-lang/crates.io-index"
860
+ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
861
+
862
+ [[package]]
863
+ name = "pin-utils"
864
+ version = "0.1.0"
865
+ source = "registry+https://github.com/rust-lang/crates.io-index"
866
+ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
867
+
868
+ [[package]]
869
+ name = "potential_utf"
870
+ version = "0.1.2"
871
+ source = "registry+https://github.com/rust-lang/crates.io-index"
872
+ checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
873
+ dependencies = [
874
+ "zerovec",
875
+ ]
876
+
877
+ [[package]]
878
+ name = "pq-sys"
879
+ version = "0.7.2"
880
+ source = "registry+https://github.com/rust-lang/crates.io-index"
881
+ checksum = "dfd6cf44cca8f9624bc19df234fc4112873432f5fda1caff174527846d026fa9"
882
+ dependencies = [
883
+ "libc",
884
+ "vcpkg",
885
+ ]
886
+
887
+ [[package]]
888
+ name = "proc-macro2"
889
+ version = "1.0.101"
890
+ source = "registry+https://github.com/rust-lang/crates.io-index"
891
+ checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
892
+ dependencies = [
893
+ "unicode-ident",
894
+ ]
895
+
896
+ [[package]]
897
+ name = "quote"
898
+ version = "1.0.40"
899
+ source = "registry+https://github.com/rust-lang/crates.io-index"
900
+ checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
901
+ dependencies = [
902
+ "proc-macro2",
903
+ ]
904
+
905
+ [[package]]
906
+ name = "regex"
907
+ version = "1.11.1"
908
+ source = "registry+https://github.com/rust-lang/crates.io-index"
909
+ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
910
+ dependencies = [
911
+ "aho-corasick",
912
+ "memchr",
913
+ "regex-automata",
914
+ "regex-syntax",
915
+ ]
916
+
917
+ [[package]]
918
+ name = "regex-automata"
919
+ version = "0.4.9"
920
+ source = "registry+https://github.com/rust-lang/crates.io-index"
921
+ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
922
+ dependencies = [
923
+ "aho-corasick",
924
+ "memchr",
925
+ "regex-syntax",
926
+ ]
927
+
928
+ [[package]]
929
+ name = "regex-syntax"
930
+ version = "0.8.5"
931
+ source = "registry+https://github.com/rust-lang/crates.io-index"
932
+ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
933
+
934
+ [[package]]
935
+ name = "rust-embed"
936
+ version = "8.7.2"
937
+ source = "registry+https://github.com/rust-lang/crates.io-index"
938
+ checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a"
939
+ dependencies = [
940
+ "rust-embed-impl",
941
+ "rust-embed-utils",
942
+ "walkdir",
943
+ ]
944
+
945
+ [[package]]
946
+ name = "rust-embed-impl"
947
+ version = "8.7.2"
948
+ source = "registry+https://github.com/rust-lang/crates.io-index"
949
+ checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c"
950
+ dependencies = [
951
+ "proc-macro2",
952
+ "quote",
953
+ "rust-embed-utils",
954
+ "syn",
955
+ "walkdir",
956
+ ]
957
+
958
+ [[package]]
959
+ name = "rust-embed-utils"
960
+ version = "8.7.2"
961
+ source = "registry+https://github.com/rust-lang/crates.io-index"
962
+ checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594"
963
+ dependencies = [
964
+ "sha2",
965
+ "walkdir",
966
+ ]
967
+
968
+ [[package]]
969
+ name = "rustc-demangle"
970
+ version = "0.1.26"
971
+ source = "registry+https://github.com/rust-lang/crates.io-index"
972
+ checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
973
+
974
+ [[package]]
975
+ name = "rustversion"
976
+ version = "1.0.22"
977
+ source = "registry+https://github.com/rust-lang/crates.io-index"
978
+ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
979
+
980
+ [[package]]
981
+ name = "ryu"
982
+ version = "1.0.20"
983
+ source = "registry+https://github.com/rust-lang/crates.io-index"
984
+ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
985
+
986
+ [[package]]
987
+ name = "same-file"
988
+ version = "1.0.6"
989
+ source = "registry+https://github.com/rust-lang/crates.io-index"
990
+ checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
991
+ dependencies = [
992
+ "winapi-util",
993
+ ]
994
+
995
+ [[package]]
996
+ name = "serde"
997
+ version = "1.0.219"
998
+ source = "registry+https://github.com/rust-lang/crates.io-index"
999
+ checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
1000
+ dependencies = [
1001
+ "serde_derive",
1002
+ ]
1003
+
1004
+ [[package]]
1005
+ name = "serde_derive"
1006
+ version = "1.0.219"
1007
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1008
+ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
1009
+ dependencies = [
1010
+ "proc-macro2",
1011
+ "quote",
1012
+ "syn",
1013
+ ]
1014
+
1015
+ [[package]]
1016
+ name = "serde_json"
1017
+ version = "1.0.142"
1018
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1019
+ checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7"
1020
+ dependencies = [
1021
+ "itoa",
1022
+ "memchr",
1023
+ "ryu",
1024
+ "serde",
1025
+ ]
1026
+
1027
+ [[package]]
1028
+ name = "serde_path_to_error"
1029
+ version = "0.1.17"
1030
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1031
+ checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
1032
+ dependencies = [
1033
+ "itoa",
1034
+ "serde",
1035
+ ]
1036
+
1037
+ [[package]]
1038
+ name = "serde_urlencoded"
1039
+ version = "0.7.1"
1040
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1041
+ checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1042
+ dependencies = [
1043
+ "form_urlencoded",
1044
+ "itoa",
1045
+ "ryu",
1046
+ "serde",
1047
+ ]
1048
+
1049
+ [[package]]
1050
+ name = "sha2"
1051
+ version = "0.10.9"
1052
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1053
+ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
1054
+ dependencies = [
1055
+ "cfg-if",
1056
+ "cpufeatures",
1057
+ "digest",
1058
+ ]
1059
+
1060
+ [[package]]
1061
+ name = "simd-adler32"
1062
+ version = "0.3.7"
1063
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1064
+ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
1065
+
1066
+ [[package]]
1067
+ name = "slab"
1068
+ version = "0.4.11"
1069
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1070
+ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
1071
+
1072
+ [[package]]
1073
+ name = "smallvec"
1074
+ version = "1.15.1"
1075
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1076
+ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1077
+
1078
+ [[package]]
1079
+ name = "socket2"
1080
+ version = "0.6.0"
1081
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1082
+ checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
1083
+ dependencies = [
1084
+ "libc",
1085
+ "windows-sys",
1086
+ ]
1087
+
1088
+ [[package]]
1089
+ name = "stable_deref_trait"
1090
+ version = "1.2.0"
1091
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1092
+ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1093
+
1094
+ [[package]]
1095
+ name = "strsim"
1096
+ version = "0.11.1"
1097
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1098
+ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1099
+
1100
+ [[package]]
1101
+ name = "syn"
1102
+ version = "2.0.106"
1103
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1104
+ checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
1105
+ dependencies = [
1106
+ "proc-macro2",
1107
+ "quote",
1108
+ "unicode-ident",
1109
+ ]
1110
+
1111
+ [[package]]
1112
+ name = "sync_wrapper"
1113
+ version = "1.0.2"
1114
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1115
+ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1116
+
1117
+ [[package]]
1118
+ name = "synstructure"
1119
+ version = "0.13.2"
1120
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1121
+ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
1122
+ dependencies = [
1123
+ "proc-macro2",
1124
+ "quote",
1125
+ "syn",
1126
+ ]
1127
+
1128
+ [[package]]
1129
+ name = "tinystr"
1130
+ version = "0.8.1"
1131
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1132
+ checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
1133
+ dependencies = [
1134
+ "displaydoc",
1135
+ "zerovec",
1136
+ ]
1137
+
1138
+ [[package]]
1139
+ name = "tokio"
1140
+ version = "1.47.1"
1141
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1142
+ checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
1143
+ dependencies = [
1144
+ "backtrace",
1145
+ "io-uring",
1146
+ "libc",
1147
+ "mio",
1148
+ "pin-project-lite",
1149
+ "slab",
1150
+ "socket2",
1151
+ "tokio-macros",
1152
+ "windows-sys",
1153
+ ]
1154
+
1155
+ [[package]]
1156
+ name = "tokio-macros"
1157
+ version = "2.5.0"
1158
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1159
+ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1160
+ dependencies = [
1161
+ "proc-macro2",
1162
+ "quote",
1163
+ "syn",
1164
+ ]
1165
+
1166
+ [[package]]
1167
+ name = "tower"
1168
+ version = "0.5.2"
1169
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1170
+ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1171
+ dependencies = [
1172
+ "futures-core",
1173
+ "futures-util",
1174
+ "pin-project-lite",
1175
+ "sync_wrapper",
1176
+ "tokio",
1177
+ "tower-layer",
1178
+ "tower-service",
1179
+ "tracing",
1180
+ ]
1181
+
1182
+ [[package]]
1183
+ name = "tower-http"
1184
+ version = "0.6.6"
1185
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1186
+ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
1187
+ dependencies = [
1188
+ "bitflags",
1189
+ "bytes",
1190
+ "http",
1191
+ "pin-project-lite",
1192
+ "tower-layer",
1193
+ "tower-service",
1194
+ ]
1195
+
1196
+ [[package]]
1197
+ name = "tower-layer"
1198
+ version = "0.3.3"
1199
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1200
+ checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
1201
+
1202
+ [[package]]
1203
+ name = "tower-service"
1204
+ version = "0.3.3"
1205
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1206
+ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
1207
+
1208
+ [[package]]
1209
+ name = "tracing"
1210
+ version = "0.1.41"
1211
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1212
+ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
1213
+ dependencies = [
1214
+ "log",
1215
+ "pin-project-lite",
1216
+ "tracing-attributes",
1217
+ "tracing-core",
1218
+ ]
1219
+
1220
+ [[package]]
1221
+ name = "tracing-attributes"
1222
+ version = "0.1.30"
1223
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1224
+ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
1225
+ dependencies = [
1226
+ "proc-macro2",
1227
+ "quote",
1228
+ "syn",
1229
+ ]
1230
+
1231
+ [[package]]
1232
+ name = "tracing-core"
1233
+ version = "0.1.34"
1234
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1235
+ checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
1236
+ dependencies = [
1237
+ "once_cell",
1238
+ ]
1239
+
1240
+ [[package]]
1241
+ name = "typenum"
1242
+ version = "1.18.0"
1243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1244
+ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
1245
+
1246
+ [[package]]
1247
+ name = "unicase"
1248
+ version = "2.8.1"
1249
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1250
+ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
1251
+
1252
+ [[package]]
1253
+ name = "unicode-ident"
1254
+ version = "1.0.18"
1255
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1256
+ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
1257
+
1258
+ [[package]]
1259
+ name = "url"
1260
+ version = "2.5.4"
1261
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1262
+ checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
1263
+ dependencies = [
1264
+ "form_urlencoded",
1265
+ "idna",
1266
+ "percent-encoding",
1267
+ ]
1268
+
1269
+ [[package]]
1270
+ name = "utf8_iter"
1271
+ version = "1.0.4"
1272
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1273
+ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1274
+
1275
+ [[package]]
1276
+ name = "utoipa"
1277
+ version = "5.4.0"
1278
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1279
+ checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993"
1280
+ dependencies = [
1281
+ "indexmap",
1282
+ "serde",
1283
+ "serde_json",
1284
+ "utoipa-gen",
1285
+ ]
1286
+
1287
+ [[package]]
1288
+ name = "utoipa-axum"
1289
+ version = "0.2.0"
1290
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1291
+ checksum = "7c25bae5bccc842449ec0c5ddc5cbb6a3a1eaeac4503895dc105a1138f8234a0"
1292
+ dependencies = [
1293
+ "axum",
1294
+ "paste",
1295
+ "tower-layer",
1296
+ "tower-service",
1297
+ "utoipa",
1298
+ ]
1299
+
1300
+ [[package]]
1301
+ name = "utoipa-gen"
1302
+ version = "5.4.0"
1303
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1304
+ checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b"
1305
+ dependencies = [
1306
+ "proc-macro2",
1307
+ "quote",
1308
+ "syn",
1309
+ ]
1310
+
1311
+ [[package]]
1312
+ name = "utoipa-swagger-ui"
1313
+ version = "9.0.2"
1314
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1315
+ checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55"
1316
+ dependencies = [
1317
+ "axum",
1318
+ "base64",
1319
+ "mime_guess",
1320
+ "regex",
1321
+ "rust-embed",
1322
+ "serde",
1323
+ "serde_json",
1324
+ "url",
1325
+ "utoipa",
1326
+ "zip",
1327
+ ]
1328
+
1329
+ [[package]]
1330
+ name = "vcpkg"
1331
+ version = "0.2.15"
1332
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1333
+ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1334
+
1335
+ [[package]]
1336
+ name = "version_check"
1337
+ version = "0.9.5"
1338
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1339
+ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
1340
+
1341
+ [[package]]
1342
+ name = "walkdir"
1343
+ version = "2.5.0"
1344
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1345
+ checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
1346
+ dependencies = [
1347
+ "same-file",
1348
+ "winapi-util",
1349
+ ]
1350
+
1351
+ [[package]]
1352
+ name = "wasi"
1353
+ version = "0.11.1+wasi-snapshot-preview1"
1354
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1355
+ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
1356
+
1357
+ [[package]]
1358
+ name = "winapi-util"
1359
+ version = "0.1.9"
1360
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1361
+ checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
1362
+ dependencies = [
1363
+ "windows-sys",
1364
+ ]
1365
+
1366
+ [[package]]
1367
+ name = "windows-sys"
1368
+ version = "0.59.0"
1369
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1370
+ checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1371
+ dependencies = [
1372
+ "windows-targets",
1373
+ ]
1374
+
1375
+ [[package]]
1376
+ name = "windows-targets"
1377
+ version = "0.52.6"
1378
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1379
+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1380
+ dependencies = [
1381
+ "windows_aarch64_gnullvm",
1382
+ "windows_aarch64_msvc",
1383
+ "windows_i686_gnu",
1384
+ "windows_i686_gnullvm",
1385
+ "windows_i686_msvc",
1386
+ "windows_x86_64_gnu",
1387
+ "windows_x86_64_gnullvm",
1388
+ "windows_x86_64_msvc",
1389
+ ]
1390
+
1391
+ [[package]]
1392
+ name = "windows_aarch64_gnullvm"
1393
+ version = "0.52.6"
1394
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1395
+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1396
+
1397
+ [[package]]
1398
+ name = "windows_aarch64_msvc"
1399
+ version = "0.52.6"
1400
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1401
+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1402
+
1403
+ [[package]]
1404
+ name = "windows_i686_gnu"
1405
+ version = "0.52.6"
1406
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1407
+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1408
+
1409
+ [[package]]
1410
+ name = "windows_i686_gnullvm"
1411
+ version = "0.52.6"
1412
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1413
+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1414
+
1415
+ [[package]]
1416
+ name = "windows_i686_msvc"
1417
+ version = "0.52.6"
1418
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1419
+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1420
+
1421
+ [[package]]
1422
+ name = "windows_x86_64_gnu"
1423
+ version = "0.52.6"
1424
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1425
+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1426
+
1427
+ [[package]]
1428
+ name = "windows_x86_64_gnullvm"
1429
+ version = "0.52.6"
1430
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1431
+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1432
+
1433
+ [[package]]
1434
+ name = "windows_x86_64_msvc"
1435
+ version = "0.52.6"
1436
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1437
+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1438
+
1439
+ [[package]]
1440
+ name = "writeable"
1441
+ version = "0.6.1"
1442
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1443
+ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
1444
+
1445
+ [[package]]
1446
+ name = "yoke"
1447
+ version = "0.8.0"
1448
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1449
+ checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
1450
+ dependencies = [
1451
+ "serde",
1452
+ "stable_deref_trait",
1453
+ "yoke-derive",
1454
+ "zerofrom",
1455
+ ]
1456
+
1457
+ [[package]]
1458
+ name = "yoke-derive"
1459
+ version = "0.8.0"
1460
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1461
+ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
1462
+ dependencies = [
1463
+ "proc-macro2",
1464
+ "quote",
1465
+ "syn",
1466
+ "synstructure",
1467
+ ]
1468
+
1469
+ [[package]]
1470
+ name = "zerofrom"
1471
+ version = "0.1.6"
1472
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1473
+ checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
1474
+ dependencies = [
1475
+ "zerofrom-derive",
1476
+ ]
1477
+
1478
+ [[package]]
1479
+ name = "zerofrom-derive"
1480
+ version = "0.1.6"
1481
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1482
+ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
1483
+ dependencies = [
1484
+ "proc-macro2",
1485
+ "quote",
1486
+ "syn",
1487
+ "synstructure",
1488
+ ]
1489
+
1490
+ [[package]]
1491
+ name = "zerotrie"
1492
+ version = "0.2.2"
1493
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1494
+ checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
1495
+ dependencies = [
1496
+ "displaydoc",
1497
+ "yoke",
1498
+ "zerofrom",
1499
+ ]
1500
+
1501
+ [[package]]
1502
+ name = "zerovec"
1503
+ version = "0.11.4"
1504
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1505
+ checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
1506
+ dependencies = [
1507
+ "yoke",
1508
+ "zerofrom",
1509
+ "zerovec-derive",
1510
+ ]
1511
+
1512
+ [[package]]
1513
+ name = "zerovec-derive"
1514
+ version = "0.11.1"
1515
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1516
+ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
1517
+ dependencies = [
1518
+ "proc-macro2",
1519
+ "quote",
1520
+ "syn",
1521
+ ]
1522
+
1523
+ [[package]]
1524
+ name = "zip"
1525
+ version = "3.0.0"
1526
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1527
+ checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308"
1528
+ dependencies = [
1529
+ "arbitrary",
1530
+ "crc32fast",
1531
+ "flate2",
1532
+ "indexmap",
1533
+ "memchr",
1534
+ "zopfli",
1535
+ ]
1536
+
1537
+ [[package]]
1538
+ name = "zlib-rs"
1539
+ version = "0.5.1"
1540
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1541
+ checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a"
1542
+
1543
+ [[package]]
1544
+ name = "zopfli"
1545
+ version = "0.8.2"
1546
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1547
+ checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7"
1548
+ dependencies = [
1549
+ "bumpalo",
1550
+ "crc32fast",
1551
+ "log",
1552
+ "simd-adler32",
1553
+ ]
Cargo.toml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [package]
2
+ name = "aic-server"
3
+ version = "0.1.0"
4
+ edition = "2024"
5
+
6
+ [dependencies]
7
+ anyhow = "1.0.99"
8
+ axum = "0.8.4"
9
+ deadpool-diesel = { version = "0.6.1", features = ["postgres"] }
10
+ diesel = { version = "2.2.12", features = ["postgres"] }
11
+ futures = "0.3.31"
12
+ serde = { version = "1.0.219", features = ["derive"] }
13
+ tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread"] }
14
+ tower = "0.5.2"
15
+ tower-http = { version = "0.6.6", features = ["cors"] }
16
+ tracing = "0.1.41"
17
+ utoipa = "5.4.0"
18
+ utoipa-axum = "0.2.0"
19
+ utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] }
Dockerfile ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM rust:alpine AS builder
2
+ WORKDIR /app
3
+
4
+ RUN apk add build-base
5
+
6
+ COPY Cargo.toml Cargo.lock /app/
7
+ COPY src/ /app/src/
8
+ RUN cargo build --release
9
+
10
+ FROM alpine:latest
11
+ WORKDIR /app
12
+
13
+ COPY --from=builder /app/target/release/aic-server /app/server
14
+
15
+ EXPOSE 8080
16
+
17
+ CMD [ "/app/server" ]
migrations/.keep ADDED
File without changes
migrations/00000000000000_diesel_initial_setup/down.sql ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ -- This file was automatically created by Diesel to setup helper functions
2
+ -- and other internal bookkeeping. This file is safe to edit, any future
3
+ -- changes will be added to existing projects as new migrations.
4
+
5
+ DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass);
6
+ DROP FUNCTION IF EXISTS diesel_set_updated_at();
migrations/00000000000000_diesel_initial_setup/up.sql ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -- This file was automatically created by Diesel to setup helper functions
2
+ -- and other internal bookkeeping. This file is safe to edit, any future
3
+ -- changes will be added to existing projects as new migrations.
4
+
5
+
6
+
7
+
8
+ -- Sets up a trigger for the given table to automatically set a column called
9
+ -- `updated_at` whenever the row is modified (unless `updated_at` was included
10
+ -- in the modified columns)
11
+ --
12
+ -- # Example
13
+ --
14
+ -- ```sql
15
+ -- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW());
16
+ --
17
+ -- SELECT diesel_manage_updated_at('users');
18
+ -- ```
19
+ CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$
20
+ BEGIN
21
+ EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s
22
+ FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl);
23
+ END;
24
+ $$ LANGUAGE plpgsql;
25
+
26
+ CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$
27
+ BEGIN
28
+ IF (
29
+ NEW IS DISTINCT FROM OLD AND
30
+ NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
31
+ ) THEN
32
+ NEW.updated_at := current_timestamp;
33
+ END IF;
34
+ RETURN NEW;
35
+ END;
36
+ $$ LANGUAGE plpgsql;
migrations/2025-08-19-034235_create_videos/down.sql ADDED
@@ -0,0 +1 @@
 
 
1
+ DROP TABLE videos
migrations/2025-08-19-034235_create_videos/up.sql ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ CREATE TABLE videos (
2
+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
3
+ l SMALLINT NOT NULL,
4
+ v SMALLINT NOT NULL,
5
+ UNIQUE (l, v)
6
+ )
migrations/2025-08-19-041510_create_keyframes/down.sql ADDED
@@ -0,0 +1 @@
 
 
1
+ DROP TABLE keyframes
migrations/2025-08-19-041510_create_keyframes/up.sql ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ CREATE TABLE keyframes (
2
+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
3
+ video_id BIGINT NOT NULL REFERENCES videos (id),
4
+ video_related_frame_id SMALLINT NOT NULL,
5
+ video_related_frame_timestamp DOUBLE PRECISION NOT NULL,
6
+ UNIQUE (video_id, video_related_frame_id)
7
+ )
src/controllers/mod.rs ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ use utoipa_axum::router::OpenApiRouter;
2
+
3
+ use crate::states::AppState;
4
+
5
+ mod v1;
6
+
7
+ pub fn router() -> OpenApiRouter<AppState> {
8
+ OpenApiRouter::new().nest("/v1", v1::router())
9
+ }
src/controllers/v1/keyframes/mod.rs ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use axum::{
2
+ Json,
3
+ extract::{Path, State},
4
+ http::StatusCode,
5
+ };
6
+ use utoipa_axum::{router::OpenApiRouter, routes};
7
+
8
+ use crate::{
9
+ docs::OPENAPI_TAG, dtos::keyframes::KeyframeDto, services::keyframes::KeyframeService,
10
+ states::AppState,
11
+ };
12
+
13
+ pub fn router() -> OpenApiRouter<AppState> {
14
+ OpenApiRouter::new().routes(routes!(find_by_id))
15
+ }
16
+
17
+ #[utoipa::path(
18
+ get,
19
+ path = "/{id}",
20
+ tag = OPENAPI_TAG,
21
+ params(
22
+ ("id" = i64, Path, description = "Keyframe database id")
23
+ ),
24
+ responses(
25
+ (status = 200, description = "Keyframe matched by id", body = KeyframeDto)
26
+ )
27
+ )]
28
+ async fn find_by_id(
29
+ Path(id): Path<i64>,
30
+ State(state): State<AppState>,
31
+ ) -> Result<Json<KeyframeDto>, StatusCode> {
32
+ let service = KeyframeService::from(&state);
33
+ match service.find_by_id(id).await {
34
+ Ok(result) => result.map(Json).ok_or(StatusCode::NOT_FOUND),
35
+ Err(e) => {
36
+ tracing::debug!("{:?}", e);
37
+ Err(StatusCode::INTERNAL_SERVER_ERROR)
38
+ }
39
+ }
40
+ }
src/controllers/v1/mod.rs ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use utoipa_axum::router::OpenApiRouter;
2
+
3
+ use crate::states::AppState;
4
+
5
+ mod keyframes;
6
+ mod videos;
7
+
8
+ pub fn router() -> OpenApiRouter<AppState> {
9
+ OpenApiRouter::new()
10
+ .nest("/keyframes", keyframes::router())
11
+ .nest("/videos", videos::router())
12
+ }
src/controllers/v1/videos/mod.rs ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use axum::{
2
+ Json,
3
+ extract::{Path, State},
4
+ http::StatusCode,
5
+ };
6
+ use utoipa_axum::{router::OpenApiRouter, routes};
7
+
8
+ use crate::{
9
+ docs::OPENAPI_TAG, dtos::videos::VideoDto, services::videos::VideoService, states::AppState,
10
+ };
11
+
12
+ pub fn router() -> OpenApiRouter<AppState> {
13
+ OpenApiRouter::new().routes(routes!(find_by_id))
14
+ }
15
+
16
+ #[utoipa::path(
17
+ get,
18
+ path = "/{id}",
19
+ tag = OPENAPI_TAG,
20
+ params(
21
+ ("id" = i64, Path, description = "Video database id")
22
+ ),
23
+ responses(
24
+ (status = 200, description = "Video matched by id", body = VideoDto)
25
+ )
26
+ )]
27
+ async fn find_by_id(
28
+ Path(id): Path<i64>,
29
+ State(state): State<AppState>,
30
+ ) -> Result<Json<VideoDto>, StatusCode> {
31
+ let service = VideoService::from(&state);
32
+ match service.find_by_id(id).await {
33
+ Ok(result) => result.map(Json).ok_or(StatusCode::NOT_FOUND),
34
+ Err(e) => {
35
+ tracing::debug!("{:?}", e);
36
+ Err(StatusCode::INTERNAL_SERVER_ERROR)
37
+ }
38
+ }
39
+ }
src/docs/mod.rs ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use utoipa::OpenApi;
2
+
3
+ pub const OPENAPI_TAG: &str = "AIC Server";
4
+
5
+ #[derive(OpenApi)]
6
+ #[openapi(
7
+ tags(
8
+ (name = OPENAPI_TAG, description = "AIC data server API")
9
+ )
10
+ )]
11
+ pub struct ApiDoc;
src/dtos/keyframes/mod.rs ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use crate::entities::{keyframes::KeyframeEntity, videos::VideoEntity};
2
+
3
+ #[derive(Debug, Clone, serde::Serialize, utoipa::ToSchema)]
4
+ pub struct KeyframeDto {
5
+ id: i64,
6
+ path: String,
7
+ timestamp: f64,
8
+ }
9
+
10
+ impl From<(KeyframeEntity, VideoEntity)> for KeyframeDto {
11
+ fn from((keyframe, video): (KeyframeEntity, VideoEntity)) -> Self {
12
+ let id = keyframe.id();
13
+ let timestamp = keyframe.video_related_frame_timestamp();
14
+ let path = format!(
15
+ "/static/keyframes/L{}_V{:0>3}/{:0>3}.jpg",
16
+ video.l(),
17
+ video.v(),
18
+ keyframe.video_related_frame_id()
19
+ );
20
+ Self {
21
+ id,
22
+ path,
23
+ timestamp,
24
+ }
25
+ }
26
+ }
27
+
28
+ impl From<(VideoEntity, KeyframeEntity)> for KeyframeDto {
29
+ fn from((video, keyframe): (VideoEntity, KeyframeEntity)) -> Self {
30
+ Self::from((keyframe, video))
31
+ }
32
+ }
src/dtos/mod.rs ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ pub mod keyframes;
2
+ pub mod videos;
src/dtos/videos/mod.rs ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use crate::entities::videos::VideoEntity;
2
+
3
+ #[derive(Debug, Clone, serde::Serialize, utoipa::ToSchema)]
4
+ pub struct VideoDto {
5
+ id: i64,
6
+ path: String,
7
+ }
8
+
9
+ impl From<VideoEntity> for VideoDto {
10
+ fn from(value: VideoEntity) -> Self {
11
+ let path = format!("/static/videos/L{}_V{:0>3}.mp4", value.l(), value.v());
12
+ Self {
13
+ id: value.id(),
14
+ path,
15
+ }
16
+ }
17
+ }
src/entities/keyframes/mod.rs ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #[derive(Debug, Clone, diesel::Queryable, diesel::Selectable)]
2
+ #[diesel(table_name = crate::schema::keyframes)]
3
+ #[diesel(check_for_backend(diesel::pg::Pg))]
4
+ pub struct KeyframeEntity {
5
+ id: i64,
6
+ video_related_frame_id: i16,
7
+ video_related_frame_timestamp: f64,
8
+ }
9
+
10
+ impl KeyframeEntity {
11
+ pub fn id(&self) -> i64 {
12
+ self.id
13
+ }
14
+
15
+ pub fn video_related_frame_id(&self) -> i16 {
16
+ self.video_related_frame_id
17
+ }
18
+
19
+ pub fn video_related_frame_timestamp(&self) -> f64 {
20
+ self.video_related_frame_timestamp
21
+ }
22
+ }
src/entities/mod.rs ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ pub mod keyframes;
2
+ pub mod videos;
src/entities/videos/mod.rs ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #[derive(Debug, Clone, diesel::Queryable, diesel::Selectable)]
2
+ #[diesel(table_name = crate::schema::videos)]
3
+ #[diesel(check_for_backend(diesel::pg::Pg))]
4
+ pub struct VideoEntity {
5
+ id: i64,
6
+ l: i16,
7
+ v: i16,
8
+ }
9
+
10
+ impl VideoEntity {
11
+ pub fn id(&self) -> i64 {
12
+ self.id
13
+ }
14
+
15
+ pub fn l(&self) -> i16 {
16
+ self.l
17
+ }
18
+
19
+ pub fn v(&self) -> i16 {
20
+ self.v
21
+ }
22
+ }
src/main.rs ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use std::net::SocketAddr;
2
+
3
+ use axum::http::Method;
4
+ use tokio::net::TcpListener;
5
+ use tower::ServiceBuilder;
6
+ use tower_http::cors::{Any, CorsLayer};
7
+ use utoipa::OpenApi;
8
+ use utoipa_axum::router::OpenApiRouter;
9
+ use utoipa_swagger_ui::SwaggerUi;
10
+
11
+ use crate::{docs::ApiDoc, states::AppState};
12
+
13
+ mod controllers;
14
+ mod docs;
15
+ mod dtos;
16
+ mod entities;
17
+ mod repositories;
18
+ mod schema;
19
+ mod services;
20
+ mod states;
21
+
22
+ #[tokio::main]
23
+ async fn main() -> anyhow::Result<()> {
24
+ let cors = CorsLayer::new()
25
+ .allow_methods([Method::GET, Method::POST])
26
+ .allow_origin(Any);
27
+
28
+ let (router, api) = OpenApiRouter::with_openapi(ApiDoc::openapi())
29
+ .nest("/api", controllers::router())
30
+ .split_for_parts();
31
+
32
+ let app = router
33
+ .merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", api.clone()))
34
+ .layer(ServiceBuilder::new().layer(cors))
35
+ .with_state(AppState::new()?);
36
+
37
+ let listener = TcpListener::bind(SocketAddr::from(([127, 0, 0, 1], 8080))).await?;
38
+
39
+ axum::serve(listener, app).await?;
40
+
41
+ Ok(())
42
+ }
src/repositories/keyframes/mod.rs ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use deadpool_diesel::postgres::Pool;
2
+ use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper};
3
+
4
+ use crate::{
5
+ entities::{keyframes::KeyframeEntity, videos::VideoEntity},
6
+ services::keyframes::KeyframeService,
7
+ };
8
+
9
+ #[derive(Clone)]
10
+ pub struct KeyframeRepository<'a> {
11
+ pool: &'a Pool,
12
+ }
13
+
14
+ impl<'a> From<&'a KeyframeService<'_>> for KeyframeRepository<'a> {
15
+ fn from(value: &'a KeyframeService) -> Self {
16
+ Self { pool: value.pool() }
17
+ }
18
+ }
19
+
20
+ impl<'a> KeyframeRepository<'a> {
21
+ pub async fn find_by_id_and_join_video(
22
+ &self,
23
+ id: i64,
24
+ ) -> anyhow::Result<Option<(KeyframeEntity, VideoEntity)>> {
25
+ use crate::schema::keyframes::dsl as keyframe_dsl;
26
+ use crate::schema::videos::dsl as video_dsl;
27
+
28
+ let query = keyframe_dsl::keyframes
29
+ .inner_join(video_dsl::videos)
30
+ .filter(keyframe_dsl::id.eq(id))
31
+ .select((KeyframeEntity::as_select(), VideoEntity::as_select()));
32
+
33
+ let conn = self.pool.get().await?;
34
+
35
+ let results = conn
36
+ .interact(move |conn| query.load::<(KeyframeEntity, VideoEntity)>(conn))
37
+ .await
38
+ .map_err(|e| anyhow::anyhow!("{:?}", e))??;
39
+
40
+ Ok(results.into_iter().next())
41
+ }
42
+ }
src/repositories/mod.rs ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ pub mod keyframes;
2
+ pub mod videos;
src/repositories/videos/mod.rs ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use deadpool_diesel::postgres::Pool;
2
+ use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper};
3
+
4
+ use crate::{entities::videos::VideoEntity, services::videos::VideoService};
5
+
6
+ #[derive(Clone)]
7
+ pub struct VideoRepository<'a> {
8
+ pool: &'a Pool,
9
+ }
10
+
11
+ impl<'a> From<&'a VideoService<'_>> for VideoRepository<'a> {
12
+ fn from(value: &'a VideoService) -> Self {
13
+ Self { pool: value.pool() }
14
+ }
15
+ }
16
+
17
+ impl<'a> VideoRepository<'a> {
18
+ pub async fn find_by_id(&self, id: i64) -> anyhow::Result<Option<VideoEntity>> {
19
+ use crate::schema::videos::dsl;
20
+
21
+ let query = dsl::videos
22
+ .filter(dsl::id.eq(id))
23
+ .select(VideoEntity::as_select());
24
+
25
+ let conn = self.pool.get().await?;
26
+
27
+ let results = conn
28
+ .interact(move |conn| query.load::<VideoEntity>(conn))
29
+ .await
30
+ .map_err(|e| anyhow::anyhow!("{:?}", e))??;
31
+
32
+ Ok(results.into_iter().next())
33
+ }
34
+ }
src/schema.rs ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // @generated automatically by Diesel CLI.
2
+
3
+ diesel::table! {
4
+ keyframes (id) {
5
+ id -> Int8,
6
+ video_id -> Int8,
7
+ video_related_frame_id -> Int2,
8
+ video_related_frame_timestamp -> Float8,
9
+ }
10
+ }
11
+
12
+ diesel::table! {
13
+ videos (id) {
14
+ id -> Int8,
15
+ l -> Int2,
16
+ v -> Int2,
17
+ }
18
+ }
19
+
20
+ diesel::joinable!(keyframes -> videos (video_id));
21
+
22
+ diesel::allow_tables_to_appear_in_same_query!(
23
+ keyframes,
24
+ videos,
25
+ );
src/services/keyframes/mod.rs ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use deadpool_diesel::postgres::Pool;
2
+
3
+ use crate::{
4
+ dtos::keyframes::KeyframeDto, repositories::keyframes::KeyframeRepository, states::AppState,
5
+ };
6
+
7
+ #[derive(Clone, Copy)]
8
+ pub struct KeyframeService<'a> {
9
+ pool: &'a Pool,
10
+ }
11
+
12
+ impl<'a> From<&'a AppState> for KeyframeService<'a> {
13
+ fn from(value: &'a AppState) -> Self {
14
+ Self { pool: value.pool() }
15
+ }
16
+ }
17
+
18
+ impl<'a> KeyframeService<'a> {
19
+ pub const fn pool(&self) -> &'a Pool {
20
+ self.pool
21
+ }
22
+ }
23
+
24
+ impl<'a> KeyframeService<'a> {
25
+ pub async fn find_by_id(&self, id: i64) -> anyhow::Result<Option<KeyframeDto>> {
26
+ let repository = KeyframeRepository::from(self);
27
+ Ok(repository
28
+ .find_by_id_and_join_video(id)
29
+ .await?
30
+ .map(Into::into))
31
+ }
32
+ }
src/services/mod.rs ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ pub mod keyframes;
2
+ pub mod videos;
src/services/videos/mod.rs ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use deadpool_diesel::postgres::Pool;
2
+
3
+ use crate::{dtos::videos::VideoDto, repositories::videos::VideoRepository, states::AppState};
4
+
5
+ #[derive(Clone, Copy)]
6
+ pub struct VideoService<'a> {
7
+ pool: &'a Pool,
8
+ }
9
+
10
+ impl<'a> From<&'a AppState> for VideoService<'a> {
11
+ fn from(value: &'a AppState) -> Self {
12
+ Self { pool: value.pool() }
13
+ }
14
+ }
15
+
16
+ impl<'a> VideoService<'a> {
17
+ pub const fn pool(&self) -> &'a Pool {
18
+ self.pool
19
+ }
20
+ }
21
+
22
+ impl<'a> VideoService<'a> {
23
+ pub async fn find_by_id(&self, id: i64) -> anyhow::Result<Option<VideoDto>> {
24
+ let repository = VideoRepository::from(self);
25
+ Ok(repository.find_by_id(id).await?.map(Into::into))
26
+ }
27
+ }
src/states/mod.rs ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use deadpool_diesel::{
2
+ Runtime,
3
+ postgres::{Manager, Pool},
4
+ };
5
+
6
+ #[derive(Clone)]
7
+ pub struct AppState {
8
+ pool: Pool,
9
+ }
10
+
11
+ impl AppState {
12
+ pub fn new() -> anyhow::Result<Self> {
13
+ Ok(Self {
14
+ pool: Pool::builder(Manager::new(
15
+ std::env::var("DATABASE_URL")?,
16
+ Runtime::Tokio1,
17
+ ))
18
+ .build()?,
19
+ })
20
+ }
21
+ }
22
+
23
+ impl AppState {
24
+ pub fn pool(&self) -> &Pool {
25
+ &self.pool
26
+ }
27
+ }