Constellation, Spacedust, Slingshot, UFOs: atproto crates and services for microcosm

cachey

+516 -68
Cargo.lock
···
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"once_cell",
"version_check",
"zerocopy 0.7.35",
···
checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
[[package]]
name = "arrayvec"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"proc-macro2",
"quote",
"serde",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "async-compression"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
name = "async-trait"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "autocfg"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"regex",
"rustc-hash 1.1.0",
"shlex",
-
"syn",
"which",
]
···
"regex",
"rustc-hash 1.1.0",
"shlex",
-
"syn",
]
[[package]]
···
"regex",
"rustc-hash 2.1.1",
"shlex",
-
"syn",
]
[[package]]
···
[[package]]
name = "clap"
-
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
dependencies = [
"clap_builder",
"clap_derive",
···
[[package]]
name = "clap_builder"
-
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
-
"strsim",
]
[[package]]
name = "clap_derive"
-
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
dependencies = [
"heck",
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "colorchoice"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"clap",
"ctrlc",
"flume",
-
"fs4",
"headers-accept",
"links",
"mediatype",
···
[[package]]
name = "darling"
version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
-
"darling_core",
-
"darling_macro",
]
[[package]]
···
"ident_case",
"proc-macro2",
"quote",
-
"strsim",
-
"syn",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
-
"darling_core",
"quote",
-
"syn",
]
[[package]]
···
checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f"
dependencies = [
"data-encoding",
-
"syn",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
dependencies = [
-
"darling",
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
checksum = "c0d05e1c0dbad51b52c38bda7adceef61b9efc2baf04acfe8726a8c4630a6f57"
[[package]]
name = "dropshot"
version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"semver",
"serde",
"serde_tokenstream",
-
"syn",
]
[[package]]
···
"heck",
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
"once_cell",
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
dependencies = [
"spin",
]
···
]
[[package]]
name = "fs4"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
name = "fs_extra"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
···
"libc",
"percent-encoding",
"pin-project-lite",
-
"socket2",
"system-configuration",
"tokio",
"tower-service",
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "ipconfig"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
dependencies = [
-
"socket2",
"widestring",
"windows-sys 0.48.0",
"winreg",
···
]
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
[[package]]
name = "libc"
-
version = "0.2.171"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
[[package]]
name = "libfuzzer-sys"
···
]
[[package]]
name = "lz4-sys"
version = "1.11.1+lz4-1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
name = "match_cfg"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "metrics"
···
]
[[package]]
name = "moka"
version = "0.12.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
name = "native-tls"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "overload"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"elliptic-curve",
"primeorder",
]
[[package]]
name = "parking"
···
"pest_meta",
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "pin-project-lite"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55"
dependencies = [
"proc-macro2",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
"proc-macro2",
"quote",
"serde_derive_internals",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
[[package]]
name = "serde_json"
-
version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
···
"proc-macro2",
"quote",
"serde",
-
"syn",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e"
dependencies = [
-
"darling",
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
]
[[package]]
name = "slog"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
name = "spacedust"
version = "0.1.0"
dependencies = [
···
[[package]]
name = "strsim"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
···
[[package]]
name = "syn"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
[[package]]
name = "tokio"
-
version = "1.45.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
-
"socket2",
"tokio-macros",
-
"windows-sys 0.52.0",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"log",
"pin-project-lite",
"tracing-core",
]
[[package]]
name = "tracing-core"
version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
"sha1",
"thiserror 2.0.12",
"utf-8",
]
[[package]]
···
"log",
"proc-macro2",
"quote",
-
"syn",
"wasm-bindgen-shared",
]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
"synstructure",
]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
"synstructure",
]
···
dependencies = [
"proc-macro2",
"quote",
-
"syn",
]
[[package]]
···
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
+
"getrandom 0.2.15",
"once_cell",
"version_check",
"zerocopy 0.7.35",
···
checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
[[package]]
+
name = "arc-swap"
+
version = "1.7.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
+
+
[[package]]
name = "arrayvec"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"proc-macro2",
"quote",
"serde",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "async-channel"
+
version = "2.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
+
dependencies = [
+
"concurrent-queue",
+
"event-listener-strategy",
+
"futures-core",
+
"pin-project-lite",
+
]
+
+
[[package]]
name = "async-compression"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
+
+
[[package]]
+
name = "async-task"
+
version = "4.7.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "async-trait"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "auto_enums"
+
version = "0.8.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9c170965892137a3a9aeb000b4524aa3cc022a310e709d848b6e1cdce4ab4781"
+
dependencies = [
+
"derive_utils",
+
"proc-macro2",
+
"quote",
+
"syn 2.0.103",
+
]
+
+
[[package]]
name = "autocfg"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"regex",
"rustc-hash 1.1.0",
"shlex",
+
"syn 2.0.103",
"which",
]
···
"regex",
"rustc-hash 1.1.0",
"shlex",
+
"syn 2.0.103",
]
[[package]]
···
"regex",
"rustc-hash 2.1.1",
"shlex",
+
"syn 2.0.103",
]
[[package]]
···
[[package]]
name = "clap"
+
version = "4.5.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9"
dependencies = [
"clap_builder",
"clap_derive",
···
[[package]]
name = "clap_builder"
+
version = "4.5.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
+
"strsim 0.11.1",
]
[[package]]
name = "clap_derive"
+
version = "4.5.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
dependencies = [
"heck",
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "cmsketch"
+
version = "0.2.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "553c840ee51da812c6cd621f9f7e07dfb00a49f91283a8e6380c78cba4f61aba"
+
dependencies = [
+
"paste",
+
]
+
+
[[package]]
name = "colorchoice"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"clap",
"ctrlc",
"flume",
+
"fs4 0.12.0",
"headers-accept",
"links",
"mediatype",
···
[[package]]
name = "darling"
+
version = "0.14.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
+
dependencies = [
+
"darling_core 0.14.4",
+
"darling_macro 0.14.4",
+
]
+
+
[[package]]
+
name = "darling"
version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
+
"darling_core 0.20.11",
+
"darling_macro 0.20.11",
+
]
+
+
[[package]]
+
name = "darling_core"
+
version = "0.14.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
+
dependencies = [
+
"fnv",
+
"ident_case",
+
"proc-macro2",
+
"quote",
+
"strsim 0.10.0",
+
"syn 1.0.109",
]
[[package]]
···
"ident_case",
"proc-macro2",
"quote",
+
"strsim 0.11.1",
+
"syn 2.0.103",
+
]
+
+
[[package]]
+
name = "darling_macro"
+
version = "0.14.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
+
dependencies = [
+
"darling_core 0.14.4",
+
"quote",
+
"syn 1.0.109",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
+
"darling_core 0.20.11",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f"
dependencies = [
"data-encoding",
+
"syn 2.0.103",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
dependencies = [
+
"darling 0.20.11",
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core",
+
"syn 2.0.103",
+
]
+
+
[[package]]
+
name = "derive_utils"
+
version = "0.15.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
checksum = "c0d05e1c0dbad51b52c38bda7adceef61b9efc2baf04acfe8726a8c4630a6f57"
[[package]]
+
name = "downcast-rs"
+
version = "1.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
+
+
[[package]]
name = "dropshot"
version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"semver",
"serde",
"serde_tokenstream",
+
"syn 2.0.103",
]
[[package]]
···
"heck",
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
"once_cell",
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
dependencies = [
+
"futures-core",
+
"futures-sink",
+
"nanorand",
"spin",
]
···
]
[[package]]
+
name = "foyer"
+
version = "0.18.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0b4d8e96374206ff1b4265f2e2e6e1f80bc3048957b2a1e7fdeef929d68f318f"
+
dependencies = [
+
"equivalent",
+
"foyer-common",
+
"foyer-memory",
+
"foyer-storage",
+
"madsim-tokio",
+
"mixtrics",
+
"pin-project",
+
"serde",
+
"thiserror 2.0.12",
+
"tokio",
+
"tracing",
+
]
+
+
[[package]]
+
name = "foyer-common"
+
version = "0.18.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "911b8e3f23d5fe55b0b240f75af1d2fa5cb7261d3f9b38ef1c57bbc9f0449317"
+
dependencies = [
+
"bincode 1.3.3",
+
"bytes",
+
"cfg-if",
+
"itertools 0.14.0",
+
"madsim-tokio",
+
"mixtrics",
+
"parking_lot",
+
"pin-project",
+
"serde",
+
"thiserror 2.0.12",
+
"tokio",
+
"twox-hash",
+
]
+
+
[[package]]
+
name = "foyer-intrusive-collections"
+
version = "0.10.0-dev"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6e4fee46bea69e0596130e3210e65d3424e0ac1e6df3bde6636304bdf1ca4a3b"
+
dependencies = [
+
"memoffset",
+
]
+
+
[[package]]
+
name = "foyer-memory"
+
version = "0.18.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "506883d5a8500dea1b1662f7180f3534bdcbfa718d3253db7179552ef83612fa"
+
dependencies = [
+
"arc-swap",
+
"bitflags",
+
"cmsketch",
+
"equivalent",
+
"foyer-common",
+
"foyer-intrusive-collections",
+
"hashbrown 0.15.2",
+
"itertools 0.14.0",
+
"madsim-tokio",
+
"mixtrics",
+
"parking_lot",
+
"pin-project",
+
"serde",
+
"thiserror 2.0.12",
+
"tokio",
+
"tracing",
+
]
+
+
[[package]]
+
name = "foyer-storage"
+
version = "0.18.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1ba8403a54a2f2032fb647e49c442e5feeb33f3989f7024f1b178341a016f06d"
+
dependencies = [
+
"allocator-api2",
+
"anyhow",
+
"auto_enums",
+
"bytes",
+
"equivalent",
+
"flume",
+
"foyer-common",
+
"foyer-memory",
+
"fs4 0.13.1",
+
"futures-core",
+
"futures-util",
+
"itertools 0.14.0",
+
"libc",
+
"lz4",
+
"madsim-tokio",
+
"ordered_hash_map",
+
"parking_lot",
+
"paste",
+
"pin-project",
+
"rand 0.9.1",
+
"serde",
+
"thiserror 2.0.12",
+
"tokio",
+
"tracing",
+
"twox-hash",
+
"zstd",
+
]
+
+
[[package]]
name = "fs4"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "fs4"
+
version = "0.13.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4"
+
dependencies = [
+
"rustix 1.0.5",
+
"windows-sys 0.59.0",
+
]
+
+
[[package]]
name = "fs_extra"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
[[package]]
name = "hashbrown"
+
version = "0.13.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+
dependencies = [
+
"ahash",
+
]
+
+
[[package]]
+
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
···
"libc",
"percent-encoding",
"pin-project-lite",
+
"socket2 0.5.9",
"system-configuration",
"tokio",
"tower-service",
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "io-uring"
+
version = "0.7.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
+
dependencies = [
+
"bitflags",
+
"cfg-if",
+
"libc",
+
]
+
+
[[package]]
name = "ipconfig"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
dependencies = [
+
"socket2 0.5.9",
"widestring",
"windows-sys 0.48.0",
"winreg",
···
]
[[package]]
+
name = "itertools"
+
version = "0.14.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+
dependencies = [
+
"either",
+
]
+
+
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
[[package]]
name = "libc"
+
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "libfuzzer-sys"
···
]
[[package]]
+
name = "lz4"
+
version = "1.28.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4"
+
dependencies = [
+
"lz4-sys",
+
]
+
+
[[package]]
name = "lz4-sys"
version = "1.11.1+lz4-1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "madsim"
+
version = "0.2.32"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "db6694555643da293dfb89e33c2880a13b62711d64b6588bc7df6ce4110b27f1"
+
dependencies = [
+
"ahash",
+
"async-channel",
+
"async-stream",
+
"async-task",
+
"bincode 1.3.3",
+
"bytes",
+
"downcast-rs",
+
"futures-util",
+
"lazy_static",
+
"libc",
+
"madsim-macros",
+
"naive-timer",
+
"panic-message",
+
"rand 0.8.5",
+
"rand_xoshiro 0.6.0",
+
"rustversion",
+
"serde",
+
"spin",
+
"tokio",
+
"tokio-util",
+
"toml",
+
"tracing",
+
"tracing-subscriber",
+
]
+
+
[[package]]
+
name = "madsim-macros"
+
version = "0.2.12"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f3d248e97b1a48826a12c3828d921e8548e714394bf17274dd0a93910dc946e1"
+
dependencies = [
+
"darling 0.14.4",
+
"proc-macro2",
+
"quote",
+
"syn 1.0.109",
+
]
+
+
[[package]]
+
name = "madsim-tokio"
+
version = "0.2.30"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7d3eb2acc57c82d21d699119b859e2df70a91dbdb84734885a1e72be83bdecb5"
+
dependencies = [
+
"madsim",
+
"spin",
+
"tokio",
+
]
+
+
[[package]]
name = "match_cfg"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+
[[package]]
+
name = "memoffset"
+
version = "0.9.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+
dependencies = [
+
"autocfg",
+
]
[[package]]
name = "metrics"
···
]
[[package]]
+
name = "mixtrics"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "adbcddf5a90b959eea97ae505e0391f5c6dd411fbf546d43b9c59ad1c3bd4391"
+
dependencies = [
+
"itertools 0.14.0",
+
"parking_lot",
+
]
+
+
[[package]]
name = "moka"
version = "0.12.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "naive-timer"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "034a0ad7deebf0c2abcf2435950a6666c3c15ea9d8fad0c0f48efa8a7f843fed"
+
+
[[package]]
+
name = "nanorand"
+
version = "0.7.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
+
dependencies = [
+
"getrandom 0.2.15",
+
]
+
+
[[package]]
name = "native-tls"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "ordered_hash_map"
+
version = "0.4.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ab0e5f22bf6dd04abd854a8874247813a8fa2c8c1260eba6fbb150270ce7c176"
+
dependencies = [
+
"hashbrown 0.13.2",
+
]
+
+
[[package]]
name = "overload"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
"elliptic-curve",
"primeorder",
]
+
+
[[package]]
+
name = "panic-message"
+
version = "0.3.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "384e52fd8fbd4cbe3c317e8216260c21a0f9134de108cea8a4dd4e7e152c472d"
[[package]]
name = "parking"
···
"pest_meta",
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "pin-project"
+
version = "1.1.10"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
+
dependencies = [
+
"pin-project-internal",
+
]
+
+
[[package]]
+
name = "pin-project-internal"
+
version = "1.1.10"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn 2.0.103",
+
]
+
+
[[package]]
name = "pin-project-lite"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55"
dependencies = [
"proc-macro2",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
"proc-macro2",
"quote",
"serde_derive_internals",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
[[package]]
name = "serde_json"
+
version = "1.0.141"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
dependencies = [
"itoa",
"memchr",
···
"proc-macro2",
"quote",
"serde",
+
"syn 2.0.103",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e"
dependencies = [
+
"darling 0.20.11",
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
]
[[package]]
+
name = "slingshot"
+
version = "0.1.0"
+
dependencies = [
+
"axum",
+
"clap",
+
"ctrlc",
+
"env_logger",
+
"foyer",
+
"jetstream",
+
"log",
+
"metrics",
+
"metrics-exporter-prometheus 0.17.2",
+
"serde",
+
"serde_json",
+
"thiserror 2.0.12",
+
"tokio",
+
"tokio-util",
+
]
+
+
[[package]]
name = "slog"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "socket2"
+
version = "0.6.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
+
dependencies = [
+
"libc",
+
"windows-sys 0.59.0",
+
]
+
+
[[package]]
name = "spacedust"
version = "0.1.0"
dependencies = [
···
[[package]]
name = "strsim"
+
version = "0.10.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+
[[package]]
+
name = "strsim"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
···
[[package]]
name = "syn"
+
version = "1.0.109"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"unicode-ident",
+
]
+
+
[[package]]
+
name = "syn"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
[[package]]
name = "tokio"
+
version = "1.47.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
dependencies = [
"backtrace",
"bytes",
+
"io-uring",
"libc",
"mio",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
+
"slab",
+
"socket2 0.6.0",
"tokio-macros",
+
"windows-sys 0.59.0",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"log",
"pin-project-lite",
+
"tracing-attributes",
"tracing-core",
]
[[package]]
+
name = "tracing-attributes"
+
version = "0.1.30"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn 2.0.103",
+
]
+
+
[[package]]
name = "tracing-core"
version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
"sha1",
"thiserror 2.0.12",
"utf-8",
+
]
+
+
[[package]]
+
name = "twox-hash"
+
version = "2.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56"
+
dependencies = [
+
"rand 0.9.1",
]
[[package]]
···
"log",
"proc-macro2",
"quote",
+
"syn 2.0.103",
"wasm-bindgen-shared",
]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
"synstructure",
]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
"synstructure",
]
···
dependencies = [
"proc-macro2",
"quote",
+
"syn 2.0.103",
]
[[package]]
+1
Cargo.toml
···
"ufos/fuzz",
"spacedust",
"who-am-i",
]
···
"ufos/fuzz",
"spacedust",
"who-am-i",
+
"slingshot",
]
+1
slingshot/.gitignore
···
···
+
foyer
+19
slingshot/Cargo.toml
···
···
+
[package]
+
name = "slingshot"
+
version = "0.1.0"
+
edition = "2024"
+
+
[dependencies]
+
clap = { version = "4.5.41", features = ["derive"] }
+
ctrlc = "3.4.7"
+
env_logger = "0.11.8"
+
foyer = { version = "0.18.0", features = ["serde"] }
+
jetstream = { path = "../jetstream", features = ["metrics"] }
+
log = "0.4.27"
+
metrics = "0.24.2"
+
metrics-exporter-prometheus = { version = "0.17.1", features = ["http-listener"] }
+
serde = { version = "1.0.219", features = ["derive"] }
+
serde_json = { version = "1.0.141", features = ["raw_value"] }
+
thiserror = "2.0.12"
+
tokio = { version = "1.47.0", features = ["full"] }
+
tokio-util = "0.7.15"
+76
slingshot/src/consumer.rs
···
···
+
use crate::CachedRecord;
+
use foyer::HybridCache;
+
use crate::error::ConsumerError;
+
use jetstream::{
+
DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector,
+
events::{CommitOp, Cursor, EventKind},
+
};
+
use tokio_util::sync::CancellationToken;
+
+
pub async fn consume(
+
jetstream_endpoint: String,
+
cursor: Option<Cursor>,
+
no_zstd: bool,
+
shutdown: CancellationToken,
+
cache: HybridCache<String, CachedRecord>,
+
) -> Result<(), ConsumerError> {
+
let endpoint = DefaultJetstreamEndpoints::endpoint_or_shortcut(&jetstream_endpoint);
+
if endpoint == jetstream_endpoint {
+
log::info!("consumer: connecting jetstream at {endpoint}");
+
} else {
+
log::info!("consumer: connecting jetstream at {jetstream_endpoint} => {endpoint}");
+
}
+
let config: JetstreamConfig = JetstreamConfig {
+
endpoint,
+
compression: if no_zstd {
+
JetstreamCompression::None
+
} else {
+
JetstreamCompression::Zstd
+
},
+
replay_on_reconnect: true,
+
channel_size: 1024, // buffer up to ~1s of jetstream events
+
..Default::default()
+
};
+
let mut receiver = JetstreamConnector::new(config)?
+
.connect_cursor(cursor)
+
.await?;
+
+
log::info!("consumer: receiving messages..");
+
loop {
+
if shutdown.is_cancelled() {
+
log::info!("consumer: exiting for shutdown");
+
return Ok(());
+
}
+
let Some(mut event) = receiver.recv().await else {
+
log::error!("consumer: could not receive event, bailing");
+
break;
+
};
+
+
if event.kind != EventKind::Commit {
+
continue;
+
}
+
let Some(ref mut commit) = event.commit else {
+
log::warn!("consumer: commit event missing commit data, ignoring");
+
continue;
+
};
+
+
// TODO: something a bit more robust
+
let at_uri = format!(
+
"at://{}/{}/{}",
+
&*event.did, &*commit.collection, &*commit.rkey
+
);
+
+
if commit.operation == CommitOp::Delete {
+
cache.insert(at_uri, CachedRecord::Deleted);
+
} else {
+
let Some(record) = commit.record.take() else {
+
log::warn!("consumer: commit update/delete missing record, ignoring");
+
continue;
+
};
+
+
cache.insert(at_uri, CachedRecord::Found(record.into()));
+
}
+
}
+
+
Err(ConsumerError::JetstreamEnded)
+
}
+21
slingshot/src/error.rs
···
···
+
use thiserror::Error;
+
+
#[derive(Debug, Error)]
+
pub enum ConsumerError {
+
#[error(transparent)]
+
JetstreamConnectionError(#[from] jetstream::error::ConnectionError),
+
#[error(transparent)]
+
JetstreamConfigValidationError(#[from] jetstream::error::ConfigValidationError),
+
#[error("jetstream ended")]
+
JetstreamEnded,
+
#[error("delay queue output dropped")]
+
DelayQueueOutputDropped,
+
}
+
+
#[derive(Debug, Error)]
+
pub enum MainTaskError {
+
#[error(transparent)]
+
ConsumerTaskError(#[from] ConsumerError),
+
// #[error(transparent)]
+
// ServerTaskError(#[from] ServerError),
+
}
+17
slingshot/src/firehose_cache.rs
···
···
+
use std::path::Path;
+
use crate::CachedRecord;
+
use foyer::{HybridCache, DirectFsDeviceOptions, Engine, HybridCacheBuilder};
+
+
+
pub async fn firehose_cache(dir: impl AsRef<Path>) -> Result<HybridCache<String, CachedRecord>, String> {
+
let cache = HybridCacheBuilder::new()
+
.with_name("firehose")
+
.memory(64 * 2_usize.pow(20))
+
.with_weighter(|k: &String, v| k.len() + std::mem::size_of_val(v))
+
.storage(Engine::large())
+
.with_device_options(DirectFsDeviceOptions::new(dir))
+
.build()
+
.await
+
.map_err(|e| format!("foyer setup error: {e:?}"))?;
+
Ok(cache)
+
}
+8
slingshot/src/lib.rs
···
···
+
mod consumer;
+
pub mod error;
+
mod firehose_cache;
+
mod record;
+
+
pub use consumer::consume;
+
pub use firehose_cache::firehose_cache;
+
pub use record::CachedRecord;
+107
slingshot/src/main.rs
···
···
+
// use foyer::HybridCache;
+
// use foyer::{Engine, DirectFsDeviceOptions, HybridCacheBuilder};
+
use metrics_exporter_prometheus::PrometheusBuilder;
+
use slingshot::{consume, error::MainTaskError, firehose_cache};
+
+
use clap::Parser;
+
use tokio_util::sync::CancellationToken;
+
+
+
/// Slingshot record edge cache
+
#[derive(Parser, Debug, Clone)]
+
#[command(version, about, long_about = None)]
+
struct Args {
+
/// Jetstream server to connect to (exclusive with --fixture). Provide either a wss:// URL, or a shorhand value:
+
/// 'us-east-1', 'us-east-2', 'us-west-1', or 'us-west-2'
+
#[arg(long)]
+
jetstream: String,
+
/// don't request zstd-compressed jetstream events
+
///
+
/// reduces CPU at the expense of more ingress bandwidth
+
#[arg(long, action)]
+
jetstream_no_zstd: bool,
+
}
+
+
#[tokio::main]
+
async fn main() -> Result<(), String> {
+
env_logger::init();
+
+
let shutdown = CancellationToken::new();
+
+
let ctrlc_shutdown = shutdown.clone();
+
ctrlc::set_handler(move || ctrlc_shutdown.cancel()).expect("failed to set ctrl-c handler");
+
+
let args = Args::parse();
+
+
if let Err(e) = install_metrics_server() {
+
log::error!("failed to install metrics server: {e:?}");
+
} else {
+
log::info!("metrics listening at http://0.0.0.0:8765");
+
}
+
+
log::info!("setting up firehose cache...");
+
let cache = firehose_cache("./foyer").await?;
+
log::info!("firehose cache ready.");
+
+
let mut tasks: tokio::task::JoinSet<Result<(), MainTaskError>> = tokio::task::JoinSet::new();
+
+
let consumer_shutdown = shutdown.clone();
+
tasks.spawn(async move {
+
consume(
+
args.jetstream,
+
None,
+
args.jetstream_no_zstd,
+
consumer_shutdown,
+
cache,
+
)
+
.await?;
+
Ok(())
+
});
+
+
+
tokio::select! {
+
_ = shutdown.cancelled() => log::warn!("shutdown requested"),
+
Some(r) = tasks.join_next() => {
+
log::warn!("a task exited, shutting down: {r:?}");
+
shutdown.cancel();
+
}
+
}
+
+
tokio::select! {
+
_ = async {
+
while let Some(completed) = tasks.join_next().await {
+
log::info!("shutdown: task completed: {completed:?}");
+
}
+
} => {},
+
_ = tokio::time::sleep(std::time::Duration::from_secs(3)) => {
+
log::info!("shutdown: not all tasks completed on time. aborting...");
+
tasks.shutdown().await;
+
},
+
}
+
+
log::info!("bye!");
+
+
Ok(())
+
}
+
+
fn install_metrics_server() -> Result<(), metrics_exporter_prometheus::BuildError> {
+
log::info!("installing metrics server...");
+
let host = [0, 0, 0, 0];
+
let port = 8765;
+
PrometheusBuilder::new()
+
.set_quantiles(&[0.5, 0.9, 0.99, 1.0])?
+
.set_bucket_duration(std::time::Duration::from_secs(300))?
+
.set_bucket_count(std::num::NonZero::new(12).unwrap()) // count * duration = 60 mins. stuff doesn't happen that fast here.
+
.set_enable_unit_suffix(false) // this seemed buggy for constellation (sometimes wouldn't engage)
+
.with_http_listener((host, port))
+
.install()?;
+
log::info!(
+
"metrics server installed! listening on http://{}.{}.{}.{}:{port}",
+
host[0],
+
host[1],
+
host[2],
+
host[3]
+
);
+
Ok(())
+
}
+
+24
slingshot/src/record.rs
···
···
+
use serde_json::value::RawValue;
+
use serde::{Serialize, Deserialize};
+
+
#[derive(Debug, Serialize, Deserialize)]
+
pub struct RawRecord(String);
+
+
impl From<Box<RawValue>> for RawRecord {
+
fn from(rv: Box<RawValue>) -> Self {
+
Self(rv.get().to_string())
+
}
+
}
+
+
/// only for use with stored (validated) values, not general strings
+
impl From<RawRecord> for Box<RawValue> {
+
fn from(RawRecord(s): RawRecord) -> Self {
+
RawValue::from_string(s).expect("stored string from RawValue to be valid")
+
}
+
}
+
+
#[derive(Debug, Serialize, Deserialize)]
+
pub enum CachedRecord {
+
Found(RawRecord),
+
Deleted,
+
}