Commit

Author:

Hash:

Timestamp:

+969 -0 +/-10 browse

Kevin Schoon [me@kevinschoon.com]

6c70103e13ed54b74e2faf20f07fc7fa8257d2d6

Mon, 24 Mar 2025 13:11:11 +0000 (2 months ago)

init
1diff --git a/.gitignore b/.gitignore
2new file mode 100644
3index 0000000..ea8c4bf
4--- /dev/null
5+++ b/.gitignore
6 @@ -0,0 +1 @@
7+ /target
8 diff --git a/Cargo.lock b/Cargo.lock
9new file mode 100644
10index 0000000..8d37510
11--- /dev/null
12+++ b/Cargo.lock
13 @@ -0,0 +1,828 @@
14+ # This file is automatically @generated by Cargo.
15+ # It is not intended for manual editing.
16+ version = 4
17+
18+ [[package]]
19+ name = "addr2line"
20+ version = "0.24.2"
21+ source = "registry+https://github.com/rust-lang/crates.io-index"
22+ checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
23+ dependencies = [
24+ "gimli",
25+ ]
26+
27+ [[package]]
28+ name = "adler2"
29+ version = "2.0.0"
30+ source = "registry+https://github.com/rust-lang/crates.io-index"
31+ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
32+
33+ [[package]]
34+ name = "aho-corasick"
35+ version = "1.1.3"
36+ source = "registry+https://github.com/rust-lang/crates.io-index"
37+ checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
38+ dependencies = [
39+ "memchr",
40+ ]
41+
42+ [[package]]
43+ name = "axum"
44+ version = "0.8.1"
45+ source = "registry+https://github.com/rust-lang/crates.io-index"
46+ checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8"
47+ dependencies = [
48+ "axum-core",
49+ "bytes",
50+ "form_urlencoded",
51+ "futures-util",
52+ "http",
53+ "http-body",
54+ "http-body-util",
55+ "hyper",
56+ "hyper-util",
57+ "itoa",
58+ "matchit",
59+ "memchr",
60+ "mime",
61+ "percent-encoding",
62+ "pin-project-lite",
63+ "rustversion",
64+ "serde",
65+ "serde_json",
66+ "serde_path_to_error",
67+ "serde_urlencoded",
68+ "sync_wrapper",
69+ "tokio",
70+ "tower",
71+ "tower-layer",
72+ "tower-service",
73+ "tracing",
74+ ]
75+
76+ [[package]]
77+ name = "axum-core"
78+ version = "0.5.0"
79+ source = "registry+https://github.com/rust-lang/crates.io-index"
80+ checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733"
81+ dependencies = [
82+ "bytes",
83+ "futures-util",
84+ "http",
85+ "http-body",
86+ "http-body-util",
87+ "mime",
88+ "pin-project-lite",
89+ "rustversion",
90+ "sync_wrapper",
91+ "tower-layer",
92+ "tower-service",
93+ "tracing",
94+ ]
95+
96+ [[package]]
97+ name = "backtrace"
98+ version = "0.3.74"
99+ source = "registry+https://github.com/rust-lang/crates.io-index"
100+ checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
101+ dependencies = [
102+ "addr2line",
103+ "cfg-if",
104+ "libc",
105+ "miniz_oxide",
106+ "object",
107+ "rustc-demangle",
108+ "windows-targets",
109+ ]
110+
111+ [[package]]
112+ name = "bytes"
113+ version = "1.10.1"
114+ source = "registry+https://github.com/rust-lang/crates.io-index"
115+ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
116+
117+ [[package]]
118+ name = "cfg-if"
119+ version = "1.0.0"
120+ source = "registry+https://github.com/rust-lang/crates.io-index"
121+ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
122+
123+ [[package]]
124+ name = "darling"
125+ version = "0.20.10"
126+ source = "registry+https://github.com/rust-lang/crates.io-index"
127+ checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
128+ dependencies = [
129+ "darling_core",
130+ "darling_macro",
131+ ]
132+
133+ [[package]]
134+ name = "darling_core"
135+ version = "0.20.10"
136+ source = "registry+https://github.com/rust-lang/crates.io-index"
137+ checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
138+ dependencies = [
139+ "fnv",
140+ "ident_case",
141+ "proc-macro2",
142+ "quote",
143+ "strsim",
144+ "syn",
145+ ]
146+
147+ [[package]]
148+ name = "darling_macro"
149+ version = "0.20.10"
150+ source = "registry+https://github.com/rust-lang/crates.io-index"
151+ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
152+ dependencies = [
153+ "darling_core",
154+ "quote",
155+ "syn",
156+ ]
157+
158+ [[package]]
159+ name = "derive_builder"
160+ version = "0.20.2"
161+ source = "registry+https://github.com/rust-lang/crates.io-index"
162+ checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
163+ dependencies = [
164+ "derive_builder_macro",
165+ ]
166+
167+ [[package]]
168+ name = "derive_builder_core"
169+ version = "0.20.2"
170+ source = "registry+https://github.com/rust-lang/crates.io-index"
171+ checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
172+ dependencies = [
173+ "darling",
174+ "proc-macro2",
175+ "quote",
176+ "syn",
177+ ]
178+
179+ [[package]]
180+ name = "derive_builder_macro"
181+ version = "0.20.2"
182+ source = "registry+https://github.com/rust-lang/crates.io-index"
183+ checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
184+ dependencies = [
185+ "derive_builder_core",
186+ "syn",
187+ ]
188+
189+ [[package]]
190+ name = "fnv"
191+ version = "1.0.7"
192+ source = "registry+https://github.com/rust-lang/crates.io-index"
193+ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
194+
195+ [[package]]
196+ name = "form_urlencoded"
197+ version = "1.2.1"
198+ source = "registry+https://github.com/rust-lang/crates.io-index"
199+ checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
200+ dependencies = [
201+ "percent-encoding",
202+ ]
203+
204+ [[package]]
205+ name = "futures-channel"
206+ version = "0.3.31"
207+ source = "registry+https://github.com/rust-lang/crates.io-index"
208+ checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
209+ dependencies = [
210+ "futures-core",
211+ ]
212+
213+ [[package]]
214+ name = "futures-core"
215+ version = "0.3.31"
216+ source = "registry+https://github.com/rust-lang/crates.io-index"
217+ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
218+
219+ [[package]]
220+ name = "futures-task"
221+ version = "0.3.31"
222+ source = "registry+https://github.com/rust-lang/crates.io-index"
223+ checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
224+
225+ [[package]]
226+ name = "futures-util"
227+ version = "0.3.31"
228+ source = "registry+https://github.com/rust-lang/crates.io-index"
229+ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
230+ dependencies = [
231+ "futures-core",
232+ "futures-task",
233+ "pin-project-lite",
234+ "pin-utils",
235+ ]
236+
237+ [[package]]
238+ name = "getset"
239+ version = "0.1.5"
240+ source = "registry+https://github.com/rust-lang/crates.io-index"
241+ checksum = "f3586f256131df87204eb733da72e3d3eb4f343c639f4b7be279ac7c48baeafe"
242+ dependencies = [
243+ "proc-macro-error2",
244+ "proc-macro2",
245+ "quote",
246+ "syn",
247+ ]
248+
249+ [[package]]
250+ name = "gimli"
251+ version = "0.31.1"
252+ source = "registry+https://github.com/rust-lang/crates.io-index"
253+ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
254+
255+ [[package]]
256+ name = "heck"
257+ version = "0.5.0"
258+ source = "registry+https://github.com/rust-lang/crates.io-index"
259+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
260+
261+ [[package]]
262+ name = "http"
263+ version = "1.3.1"
264+ source = "registry+https://github.com/rust-lang/crates.io-index"
265+ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
266+ dependencies = [
267+ "bytes",
268+ "fnv",
269+ "itoa",
270+ ]
271+
272+ [[package]]
273+ name = "http-body"
274+ version = "1.0.1"
275+ source = "registry+https://github.com/rust-lang/crates.io-index"
276+ checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
277+ dependencies = [
278+ "bytes",
279+ "http",
280+ ]
281+
282+ [[package]]
283+ name = "http-body-util"
284+ version = "0.1.3"
285+ source = "registry+https://github.com/rust-lang/crates.io-index"
286+ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
287+ dependencies = [
288+ "bytes",
289+ "futures-core",
290+ "http",
291+ "http-body",
292+ "pin-project-lite",
293+ ]
294+
295+ [[package]]
296+ name = "httparse"
297+ version = "1.10.1"
298+ source = "registry+https://github.com/rust-lang/crates.io-index"
299+ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
300+
301+ [[package]]
302+ name = "httpdate"
303+ version = "1.0.3"
304+ source = "registry+https://github.com/rust-lang/crates.io-index"
305+ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
306+
307+ [[package]]
308+ name = "hyper"
309+ version = "1.6.0"
310+ source = "registry+https://github.com/rust-lang/crates.io-index"
311+ checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
312+ dependencies = [
313+ "bytes",
314+ "futures-channel",
315+ "futures-util",
316+ "http",
317+ "http-body",
318+ "httparse",
319+ "httpdate",
320+ "itoa",
321+ "pin-project-lite",
322+ "smallvec",
323+ "tokio",
324+ ]
325+
326+ [[package]]
327+ name = "hyper-util"
328+ version = "0.1.10"
329+ source = "registry+https://github.com/rust-lang/crates.io-index"
330+ checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
331+ dependencies = [
332+ "bytes",
333+ "futures-util",
334+ "http",
335+ "http-body",
336+ "hyper",
337+ "pin-project-lite",
338+ "tokio",
339+ "tower-service",
340+ ]
341+
342+ [[package]]
343+ name = "ident_case"
344+ version = "1.0.1"
345+ source = "registry+https://github.com/rust-lang/crates.io-index"
346+ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
347+
348+ [[package]]
349+ name = "itoa"
350+ version = "1.0.15"
351+ source = "registry+https://github.com/rust-lang/crates.io-index"
352+ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
353+
354+ [[package]]
355+ name = "libc"
356+ version = "0.2.171"
357+ source = "registry+https://github.com/rust-lang/crates.io-index"
358+ checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
359+
360+ [[package]]
361+ name = "log"
362+ version = "0.4.26"
363+ source = "registry+https://github.com/rust-lang/crates.io-index"
364+ checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
365+
366+ [[package]]
367+ name = "matchit"
368+ version = "0.8.4"
369+ source = "registry+https://github.com/rust-lang/crates.io-index"
370+ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
371+
372+ [[package]]
373+ name = "memchr"
374+ version = "2.7.4"
375+ source = "registry+https://github.com/rust-lang/crates.io-index"
376+ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
377+
378+ [[package]]
379+ name = "mime"
380+ version = "0.3.17"
381+ source = "registry+https://github.com/rust-lang/crates.io-index"
382+ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
383+
384+ [[package]]
385+ name = "miniz_oxide"
386+ version = "0.8.5"
387+ source = "registry+https://github.com/rust-lang/crates.io-index"
388+ checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
389+ dependencies = [
390+ "adler2",
391+ ]
392+
393+ [[package]]
394+ name = "mio"
395+ version = "1.0.3"
396+ source = "registry+https://github.com/rust-lang/crates.io-index"
397+ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
398+ dependencies = [
399+ "libc",
400+ "wasi",
401+ "windows-sys",
402+ ]
403+
404+ [[package]]
405+ name = "object"
406+ version = "0.36.7"
407+ source = "registry+https://github.com/rust-lang/crates.io-index"
408+ checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
409+ dependencies = [
410+ "memchr",
411+ ]
412+
413+ [[package]]
414+ name = "oci-spec"
415+ version = "0.7.1"
416+ source = "registry+https://github.com/rust-lang/crates.io-index"
417+ checksum = "da406e58efe2eb5986a6139626d611ce426e5324a824133d76367c765cf0b882"
418+ dependencies = [
419+ "derive_builder",
420+ "getset",
421+ "regex",
422+ "serde",
423+ "serde_json",
424+ "strum",
425+ "strum_macros",
426+ "thiserror",
427+ ]
428+
429+ [[package]]
430+ name = "once_cell"
431+ version = "1.21.1"
432+ source = "registry+https://github.com/rust-lang/crates.io-index"
433+ checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
434+
435+ [[package]]
436+ name = "papyri-axum"
437+ version = "0.1.0"
438+ dependencies = [
439+ "axum",
440+ "oci-spec",
441+ ]
442+
443+ [[package]]
444+ name = "papyri-common"
445+ version = "0.1.0"
446+
447+ [[package]]
448+ name = "percent-encoding"
449+ version = "2.3.1"
450+ source = "registry+https://github.com/rust-lang/crates.io-index"
451+ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
452+
453+ [[package]]
454+ name = "pin-project-lite"
455+ version = "0.2.16"
456+ source = "registry+https://github.com/rust-lang/crates.io-index"
457+ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
458+
459+ [[package]]
460+ name = "pin-utils"
461+ version = "0.1.0"
462+ source = "registry+https://github.com/rust-lang/crates.io-index"
463+ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
464+
465+ [[package]]
466+ name = "proc-macro-error-attr2"
467+ version = "2.0.0"
468+ source = "registry+https://github.com/rust-lang/crates.io-index"
469+ checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
470+ dependencies = [
471+ "proc-macro2",
472+ "quote",
473+ ]
474+
475+ [[package]]
476+ name = "proc-macro-error2"
477+ version = "2.0.1"
478+ source = "registry+https://github.com/rust-lang/crates.io-index"
479+ checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
480+ dependencies = [
481+ "proc-macro-error-attr2",
482+ "proc-macro2",
483+ "quote",
484+ "syn",
485+ ]
486+
487+ [[package]]
488+ name = "proc-macro2"
489+ version = "1.0.94"
490+ source = "registry+https://github.com/rust-lang/crates.io-index"
491+ checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
492+ dependencies = [
493+ "unicode-ident",
494+ ]
495+
496+ [[package]]
497+ name = "quote"
498+ version = "1.0.40"
499+ source = "registry+https://github.com/rust-lang/crates.io-index"
500+ checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
501+ dependencies = [
502+ "proc-macro2",
503+ ]
504+
505+ [[package]]
506+ name = "regex"
507+ version = "1.11.1"
508+ source = "registry+https://github.com/rust-lang/crates.io-index"
509+ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
510+ dependencies = [
511+ "aho-corasick",
512+ "memchr",
513+ "regex-automata",
514+ "regex-syntax",
515+ ]
516+
517+ [[package]]
518+ name = "regex-automata"
519+ version = "0.4.9"
520+ source = "registry+https://github.com/rust-lang/crates.io-index"
521+ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
522+ dependencies = [
523+ "aho-corasick",
524+ "memchr",
525+ "regex-syntax",
526+ ]
527+
528+ [[package]]
529+ name = "regex-syntax"
530+ version = "0.8.5"
531+ source = "registry+https://github.com/rust-lang/crates.io-index"
532+ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
533+
534+ [[package]]
535+ name = "rustc-demangle"
536+ version = "0.1.24"
537+ source = "registry+https://github.com/rust-lang/crates.io-index"
538+ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
539+
540+ [[package]]
541+ name = "rustversion"
542+ version = "1.0.20"
543+ source = "registry+https://github.com/rust-lang/crates.io-index"
544+ checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
545+
546+ [[package]]
547+ name = "ryu"
548+ version = "1.0.20"
549+ source = "registry+https://github.com/rust-lang/crates.io-index"
550+ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
551+
552+ [[package]]
553+ name = "serde"
554+ version = "1.0.219"
555+ source = "registry+https://github.com/rust-lang/crates.io-index"
556+ checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
557+ dependencies = [
558+ "serde_derive",
559+ ]
560+
561+ [[package]]
562+ name = "serde_derive"
563+ version = "1.0.219"
564+ source = "registry+https://github.com/rust-lang/crates.io-index"
565+ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
566+ dependencies = [
567+ "proc-macro2",
568+ "quote",
569+ "syn",
570+ ]
571+
572+ [[package]]
573+ name = "serde_json"
574+ version = "1.0.140"
575+ source = "registry+https://github.com/rust-lang/crates.io-index"
576+ checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
577+ dependencies = [
578+ "itoa",
579+ "memchr",
580+ "ryu",
581+ "serde",
582+ ]
583+
584+ [[package]]
585+ name = "serde_path_to_error"
586+ version = "0.1.17"
587+ source = "registry+https://github.com/rust-lang/crates.io-index"
588+ checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
589+ dependencies = [
590+ "itoa",
591+ "serde",
592+ ]
593+
594+ [[package]]
595+ name = "serde_urlencoded"
596+ version = "0.7.1"
597+ source = "registry+https://github.com/rust-lang/crates.io-index"
598+ checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
599+ dependencies = [
600+ "form_urlencoded",
601+ "itoa",
602+ "ryu",
603+ "serde",
604+ ]
605+
606+ [[package]]
607+ name = "smallvec"
608+ version = "1.14.0"
609+ source = "registry+https://github.com/rust-lang/crates.io-index"
610+ checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
611+
612+ [[package]]
613+ name = "socket2"
614+ version = "0.5.8"
615+ source = "registry+https://github.com/rust-lang/crates.io-index"
616+ checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
617+ dependencies = [
618+ "libc",
619+ "windows-sys",
620+ ]
621+
622+ [[package]]
623+ name = "strsim"
624+ version = "0.11.1"
625+ source = "registry+https://github.com/rust-lang/crates.io-index"
626+ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
627+
628+ [[package]]
629+ name = "strum"
630+ version = "0.26.3"
631+ source = "registry+https://github.com/rust-lang/crates.io-index"
632+ checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
633+
634+ [[package]]
635+ name = "strum_macros"
636+ version = "0.26.4"
637+ source = "registry+https://github.com/rust-lang/crates.io-index"
638+ checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
639+ dependencies = [
640+ "heck",
641+ "proc-macro2",
642+ "quote",
643+ "rustversion",
644+ "syn",
645+ ]
646+
647+ [[package]]
648+ name = "syn"
649+ version = "2.0.100"
650+ source = "registry+https://github.com/rust-lang/crates.io-index"
651+ checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
652+ dependencies = [
653+ "proc-macro2",
654+ "quote",
655+ "unicode-ident",
656+ ]
657+
658+ [[package]]
659+ name = "sync_wrapper"
660+ version = "1.0.2"
661+ source = "registry+https://github.com/rust-lang/crates.io-index"
662+ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
663+
664+ [[package]]
665+ name = "thiserror"
666+ version = "2.0.12"
667+ source = "registry+https://github.com/rust-lang/crates.io-index"
668+ checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
669+ dependencies = [
670+ "thiserror-impl",
671+ ]
672+
673+ [[package]]
674+ name = "thiserror-impl"
675+ version = "2.0.12"
676+ source = "registry+https://github.com/rust-lang/crates.io-index"
677+ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
678+ dependencies = [
679+ "proc-macro2",
680+ "quote",
681+ "syn",
682+ ]
683+
684+ [[package]]
685+ name = "tokio"
686+ version = "1.44.1"
687+ source = "registry+https://github.com/rust-lang/crates.io-index"
688+ checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
689+ dependencies = [
690+ "backtrace",
691+ "libc",
692+ "mio",
693+ "pin-project-lite",
694+ "socket2",
695+ "tokio-macros",
696+ "windows-sys",
697+ ]
698+
699+ [[package]]
700+ name = "tokio-macros"
701+ version = "2.5.0"
702+ source = "registry+https://github.com/rust-lang/crates.io-index"
703+ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
704+ dependencies = [
705+ "proc-macro2",
706+ "quote",
707+ "syn",
708+ ]
709+
710+ [[package]]
711+ name = "tower"
712+ version = "0.5.2"
713+ source = "registry+https://github.com/rust-lang/crates.io-index"
714+ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
715+ dependencies = [
716+ "futures-core",
717+ "futures-util",
718+ "pin-project-lite",
719+ "sync_wrapper",
720+ "tokio",
721+ "tower-layer",
722+ "tower-service",
723+ "tracing",
724+ ]
725+
726+ [[package]]
727+ name = "tower-layer"
728+ version = "0.3.3"
729+ source = "registry+https://github.com/rust-lang/crates.io-index"
730+ checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
731+
732+ [[package]]
733+ name = "tower-service"
734+ version = "0.3.3"
735+ source = "registry+https://github.com/rust-lang/crates.io-index"
736+ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
737+
738+ [[package]]
739+ name = "tracing"
740+ version = "0.1.41"
741+ source = "registry+https://github.com/rust-lang/crates.io-index"
742+ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
743+ dependencies = [
744+ "log",
745+ "pin-project-lite",
746+ "tracing-core",
747+ ]
748+
749+ [[package]]
750+ name = "tracing-core"
751+ version = "0.1.33"
752+ source = "registry+https://github.com/rust-lang/crates.io-index"
753+ checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
754+ dependencies = [
755+ "once_cell",
756+ ]
757+
758+ [[package]]
759+ name = "unicode-ident"
760+ version = "1.0.18"
761+ source = "registry+https://github.com/rust-lang/crates.io-index"
762+ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
763+
764+ [[package]]
765+ name = "wasi"
766+ version = "0.11.0+wasi-snapshot-preview1"
767+ source = "registry+https://github.com/rust-lang/crates.io-index"
768+ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
769+
770+ [[package]]
771+ name = "windows-sys"
772+ version = "0.52.0"
773+ source = "registry+https://github.com/rust-lang/crates.io-index"
774+ checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
775+ dependencies = [
776+ "windows-targets",
777+ ]
778+
779+ [[package]]
780+ name = "windows-targets"
781+ version = "0.52.6"
782+ source = "registry+https://github.com/rust-lang/crates.io-index"
783+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
784+ dependencies = [
785+ "windows_aarch64_gnullvm",
786+ "windows_aarch64_msvc",
787+ "windows_i686_gnu",
788+ "windows_i686_gnullvm",
789+ "windows_i686_msvc",
790+ "windows_x86_64_gnu",
791+ "windows_x86_64_gnullvm",
792+ "windows_x86_64_msvc",
793+ ]
794+
795+ [[package]]
796+ name = "windows_aarch64_gnullvm"
797+ version = "0.52.6"
798+ source = "registry+https://github.com/rust-lang/crates.io-index"
799+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
800+
801+ [[package]]
802+ name = "windows_aarch64_msvc"
803+ version = "0.52.6"
804+ source = "registry+https://github.com/rust-lang/crates.io-index"
805+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
806+
807+ [[package]]
808+ name = "windows_i686_gnu"
809+ version = "0.52.6"
810+ source = "registry+https://github.com/rust-lang/crates.io-index"
811+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
812+
813+ [[package]]
814+ name = "windows_i686_gnullvm"
815+ version = "0.52.6"
816+ source = "registry+https://github.com/rust-lang/crates.io-index"
817+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
818+
819+ [[package]]
820+ name = "windows_i686_msvc"
821+ version = "0.52.6"
822+ source = "registry+https://github.com/rust-lang/crates.io-index"
823+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
824+
825+ [[package]]
826+ name = "windows_x86_64_gnu"
827+ version = "0.52.6"
828+ source = "registry+https://github.com/rust-lang/crates.io-index"
829+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
830+
831+ [[package]]
832+ name = "windows_x86_64_gnullvm"
833+ version = "0.52.6"
834+ source = "registry+https://github.com/rust-lang/crates.io-index"
835+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
836+
837+ [[package]]
838+ name = "windows_x86_64_msvc"
839+ version = "0.52.6"
840+ source = "registry+https://github.com/rust-lang/crates.io-index"
841+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
842 diff --git a/Cargo.toml b/Cargo.toml
843new file mode 100644
844index 0000000..05a59c6
845--- /dev/null
846+++ b/Cargo.toml
847 @@ -0,0 +1,26 @@
848+ [workspace]
849+ resolver = "2"
850+ members = [
851+ "papyri-common",
852+ "papyri-axum",
853+ ]
854+
855+ # [workspace.dependencies]
856+ # async-trait = "0.1.86"
857+ # bytes = "1.10.0"
858+ # clap = { version = "4.5.20", features = ["derive"] }
859+ # clap_complete = { version = "4.4.10" }
860+ # serde = { version = "1.0", features = ["derive"] }
861+ # git2 = "0.19.0"
862+ # rand = "0.8.5"
863+ # thiserror = "2.0.11"
864+ # tracing = { version = "0.1.41", features=["log"] }
865+ # toml = "0.8.20"
866+ # futures = "0.3.31"
867+ # futures-util = "0.3.31"
868+ # sqlx = { version = "0.8.3", features = [ "runtime-tokio-rustls", "sqlite", "macros", "time" ] }
869+ # tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
870+ #
871+ # tokio = { version = "1.43.0", features = ["full"] }
872+ # tokio-util = { version = "0.7.13", features = ["io", "compat"] }
873+ # tokio-stream = "0.1.17"
874 diff --git a/README.md b/README.md
875new file mode 100644
876index 0000000..98ba0f3
877--- /dev/null
878+++ b/README.md
879 @@ -0,0 +1,5 @@
880+ # Papyri
881+
882+ Papyri is a [OCI Distribution Spec](https://github.com/opencontainers/distribution-spec)
883+ compliant container registry that is usable as a standalone application or
884+ consumable as a Rust library.
885 diff --git a/papyri-axum/Cargo.toml b/papyri-axum/Cargo.toml
886new file mode 100644
887index 0000000..4b83733
888--- /dev/null
889+++ b/papyri-axum/Cargo.toml
890 @@ -0,0 +1,8 @@
891+ [package]
892+ name = "papyri-axum"
893+ version = "0.1.0"
894+ edition = "2024"
895+
896+ [dependencies]
897+ axum = "0.8.1"
898+ oci-spec = "0.7.1"
899 diff --git a/papyri-axum/src/lib.rs b/papyri-axum/src/lib.rs
900new file mode 100644
901index 0000000..6a664ab
902--- /dev/null
903+++ b/papyri-axum/src/lib.rs
904 @@ -0,0 +1 @@
905+ pub mod routes;
906 diff --git a/papyri-axum/src/routes.rs b/papyri-axum/src/routes.rs
907new file mode 100644
908index 0000000..e5509a8
909--- /dev/null
910+++ b/papyri-axum/src/routes.rs
911 @@ -0,0 +1,91 @@
912+ use axum::Json;
913+ use axum::extract::{MatchedPath, Request};
914+ use axum::{Router, routing::get};
915+ use oci_spec::image::{ImageManifest, ImageIndexBuilder};
916+ use serde_json::json;
917+ use tower_http::trace::TraceLayer;
918+ use tracing::info_span;
919+ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
920+
921+ pub async fn handler_index(req: Request) -> Json<serde_json::Value> {
922+ req.headers().iter().for_each(|h| {
923+ let header_value = h.1.to_str().ok();
924+ tracing::info!(key = h.0.as_str(), value = header_value);
925+ });
926+ Json(json!({}))
927+ }
928+
929+ pub async fn handler_manifest_index() -> Json<serde_json::Value> {
930+ }
931+
932+ // async fn serve() {
933+ // let app = Router::new()
934+ // .route("/", get(|| async { "Hello, World!" }))
935+ // .route("/v2", get(handler_index))
936+ // .route("/v2/", get(handler_index))
937+ // .layer(
938+ // TraceLayer::new_for_http().make_span_with(|request: &Request<_>| {
939+ // // Log the matched route's path (with placeholders not filled in).
940+ // // Use request.uri() or OriginalUri if you want the real path.
941+ // let matched_path = request
942+ // .extensions()
943+ // .get::<MatchedPath>()
944+ // .map(MatchedPath::as_str);
945+ //
946+ // let actual_path = request.uri().path();
947+ //
948+ // info_span!(
949+ // "http_request",
950+ // method = ?request.method(),
951+ // matched_path,
952+ // actual_path,
953+ // some_other_field = tracing::field::Empty,
954+ // )
955+ // }), // .on_request(|_request: &Request<_>, _span: &Span| {
956+ // // // You can use `_span.record("some_other_field", value)` in one of these
957+ // // // closures to attach a value to the initially empty field in the info_span
958+ // // // created above.
959+ // // })
960+ // // .on_response(|_response: &Response, _latency: Duration, _span: &Span| {
961+ // // // ...
962+ // // })
963+ // // .on_body_chunk(|_chunk: &Bytes, _latency: Duration, _span: &Span| {
964+ // // // ...
965+ // // })
966+ // // .on_eos(
967+ // // |_trailers: Option<&HeaderMap>, _stream_duration: Duration, _span: &Span| {
968+ // // // ...
969+ // // },
970+ // // )
971+ // // .on_failure(
972+ // // |_error: ServerErrorsFailureClass, _latency: Duration, _span: &Span| {
973+ // // // ...
974+ // // },
975+ // // ),
976+ // );
977+ //
978+ // // run our app with hyper, listening globally on port 3000
979+ // tracing::info!("Listening @ 0.0.0.0:3000");
980+ // let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
981+ // axum::serve(listener, app).await.unwrap();
982+ // }
983+ //
984+ // #[tokio::main]
985+ // async fn main() {
986+ // tracing_subscriber::registry()
987+ // .with(
988+ // tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
989+ // // axum logs rejections from built-in extractors with the `axum::rejection`
990+ // // target, at `TRACE` level. `axum::rejection=trace` enables showing those events
991+ // format!(
992+ // "{}=debug,tower_http=debug,axum::rejection=trace",
993+ // env!("CARGO_CRATE_NAME")
994+ // )
995+ // .into()
996+ // }),
997+ // )
998+ // .with(tracing_subscriber::fmt::layer())
999+ // .init();
1000+ // serve().await;
1001+ // }
1002+
1003 diff --git a/papyri-axum/src/storage.rs b/papyri-axum/src/storage.rs
1004new file mode 100644
1005index 0000000..e69de29
1006--- /dev/null
1007+++ b/papyri-axum/src/storage.rs
1008 diff --git a/papyri-common/Cargo.toml b/papyri-common/Cargo.toml
1009new file mode 100644
1010index 0000000..6e65a6c
1011--- /dev/null
1012+++ b/papyri-common/Cargo.toml
1013 @@ -0,0 +1,6 @@
1014+ [package]
1015+ name = "papyri-common"
1016+ version = "0.1.0"
1017+ edition = "2024"
1018+
1019+ [dependencies]
1020 diff --git a/papyri-common/src/main.rs b/papyri-common/src/main.rs
1021new file mode 100644
1022index 0000000..e7a11a9
1023--- /dev/null
1024+++ b/papyri-common/src/main.rs
1025 @@ -0,0 +1,3 @@
1026+ fn main() {
1027+ println!("Hello, world!");
1028+ }