├── .github ├── FUNDING.yml ├── assets │ └── logo.png ├── dependabot.yml └── workflows │ └── continuous-integration.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Makefile ├── README.md ├── default_config.toml ├── rustfmt.toml └── src ├── app └── mod.rs ├── args.rs ├── lib.rs ├── main.rs └── tui └── mod.rs /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [daniel-boll, danielhe4rt, codelieutenant, gvieira18] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /.github/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basementdevs/scyllash/41cfa62249dd9cb531f0ab3f0693d54e1df9bf55/.github/assets/logo.png -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | updates: 4 | - package-ecosystem: 'github-actions' 5 | directory: '/' 6 | schedule: 7 | interval: 'weekly' 8 | pull-request-branch-name: 9 | separator: _ 10 | ignore: 11 | - dependency-name: '*' 12 | update-types: 13 | - 'version-update:semver-major' 14 | 15 | - package-ecosystem: 'cargo' 16 | open-pull-requests-limit: 0 17 | directory: '/' 18 | schedule: 19 | interval: 'weekly' 20 | pull-request-branch-name: 21 | separator: _ 22 | ignore: 23 | - dependency-name: '*' 24 | update-types: 25 | - 'version-update:semver-major' 26 | groups: 27 | prod: 28 | dependency-type: production 29 | patterns: 30 | - '*' 31 | dev: 32 | dependency-type: development 33 | patterns: 34 | - '*' 35 | -------------------------------------------------------------------------------- /.github/workflows/continuous-integration.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main, develop] 6 | pull_request: 7 | branches: [main, develop] 8 | 9 | concurrency: 10 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 11 | cancel-in-progress: true 12 | 13 | jobs: 14 | setup: 15 | name: Setup rust 16 | runs-on: ubuntu-24.04 17 | steps: 18 | - name: Checkout code 19 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 20 | - name: Setup rust 21 | uses: actions-rust-lang/setup-rust-toolchain@11df97af8e8102fd60b60a77dfbf58d40cd843b8 # v1.10.1 22 | with: 23 | toolchain: stable 24 | target: x86_64-unknown-linux-gnu 25 | components: clippy, rustfmt 26 | - name: Build project 27 | run: make build 28 | lint: 29 | name: Run lint and format 30 | needs: [setup] 31 | runs-on: ubuntu-24.04 32 | env: 33 | RUSTFLAGS: "-Dwarnings" 34 | steps: 35 | - name: Checkout code 36 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 37 | - name: Setup rust 38 | uses: actions-rust-lang/setup-rust-toolchain@11df97af8e8102fd60b60a77dfbf58d40cd843b8 # v1.10.1 39 | with: 40 | toolchain: stable 41 | target: x86_64-unknown-linux-gnu 42 | components: clippy, rustfmt 43 | - name: Run Rustfmt 44 | uses: actions-rust-lang/rustfmt@559aa3035a47390ba96088dffa783b5d26da9326 # v1.1.1 45 | - name: Run Clippy 46 | uses: clechasseur/rs-clippy-check@50a0fd6f2f1a33307d603ee50d91eadbb2561120 # v3.0.6 47 | with: 48 | args: --all-features 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .idea -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.8.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 25 | dependencies = [ 26 | "cfg-if", 27 | "once_cell", 28 | "version_check", 29 | "zerocopy", 30 | ] 31 | 32 | [[package]] 33 | name = "allocator-api2" 34 | version = "0.2.18" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 37 | 38 | [[package]] 39 | name = "android-tzdata" 40 | version = "0.1.1" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 43 | 44 | [[package]] 45 | name = "android_system_properties" 46 | version = "0.1.5" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 49 | dependencies = [ 50 | "libc", 51 | ] 52 | 53 | [[package]] 54 | name = "anstream" 55 | version = "0.6.15" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" 58 | dependencies = [ 59 | "anstyle", 60 | "anstyle-parse", 61 | "anstyle-query", 62 | "anstyle-wincon", 63 | "colorchoice", 64 | "is_terminal_polyfill", 65 | "utf8parse", 66 | ] 67 | 68 | [[package]] 69 | name = "anstyle" 70 | version = "1.0.8" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" 73 | 74 | [[package]] 75 | name = "anstyle-parse" 76 | version = "0.2.5" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" 79 | dependencies = [ 80 | "utf8parse", 81 | ] 82 | 83 | [[package]] 84 | name = "anstyle-query" 85 | version = "1.1.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" 88 | dependencies = [ 89 | "windows-sys", 90 | ] 91 | 92 | [[package]] 93 | name = "anstyle-wincon" 94 | version = "3.0.4" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" 97 | dependencies = [ 98 | "anstyle", 99 | "windows-sys", 100 | ] 101 | 102 | [[package]] 103 | name = "arc-swap" 104 | version = "1.7.1" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 107 | 108 | [[package]] 109 | name = "async-trait" 110 | version = "0.1.81" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" 113 | dependencies = [ 114 | "proc-macro2", 115 | "quote", 116 | "syn", 117 | ] 118 | 119 | [[package]] 120 | name = "atomic" 121 | version = "0.6.0" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" 124 | dependencies = [ 125 | "bytemuck", 126 | ] 127 | 128 | [[package]] 129 | name = "autocfg" 130 | version = "1.3.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 133 | 134 | [[package]] 135 | name = "backtrace" 136 | version = "0.3.71" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 139 | dependencies = [ 140 | "addr2line", 141 | "cc", 142 | "cfg-if", 143 | "libc", 144 | "miniz_oxide", 145 | "object", 146 | "rustc-demangle", 147 | ] 148 | 149 | [[package]] 150 | name = "bitflags" 151 | version = "2.6.0" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 154 | 155 | [[package]] 156 | name = "bumpalo" 157 | version = "3.16.0" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 160 | 161 | [[package]] 162 | name = "bytemuck" 163 | version = "1.17.0" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31" 166 | 167 | [[package]] 168 | name = "byteorder" 169 | version = "1.5.0" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 172 | 173 | [[package]] 174 | name = "bytes" 175 | version = "1.7.1" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" 178 | 179 | [[package]] 180 | name = "cassowary" 181 | version = "0.3.0" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" 184 | 185 | [[package]] 186 | name = "castaway" 187 | version = "0.2.3" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" 190 | dependencies = [ 191 | "rustversion", 192 | ] 193 | 194 | [[package]] 195 | name = "cc" 196 | version = "1.1.13" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" 199 | dependencies = [ 200 | "shlex", 201 | ] 202 | 203 | [[package]] 204 | name = "cfg-if" 205 | version = "1.0.0" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 208 | 209 | [[package]] 210 | name = "chrono" 211 | version = "0.4.39" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 214 | dependencies = [ 215 | "android-tzdata", 216 | "iana-time-zone", 217 | "js-sys", 218 | "num-traits", 219 | "wasm-bindgen", 220 | "windows-targets", 221 | ] 222 | 223 | [[package]] 224 | name = "clap" 225 | version = "4.5.27" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" 228 | dependencies = [ 229 | "clap_builder", 230 | "clap_derive", 231 | ] 232 | 233 | [[package]] 234 | name = "clap_builder" 235 | version = "4.5.27" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 238 | dependencies = [ 239 | "anstream", 240 | "anstyle", 241 | "clap_lex", 242 | "strsim", 243 | ] 244 | 245 | [[package]] 246 | name = "clap_derive" 247 | version = "4.5.24" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" 250 | dependencies = [ 251 | "heck", 252 | "proc-macro2", 253 | "quote", 254 | "syn", 255 | ] 256 | 257 | [[package]] 258 | name = "clap_lex" 259 | version = "0.7.4" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 262 | 263 | [[package]] 264 | name = "color-eyre" 265 | version = "0.6.3" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" 268 | dependencies = [ 269 | "backtrace", 270 | "color-spantrace", 271 | "eyre", 272 | "indenter", 273 | "once_cell", 274 | "owo-colors", 275 | "tracing-error", 276 | ] 277 | 278 | [[package]] 279 | name = "color-spantrace" 280 | version = "0.2.1" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" 283 | dependencies = [ 284 | "once_cell", 285 | "owo-colors", 286 | "tracing-core", 287 | "tracing-error", 288 | ] 289 | 290 | [[package]] 291 | name = "colorchoice" 292 | version = "1.0.2" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" 295 | 296 | [[package]] 297 | name = "compact_str" 298 | version = "0.8.0" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" 301 | dependencies = [ 302 | "castaway", 303 | "cfg-if", 304 | "itoa", 305 | "rustversion", 306 | "ryu", 307 | "static_assertions", 308 | ] 309 | 310 | [[package]] 311 | name = "core-foundation-sys" 312 | version = "0.8.7" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 315 | 316 | [[package]] 317 | name = "crossterm" 318 | version = "0.28.1" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 321 | dependencies = [ 322 | "bitflags", 323 | "crossterm_winapi", 324 | "mio", 325 | "parking_lot", 326 | "rustix", 327 | "signal-hook", 328 | "signal-hook-mio", 329 | "winapi", 330 | ] 331 | 332 | [[package]] 333 | name = "crossterm_winapi" 334 | version = "0.9.1" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 337 | dependencies = [ 338 | "winapi", 339 | ] 340 | 341 | [[package]] 342 | name = "darling" 343 | version = "0.20.10" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 346 | dependencies = [ 347 | "darling_core", 348 | "darling_macro", 349 | ] 350 | 351 | [[package]] 352 | name = "darling_core" 353 | version = "0.20.10" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 356 | dependencies = [ 357 | "fnv", 358 | "ident_case", 359 | "proc-macro2", 360 | "quote", 361 | "strsim", 362 | "syn", 363 | ] 364 | 365 | [[package]] 366 | name = "darling_macro" 367 | version = "0.20.10" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 370 | dependencies = [ 371 | "darling_core", 372 | "quote", 373 | "syn", 374 | ] 375 | 376 | [[package]] 377 | name = "dashmap" 378 | version = "5.5.3" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 381 | dependencies = [ 382 | "cfg-if", 383 | "hashbrown", 384 | "lock_api", 385 | "once_cell", 386 | "parking_lot_core", 387 | ] 388 | 389 | [[package]] 390 | name = "deranged" 391 | version = "0.3.11" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 394 | dependencies = [ 395 | "powerfmt", 396 | ] 397 | 398 | [[package]] 399 | name = "either" 400 | version = "1.13.0" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 403 | 404 | [[package]] 405 | name = "equivalent" 406 | version = "1.0.1" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 409 | 410 | [[package]] 411 | name = "errno" 412 | version = "0.3.9" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 415 | dependencies = [ 416 | "libc", 417 | "windows-sys", 418 | ] 419 | 420 | [[package]] 421 | name = "eyre" 422 | version = "0.6.12" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" 425 | dependencies = [ 426 | "indenter", 427 | "once_cell", 428 | ] 429 | 430 | [[package]] 431 | name = "fnv" 432 | version = "1.0.7" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 435 | 436 | [[package]] 437 | name = "futures" 438 | version = "0.3.30" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 441 | dependencies = [ 442 | "futures-channel", 443 | "futures-core", 444 | "futures-executor", 445 | "futures-io", 446 | "futures-sink", 447 | "futures-task", 448 | "futures-util", 449 | ] 450 | 451 | [[package]] 452 | name = "futures-channel" 453 | version = "0.3.30" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 456 | dependencies = [ 457 | "futures-core", 458 | "futures-sink", 459 | ] 460 | 461 | [[package]] 462 | name = "futures-core" 463 | version = "0.3.30" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 466 | 467 | [[package]] 468 | name = "futures-executor" 469 | version = "0.3.30" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 472 | dependencies = [ 473 | "futures-core", 474 | "futures-task", 475 | "futures-util", 476 | ] 477 | 478 | [[package]] 479 | name = "futures-io" 480 | version = "0.3.30" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 483 | 484 | [[package]] 485 | name = "futures-macro" 486 | version = "0.3.30" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 489 | dependencies = [ 490 | "proc-macro2", 491 | "quote", 492 | "syn", 493 | ] 494 | 495 | [[package]] 496 | name = "futures-sink" 497 | version = "0.3.30" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 500 | 501 | [[package]] 502 | name = "futures-task" 503 | version = "0.3.30" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 506 | 507 | [[package]] 508 | name = "futures-util" 509 | version = "0.3.30" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 512 | dependencies = [ 513 | "futures-channel", 514 | "futures-core", 515 | "futures-io", 516 | "futures-macro", 517 | "futures-sink", 518 | "futures-task", 519 | "memchr", 520 | "pin-project-lite", 521 | "pin-utils", 522 | "slab", 523 | ] 524 | 525 | [[package]] 526 | name = "getrandom" 527 | version = "0.2.15" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 530 | dependencies = [ 531 | "cfg-if", 532 | "libc", 533 | "wasi", 534 | ] 535 | 536 | [[package]] 537 | name = "gimli" 538 | version = "0.28.1" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 541 | 542 | [[package]] 543 | name = "hashbrown" 544 | version = "0.14.5" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 547 | dependencies = [ 548 | "ahash", 549 | "allocator-api2", 550 | ] 551 | 552 | [[package]] 553 | name = "heck" 554 | version = "0.5.0" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 557 | 558 | [[package]] 559 | name = "hermit-abi" 560 | version = "0.3.9" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 563 | 564 | [[package]] 565 | name = "histogram" 566 | version = "0.6.9" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" 569 | 570 | [[package]] 571 | name = "iana-time-zone" 572 | version = "0.1.60" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 575 | dependencies = [ 576 | "android_system_properties", 577 | "core-foundation-sys", 578 | "iana-time-zone-haiku", 579 | "js-sys", 580 | "wasm-bindgen", 581 | "windows-core", 582 | ] 583 | 584 | [[package]] 585 | name = "iana-time-zone-haiku" 586 | version = "0.1.2" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 589 | dependencies = [ 590 | "cc", 591 | ] 592 | 593 | [[package]] 594 | name = "ident_case" 595 | version = "1.0.1" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 598 | 599 | [[package]] 600 | name = "indenter" 601 | version = "0.3.3" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 604 | 605 | [[package]] 606 | name = "indexmap" 607 | version = "2.4.0" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" 610 | dependencies = [ 611 | "equivalent", 612 | "hashbrown", 613 | ] 614 | 615 | [[package]] 616 | name = "indoc" 617 | version = "2.0.5" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" 620 | 621 | [[package]] 622 | name = "instability" 623 | version = "0.3.2" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" 626 | dependencies = [ 627 | "quote", 628 | "syn", 629 | ] 630 | 631 | [[package]] 632 | name = "is_terminal_polyfill" 633 | version = "1.70.1" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 636 | 637 | [[package]] 638 | name = "itertools" 639 | version = "0.13.0" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 642 | dependencies = [ 643 | "either", 644 | ] 645 | 646 | [[package]] 647 | name = "itoa" 648 | version = "1.0.11" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 651 | 652 | [[package]] 653 | name = "js-sys" 654 | version = "0.3.70" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" 657 | dependencies = [ 658 | "wasm-bindgen", 659 | ] 660 | 661 | [[package]] 662 | name = "lazy_static" 663 | version = "1.5.0" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 666 | 667 | [[package]] 668 | name = "libc" 669 | version = "0.2.169" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 672 | 673 | [[package]] 674 | name = "linux-raw-sys" 675 | version = "0.4.14" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 678 | 679 | [[package]] 680 | name = "lock_api" 681 | version = "0.4.12" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 684 | dependencies = [ 685 | "autocfg", 686 | "scopeguard", 687 | ] 688 | 689 | [[package]] 690 | name = "log" 691 | version = "0.4.22" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 694 | 695 | [[package]] 696 | name = "lru" 697 | version = "0.12.4" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" 700 | dependencies = [ 701 | "hashbrown", 702 | ] 703 | 704 | [[package]] 705 | name = "lz4_flex" 706 | version = "0.11.3" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" 709 | dependencies = [ 710 | "twox-hash", 711 | ] 712 | 713 | [[package]] 714 | name = "memchr" 715 | version = "2.7.4" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 718 | 719 | [[package]] 720 | name = "miniz_oxide" 721 | version = "0.7.4" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 724 | dependencies = [ 725 | "adler", 726 | ] 727 | 728 | [[package]] 729 | name = "mio" 730 | version = "1.0.2" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" 733 | dependencies = [ 734 | "hermit-abi", 735 | "libc", 736 | "log", 737 | "wasi", 738 | "windows-sys", 739 | ] 740 | 741 | [[package]] 742 | name = "num-conv" 743 | version = "0.1.0" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 746 | 747 | [[package]] 748 | name = "num-traits" 749 | version = "0.2.19" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 752 | dependencies = [ 753 | "autocfg", 754 | ] 755 | 756 | [[package]] 757 | name = "num_threads" 758 | version = "0.1.7" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 761 | dependencies = [ 762 | "libc", 763 | ] 764 | 765 | [[package]] 766 | name = "object" 767 | version = "0.32.2" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 770 | dependencies = [ 771 | "memchr", 772 | ] 773 | 774 | [[package]] 775 | name = "once_cell" 776 | version = "1.19.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 779 | 780 | [[package]] 781 | name = "owo-colors" 782 | version = "3.5.0" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 785 | 786 | [[package]] 787 | name = "parking_lot" 788 | version = "0.12.3" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 791 | dependencies = [ 792 | "lock_api", 793 | "parking_lot_core", 794 | ] 795 | 796 | [[package]] 797 | name = "parking_lot_core" 798 | version = "0.9.10" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 801 | dependencies = [ 802 | "cfg-if", 803 | "libc", 804 | "redox_syscall", 805 | "smallvec", 806 | "windows-targets", 807 | ] 808 | 809 | [[package]] 810 | name = "paste" 811 | version = "1.0.15" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 814 | 815 | [[package]] 816 | name = "pin-project-lite" 817 | version = "0.2.14" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 820 | 821 | [[package]] 822 | name = "pin-utils" 823 | version = "0.1.0" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 826 | 827 | [[package]] 828 | name = "powerfmt" 829 | version = "0.2.0" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 832 | 833 | [[package]] 834 | name = "ppv-lite86" 835 | version = "0.2.20" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 838 | dependencies = [ 839 | "zerocopy", 840 | ] 841 | 842 | [[package]] 843 | name = "proc-macro2" 844 | version = "1.0.92" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" 847 | dependencies = [ 848 | "unicode-ident", 849 | ] 850 | 851 | [[package]] 852 | name = "quote" 853 | version = "1.0.36" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 856 | dependencies = [ 857 | "proc-macro2", 858 | ] 859 | 860 | [[package]] 861 | name = "rand" 862 | version = "0.8.5" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 865 | dependencies = [ 866 | "libc", 867 | "rand_chacha", 868 | "rand_core", 869 | ] 870 | 871 | [[package]] 872 | name = "rand_chacha" 873 | version = "0.3.1" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 876 | dependencies = [ 877 | "ppv-lite86", 878 | "rand_core", 879 | ] 880 | 881 | [[package]] 882 | name = "rand_core" 883 | version = "0.6.4" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 886 | dependencies = [ 887 | "getrandom", 888 | ] 889 | 890 | [[package]] 891 | name = "rand_pcg" 892 | version = "0.3.1" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" 895 | dependencies = [ 896 | "rand_core", 897 | ] 898 | 899 | [[package]] 900 | name = "ratatui" 901 | version = "0.29.0" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" 904 | dependencies = [ 905 | "bitflags", 906 | "cassowary", 907 | "compact_str", 908 | "crossterm", 909 | "indoc", 910 | "instability", 911 | "itertools", 912 | "lru", 913 | "paste", 914 | "strum", 915 | "time", 916 | "unicode-segmentation", 917 | "unicode-truncate", 918 | "unicode-width 0.2.0", 919 | ] 920 | 921 | [[package]] 922 | name = "redox_syscall" 923 | version = "0.5.3" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" 926 | dependencies = [ 927 | "bitflags", 928 | ] 929 | 930 | [[package]] 931 | name = "rustc-demangle" 932 | version = "0.1.24" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 935 | 936 | [[package]] 937 | name = "rustix" 938 | version = "0.38.34" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 941 | dependencies = [ 942 | "bitflags", 943 | "errno", 944 | "libc", 945 | "linux-raw-sys", 946 | "windows-sys", 947 | ] 948 | 949 | [[package]] 950 | name = "rustversion" 951 | version = "1.0.17" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" 954 | 955 | [[package]] 956 | name = "ryu" 957 | version = "1.0.18" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 960 | 961 | [[package]] 962 | name = "scopeguard" 963 | version = "1.2.0" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 966 | 967 | [[package]] 968 | name = "scylla" 969 | version = "0.15.1" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "f0408e59e11f589071d1cefc3928270aa8fe4d03f654cb118e0c24d16013ea82" 972 | dependencies = [ 973 | "arc-swap", 974 | "async-trait", 975 | "byteorder", 976 | "bytes", 977 | "chrono", 978 | "dashmap", 979 | "futures", 980 | "hashbrown", 981 | "histogram", 982 | "itertools", 983 | "lazy_static", 984 | "lz4_flex", 985 | "rand", 986 | "rand_pcg", 987 | "scylla-cql", 988 | "scylla-macros", 989 | "smallvec", 990 | "snap", 991 | "socket2", 992 | "thiserror", 993 | "tokio", 994 | "tracing", 995 | "uuid", 996 | ] 997 | 998 | [[package]] 999 | name = "scylla-cql" 1000 | version = "0.4.1" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "a0cefd8b924bb8f67525937a811038d5662f9febc30c74c778a8205f63c4b365" 1003 | dependencies = [ 1004 | "async-trait", 1005 | "byteorder", 1006 | "bytes", 1007 | "lz4_flex", 1008 | "scylla-macros", 1009 | "snap", 1010 | "stable_deref_trait", 1011 | "thiserror", 1012 | "tokio", 1013 | "uuid", 1014 | "yoke", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "scylla-macros" 1019 | version = "0.7.1" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "e878bfb8a235207864ac3fb0b51d7954c77fd38486e0e4fb4e037935ff7eb46c" 1022 | dependencies = [ 1023 | "darling", 1024 | "proc-macro2", 1025 | "quote", 1026 | "syn", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "scyllash" 1031 | version = "0.1.0" 1032 | dependencies = [ 1033 | "chrono", 1034 | "clap", 1035 | "color-eyre", 1036 | "ratatui", 1037 | "scylla", 1038 | "serde", 1039 | "tokio", 1040 | "toml", 1041 | "uuid", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "serde" 1046 | version = "1.0.217" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1049 | dependencies = [ 1050 | "serde_derive", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "serde_derive" 1055 | version = "1.0.217" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1058 | dependencies = [ 1059 | "proc-macro2", 1060 | "quote", 1061 | "syn", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "serde_spanned" 1066 | version = "0.6.7" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" 1069 | dependencies = [ 1070 | "serde", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "sharded-slab" 1075 | version = "0.1.7" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1078 | dependencies = [ 1079 | "lazy_static", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "shlex" 1084 | version = "1.3.0" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1087 | 1088 | [[package]] 1089 | name = "signal-hook" 1090 | version = "0.3.17" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1093 | dependencies = [ 1094 | "libc", 1095 | "signal-hook-registry", 1096 | ] 1097 | 1098 | [[package]] 1099 | name = "signal-hook-mio" 1100 | version = "0.2.4" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" 1103 | dependencies = [ 1104 | "libc", 1105 | "mio", 1106 | "signal-hook", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "signal-hook-registry" 1111 | version = "1.4.2" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1114 | dependencies = [ 1115 | "libc", 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "slab" 1120 | version = "0.4.9" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1123 | dependencies = [ 1124 | "autocfg", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "smallvec" 1129 | version = "1.13.2" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1132 | 1133 | [[package]] 1134 | name = "snap" 1135 | version = "1.1.1" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" 1138 | 1139 | [[package]] 1140 | name = "socket2" 1141 | version = "0.5.7" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1144 | dependencies = [ 1145 | "libc", 1146 | "windows-sys", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "stable_deref_trait" 1151 | version = "1.2.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1154 | 1155 | [[package]] 1156 | name = "static_assertions" 1157 | version = "1.1.0" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1160 | 1161 | [[package]] 1162 | name = "strsim" 1163 | version = "0.11.1" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1166 | 1167 | [[package]] 1168 | name = "strum" 1169 | version = "0.26.3" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1172 | dependencies = [ 1173 | "strum_macros", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "strum_macros" 1178 | version = "0.26.4" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1181 | dependencies = [ 1182 | "heck", 1183 | "proc-macro2", 1184 | "quote", 1185 | "rustversion", 1186 | "syn", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "syn" 1191 | version = "2.0.90" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" 1194 | dependencies = [ 1195 | "proc-macro2", 1196 | "quote", 1197 | "unicode-ident", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "synstructure" 1202 | version = "0.13.1" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1205 | dependencies = [ 1206 | "proc-macro2", 1207 | "quote", 1208 | "syn", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "thiserror" 1213 | version = "2.0.7" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" 1216 | dependencies = [ 1217 | "thiserror-impl", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "thiserror-impl" 1222 | version = "2.0.7" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" 1225 | dependencies = [ 1226 | "proc-macro2", 1227 | "quote", 1228 | "syn", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "thread_local" 1233 | version = "1.1.8" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1236 | dependencies = [ 1237 | "cfg-if", 1238 | "once_cell", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "time" 1243 | version = "0.3.36" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 1246 | dependencies = [ 1247 | "deranged", 1248 | "libc", 1249 | "num-conv", 1250 | "num_threads", 1251 | "powerfmt", 1252 | "serde", 1253 | "time-core", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "time-core" 1258 | version = "0.1.2" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1261 | 1262 | [[package]] 1263 | name = "tokio" 1264 | version = "1.43.0" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 1267 | dependencies = [ 1268 | "backtrace", 1269 | "bytes", 1270 | "libc", 1271 | "mio", 1272 | "parking_lot", 1273 | "pin-project-lite", 1274 | "signal-hook-registry", 1275 | "socket2", 1276 | "tokio-macros", 1277 | "windows-sys", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "tokio-macros" 1282 | version = "2.5.0" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1285 | dependencies = [ 1286 | "proc-macro2", 1287 | "quote", 1288 | "syn", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "toml" 1293 | version = "0.8.19" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 1296 | dependencies = [ 1297 | "serde", 1298 | "serde_spanned", 1299 | "toml_datetime", 1300 | "toml_edit", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "toml_datetime" 1305 | version = "0.6.8" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1308 | dependencies = [ 1309 | "serde", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "toml_edit" 1314 | version = "0.22.20" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" 1317 | dependencies = [ 1318 | "indexmap", 1319 | "serde", 1320 | "serde_spanned", 1321 | "toml_datetime", 1322 | "winnow", 1323 | ] 1324 | 1325 | [[package]] 1326 | name = "tracing" 1327 | version = "0.1.40" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1330 | dependencies = [ 1331 | "pin-project-lite", 1332 | "tracing-attributes", 1333 | "tracing-core", 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "tracing-attributes" 1338 | version = "0.1.27" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1341 | dependencies = [ 1342 | "proc-macro2", 1343 | "quote", 1344 | "syn", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "tracing-core" 1349 | version = "0.1.32" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1352 | dependencies = [ 1353 | "once_cell", 1354 | "valuable", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "tracing-error" 1359 | version = "0.2.0" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" 1362 | dependencies = [ 1363 | "tracing", 1364 | "tracing-subscriber", 1365 | ] 1366 | 1367 | [[package]] 1368 | name = "tracing-subscriber" 1369 | version = "0.3.18" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1372 | dependencies = [ 1373 | "sharded-slab", 1374 | "thread_local", 1375 | "tracing-core", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "twox-hash" 1380 | version = "1.6.3" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" 1383 | dependencies = [ 1384 | "cfg-if", 1385 | "static_assertions", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "unicode-ident" 1390 | version = "1.0.12" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1393 | 1394 | [[package]] 1395 | name = "unicode-segmentation" 1396 | version = "1.11.0" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 1399 | 1400 | [[package]] 1401 | name = "unicode-truncate" 1402 | version = "1.1.0" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" 1405 | dependencies = [ 1406 | "itertools", 1407 | "unicode-segmentation", 1408 | "unicode-width 0.1.13", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "unicode-width" 1413 | version = "0.1.13" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" 1416 | 1417 | [[package]] 1418 | name = "unicode-width" 1419 | version = "0.2.0" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 1422 | 1423 | [[package]] 1424 | name = "utf8parse" 1425 | version = "0.2.2" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1428 | 1429 | [[package]] 1430 | name = "uuid" 1431 | version = "1.12.1" 1432 | source = "registry+https://github.com/rust-lang/crates.io-index" 1433 | checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" 1434 | dependencies = [ 1435 | "atomic", 1436 | "getrandom", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "valuable" 1441 | version = "0.1.0" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 1444 | 1445 | [[package]] 1446 | name = "version_check" 1447 | version = "0.9.5" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1450 | 1451 | [[package]] 1452 | name = "wasi" 1453 | version = "0.11.0+wasi-snapshot-preview1" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1456 | 1457 | [[package]] 1458 | name = "wasm-bindgen" 1459 | version = "0.2.93" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" 1462 | dependencies = [ 1463 | "cfg-if", 1464 | "once_cell", 1465 | "wasm-bindgen-macro", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "wasm-bindgen-backend" 1470 | version = "0.2.93" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" 1473 | dependencies = [ 1474 | "bumpalo", 1475 | "log", 1476 | "once_cell", 1477 | "proc-macro2", 1478 | "quote", 1479 | "syn", 1480 | "wasm-bindgen-shared", 1481 | ] 1482 | 1483 | [[package]] 1484 | name = "wasm-bindgen-macro" 1485 | version = "0.2.93" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" 1488 | dependencies = [ 1489 | "quote", 1490 | "wasm-bindgen-macro-support", 1491 | ] 1492 | 1493 | [[package]] 1494 | name = "wasm-bindgen-macro-support" 1495 | version = "0.2.93" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" 1498 | dependencies = [ 1499 | "proc-macro2", 1500 | "quote", 1501 | "syn", 1502 | "wasm-bindgen-backend", 1503 | "wasm-bindgen-shared", 1504 | ] 1505 | 1506 | [[package]] 1507 | name = "wasm-bindgen-shared" 1508 | version = "0.2.93" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" 1511 | 1512 | [[package]] 1513 | name = "winapi" 1514 | version = "0.3.9" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1517 | dependencies = [ 1518 | "winapi-i686-pc-windows-gnu", 1519 | "winapi-x86_64-pc-windows-gnu", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "winapi-i686-pc-windows-gnu" 1524 | version = "0.4.0" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1527 | 1528 | [[package]] 1529 | name = "winapi-x86_64-pc-windows-gnu" 1530 | version = "0.4.0" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1533 | 1534 | [[package]] 1535 | name = "windows-core" 1536 | version = "0.52.0" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1539 | dependencies = [ 1540 | "windows-targets", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "windows-sys" 1545 | version = "0.52.0" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1548 | dependencies = [ 1549 | "windows-targets", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "windows-targets" 1554 | version = "0.52.6" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1557 | dependencies = [ 1558 | "windows_aarch64_gnullvm", 1559 | "windows_aarch64_msvc", 1560 | "windows_i686_gnu", 1561 | "windows_i686_gnullvm", 1562 | "windows_i686_msvc", 1563 | "windows_x86_64_gnu", 1564 | "windows_x86_64_gnullvm", 1565 | "windows_x86_64_msvc", 1566 | ] 1567 | 1568 | [[package]] 1569 | name = "windows_aarch64_gnullvm" 1570 | version = "0.52.6" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1573 | 1574 | [[package]] 1575 | name = "windows_aarch64_msvc" 1576 | version = "0.52.6" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1579 | 1580 | [[package]] 1581 | name = "windows_i686_gnu" 1582 | version = "0.52.6" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1585 | 1586 | [[package]] 1587 | name = "windows_i686_gnullvm" 1588 | version = "0.52.6" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1591 | 1592 | [[package]] 1593 | name = "windows_i686_msvc" 1594 | version = "0.52.6" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1597 | 1598 | [[package]] 1599 | name = "windows_x86_64_gnu" 1600 | version = "0.52.6" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1603 | 1604 | [[package]] 1605 | name = "windows_x86_64_gnullvm" 1606 | version = "0.52.6" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1609 | 1610 | [[package]] 1611 | name = "windows_x86_64_msvc" 1612 | version = "0.52.6" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1615 | 1616 | [[package]] 1617 | name = "winnow" 1618 | version = "0.6.18" 1619 | source = "registry+https://github.com/rust-lang/crates.io-index" 1620 | checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" 1621 | dependencies = [ 1622 | "memchr", 1623 | ] 1624 | 1625 | [[package]] 1626 | name = "yoke" 1627 | version = "0.7.4" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" 1630 | dependencies = [ 1631 | "serde", 1632 | "stable_deref_trait", 1633 | "yoke-derive", 1634 | "zerofrom", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "yoke-derive" 1639 | version = "0.7.4" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" 1642 | dependencies = [ 1643 | "proc-macro2", 1644 | "quote", 1645 | "syn", 1646 | "synstructure", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "zerocopy" 1651 | version = "0.7.35" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1654 | dependencies = [ 1655 | "byteorder", 1656 | "zerocopy-derive", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "zerocopy-derive" 1661 | version = "0.7.35" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1664 | dependencies = [ 1665 | "proc-macro2", 1666 | "quote", 1667 | "syn", 1668 | ] 1669 | 1670 | [[package]] 1671 | name = "zerofrom" 1672 | version = "0.1.4" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" 1675 | dependencies = [ 1676 | "zerofrom-derive", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "zerofrom-derive" 1681 | version = "0.1.4" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" 1684 | dependencies = [ 1685 | "proc-macro2", 1686 | "quote", 1687 | "syn", 1688 | "synstructure", 1689 | ] 1690 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "scyllash" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | chrono = "0.4.39" 8 | clap = { version = "4.5.27", features = ["derive"] } 9 | color-eyre = "0.6.3" 10 | ratatui = { version = "0.29.0", features = ["all-widgets"] } 11 | scylla = "0.15.1" 12 | serde = { version = "1.0.217", features = ["derive"] } 13 | tokio = { version = "1.43.0", features = ["full"] } 14 | toml = "0.8.19" 15 | uuid = { version = "1.12.1", features = ["v1", "v4"] } 16 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CARGO := $(shell command -v cargo 2> /dev/null) 2 | 3 | ifndef CARGO 4 | $(error "Cannot find cargo. Please install and try again!") 5 | endif 6 | 7 | all: help 8 | 9 | .PHONY: clean 10 | clean: ## Cleans up the project by removing the target directory. 11 | @$(CARGO) clean 12 | 13 | .PHONY: lint 14 | lint: ## Runs Clippy to lint the codebase. 15 | @$(CARGO) clippy --no-deps 16 | 17 | .PHONY: format 18 | format: ## Formats the codebase using rustfmt. 19 | @$(CARGO) fmt 20 | 21 | .PHONY: check 22 | check: format lint ## Formats the codebase and then lints it. 23 | 24 | .PHONY: build 25 | build: ## Compiles the project. 26 | @$(CARGO) build 27 | 28 | .PHONY: debug 29 | debug: ## Compiles and runs the project. 30 | @$(CARGO) run 31 | 32 | .PHONY: run 33 | run: ## Compiles and runs the project. 34 | @$(CARGO) run --release 35 | 36 | .PHONY: test 37 | test: ## Runs the test suite. 38 | @$(CARGO) test 39 | 40 | .PHONY: release 41 | release: clean ## Cleans up the project and compiles it for release profile. 42 | @$(CARGO) build --release --locked 43 | 44 | .PHONY: help 45 | help: ## Shows the help message with available commands. 46 | @echo "Available commands:" 47 | @grep -E '^[^[:space:]]+:[^:]*?## .*$$' $(MAKEFILE_LIST) | \ 48 | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-30s\033[0m %s\n", $$1, $$2}' 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

ScyllaSH

2 | 3 | 4 | 5 | > A Better CQLsh REPL Built in Rust 6 | 7 | **ScyllaSH** is a powerful and user-friendly REPL (Read-Eval-Print Loop) for ScyllaDB and Cassandra, designed to be a 8 | superior alternative to the default `cqlsh`. Built with Rust and leveraging the `ratatui` library for an enhanced 9 | terminal interface, ScyllaSH offers a range of features that make working with CQL (Cassandra Query Language) more 10 | efficient and enjoyable. 11 | 12 | ## Key Features 13 | 14 | - **Enhanced REPL Experience**: ScyllaSH provides a more intuitive and responsive command-line interface, making it 15 | easier to execute CQL commands, navigate history, and manage sessions. 16 | 17 | - **Real-Time Metrics**: Monitor key metrics directly within the REPL. ScyllaSH displays performance statistics such as 18 | query latency, node health, and resource utilization, enabling you to make informed decisions as you work. 19 | 20 | - **Auto-Completion**: ScyllaSH includes advanced auto-completion for CQL keywords, table names, and columns, reducing 21 | the need for constant reference checking and speeding up your workflow. 22 | 23 | - **Syntax Highlighting**: With built-in syntax highlighting, ScyllaSH helps you spot errors and understand complex 24 | queries at a glance. 25 | 26 | - **Improved History Management**: ScyllaSH retains your command history across sessions, making it easy to recall and 27 | re-execute previous commands. 28 | 29 | - **Customizable Settings**: Tailor the REPL environment to your preferences with configurable settings for colors, 30 | prompts, and more. 31 | 32 | - **Extensible with Plugins**: ScyllaSH supports plugins, allowing you to extend its functionality with custom commands, 33 | integrations, and tools. 34 | 35 | ## Installation 36 | 37 | ScyllaSH is distributed as a standalone binary. You can install it via Cargo (Rust's package manager) or download the 38 | pre-built binaries from the [releases page](https://github.com/your-repo/ScyllaSH/releases). 39 | 40 | ### Via Cargo 41 | 42 | ```bash 43 | cargo install scyllash 44 | ``` 45 | 46 | ### Pre-built Binary 47 | 48 | 1. Download the appropriate binary for your operating system from 49 | the [releases page](https://github.com/your-repo/ScyllaSH/releases). 50 | 2. Extract the binary to a directory in your `$PATH`. 51 | 3. Run `scyllash` from your terminal. 52 | 53 | ## Usage 54 | 55 | To start ScyllaSH, simply run: 56 | 57 | ```bash 58 | scyllash 59 | ``` 60 | 61 | By default, ScyllaSH will attempt to connect to a ScyllaDB or Cassandra instance running on `localhost` at the default 62 | CQL port (`9042`). You can specify a different host and port using command-line arguments: 63 | 64 | ```bash 65 | scyllash --host --port 66 | ``` 67 | 68 | Once connected, you'll be greeted with the ScyllaSH prompt where you can start entering CQL commands. Use `Ctrl+D` to 69 | exit the REPL. 70 | 71 | ## Configuration 72 | 73 | ScyllaSH can be configured using a configuration file located at `~/.config/scyllash/config.toml`. Here, you can 74 | customize various aspects of the REPL, such as: 75 | 76 | - Prompt style 77 | - Color scheme 78 | - Metrics display options 79 | - Plugin settings 80 | 81 | Example configuration file: 82 | 83 | ```toml 84 | [connection] 85 | hostname = "127.0.0.1" 86 | port = 9042 87 | username = "scylla" 88 | password = "" 89 | timeout = 10 90 | 91 | # [scyllash] 92 | # prompt = "scyllash> " 93 | # color_scheme = "solarized_dark" 94 | 95 | # [cql] 96 | # version = "3.3.1" 97 | 98 | # [metrics] 99 | # enabled = true 100 | # refresh_interval = 5 101 | ``` 102 | 103 | ## Contributing 104 | 105 | We welcome contributions from the community! Whether it's bug reports, feature requests, or pull requests, your help is 106 | appreciated. Please check out our [contributing guide](CONTRIBUTING.md) for more details. 107 | 108 | ## License 109 | 110 | ScyllaSH is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. 111 | 112 | ## Acknowledgments 113 | 114 | ScyllaSH is inspired by the need for a more powerful and flexible CQLsh experience. Special thanks to the creators of 115 | Rust, Ratatui, and ScyllaDB for providing the tools and inspiration to make this project possible. 116 | 117 | --- 118 | 119 | Start supercharging your CQLsh experience today with ScyllaSH! 🚀 120 | -------------------------------------------------------------------------------- /default_config.toml: -------------------------------------------------------------------------------- 1 | [connection] 2 | hostname = "127.0.0.1" 3 | port = 9042 4 | username = "scylla" 5 | password = "" 6 | timeout = 10 7 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | version = "Two" 2 | edition = "2021" 3 | tab_spaces = 2 -------------------------------------------------------------------------------- /src/app/mod.rs: -------------------------------------------------------------------------------- 1 | use color_eyre::eyre::{Context, Result}; 2 | use ratatui::{ 3 | Frame, 4 | crossterm::event::{self, Event, KeyEventKind}, 5 | prelude::*, 6 | widgets::{Block, Borders, Paragraph, Widget, Wrap}, 7 | }; 8 | 9 | use crate::tui::Tui; 10 | 11 | #[derive(Debug, Default)] 12 | pub struct App { 13 | exit: bool, 14 | } 15 | 16 | impl App { 17 | pub fn run(&mut self, terminal: &mut Tui) -> Result<()> { 18 | while !self.exit { 19 | terminal.draw(|frame| self.render_frame(frame))?; 20 | self.handle_events().wrap_err("handle events failed")?; 21 | } 22 | Ok(()) 23 | } 24 | 25 | fn render_frame(&self, frame: &mut Frame) { 26 | frame.render_widget(self, frame.area()); 27 | } 28 | 29 | fn handle_events(&mut self) -> Result<()> { 30 | match event::read()? { 31 | // it's important to check that the event is a key press event as 32 | // crossterm also emits key release and repeat events on Windows. 33 | Event::Key(key_event) if key_event.kind == KeyEventKind::Press => self 34 | .handle_key_event(key_event) 35 | .wrap_err_with(|| format!("handling key event failed:\n{key_event:#?}")), 36 | _ => Ok(()), 37 | }?; 38 | Ok(()) 39 | } 40 | 41 | fn handle_key_event(&mut self, key_event: event::KeyEvent) -> Result<()> { 42 | #[allow(clippy::single_match)] 43 | match key_event.code { 44 | event::KeyCode::Char('q') => self.exit(), 45 | _ => {} 46 | } 47 | Ok(()) 48 | } 49 | 50 | fn exit(&mut self) { 51 | self.exit = true; 52 | } 53 | 54 | fn sidebar(area: Rect, buf: &mut Buffer) { 55 | let layout = Layout::default() 56 | .direction(Direction::Vertical) 57 | .constraints(vec![Constraint::Percentage(10), Constraint::Percentage(90)]) 58 | .split(area); 59 | 60 | Paragraph::new("Select your keyspace") 61 | .block(Block::new().borders(Borders::ALL)) 62 | .render(layout[0], buf); 63 | 64 | Paragraph::new("List of keyspaces will be here") 65 | .wrap(Wrap { trim: false }) 66 | .block(Block::new().borders(Borders::ALL)) 67 | .render(layout[1], buf); 68 | } 69 | 70 | fn content(area: Rect, buf: &mut Buffer) { 71 | let layout = Layout::default() 72 | .direction(Direction::Vertical) 73 | .constraints(vec![Constraint::Percentage(10), Constraint::Percentage(90)]) 74 | .split(area); 75 | 76 | Paragraph::new("ScyllaSH 0.0.1") 77 | .block(Block::new().borders(Borders::ALL)) 78 | .render(layout[0], buf); 79 | 80 | Paragraph::new("REPL will be here") 81 | .block(Block::new().borders(Borders::ALL)) 82 | .render(layout[1], buf); 83 | } 84 | } 85 | 86 | impl Widget for &App { 87 | fn render(self, area: Rect, buf: &mut Buffer) 88 | where 89 | Self: Sized, 90 | { 91 | let [sidebar_area, content_area] = 92 | Layout::horizontal([Constraint::Length(30), Constraint::Fill(1)]).areas(area); 93 | 94 | App::sidebar(sidebar_area, buf); 95 | App::content(content_area, buf); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/args.rs: -------------------------------------------------------------------------------- 1 | use clap::{Args, Parser, Subcommand}; 2 | use serde::{Deserialize, Serialize}; 3 | use std::fs; 4 | use std::fs::File; 5 | use std::io::Write; 6 | use std::path::Path; 7 | 8 | static DEFAULT_SETTINGS_STR: &str = 9 | include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/default_config.toml")); 10 | 11 | static SETTINGS_PATH: &str = concat!(env!("HOME"), "/.config/scyllash"); 12 | 13 | #[derive(Parser)] 14 | #[command(author, version, about, long_about = None)] 15 | pub struct Arguments { 16 | #[command(subcommand)] 17 | pub command: Option, 18 | } 19 | 20 | #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Subcommand)] 21 | pub enum Command { 22 | /// Starts ScyllaSH with a provided connection 23 | Run { 24 | #[command(flatten)] 25 | connection: ConnectionConfig, 26 | }, 27 | } 28 | 29 | #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Args, Deserialize, Serialize)] 30 | pub struct ConnectionConfig { 31 | /// Scylla Host 32 | #[arg(long, default_value_t = get_default_string_value("hostname"))] 33 | pub hostname: String, 34 | /// Scylla User 35 | #[arg(short, long, default_value_t = get_default_string_value("username"))] 36 | pub username: String, 37 | 38 | /// Scylla Password 39 | #[arg(short, long, default_value_t = get_default_string_value("password"))] 40 | pub password: String, 41 | 42 | /// Scylla Timeout 43 | #[arg(short, long, default_value_t = 5)] 44 | pub timeout: u64, 45 | } 46 | 47 | fn get_default_string_value(key: &str) -> String { 48 | let config = ConfigToml::default(); 49 | let connection = config.connection.clone(); 50 | match key { 51 | "hostname" => { 52 | if !config.connection.hostname.is_empty() { 53 | connection.hostname 54 | } else { 55 | String::from("localhost:9042") 56 | } 57 | } 58 | "username" => { 59 | if !config.connection.username.is_empty() { 60 | connection.username 61 | } else { 62 | String::from("scylla") 63 | } 64 | } 65 | "password" => { 66 | if !config.connection.password.is_empty() { 67 | connection.password 68 | } else { 69 | String::from("") 70 | } 71 | } 72 | _ => String::from(""), 73 | } 74 | } 75 | 76 | #[derive(Debug, Deserialize, Serialize)] 77 | pub struct ConfigToml { 78 | pub connection: ConnectionConfig, 79 | } 80 | 81 | impl Default for ConfigToml { 82 | fn default() -> Self { 83 | let settings_path = Path::new(SETTINGS_PATH); 84 | let file_path = settings_path.join("config.toml"); 85 | 86 | if !settings_path.exists() { 87 | println!("No settings directory identified"); 88 | fs::create_dir_all(settings_path).expect("Failed to create settings directory"); 89 | } 90 | 91 | if !file_path.exists() { 92 | println!("No config file identified"); 93 | let mut file = File::create(&file_path).expect("Failed to create settings file"); 94 | file 95 | .write_all(DEFAULT_SETTINGS_STR.as_bytes()) 96 | .expect("Failed to write default settings"); 97 | } 98 | 99 | let toml_str = fs::read_to_string(&file_path).expect("Failed to read settings file"); 100 | let cargo_toml: ConfigToml = 101 | toml::from_str(&toml_str).expect("Failed to deserialize Cargo.toml"); 102 | 103 | cargo_toml 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod app; 2 | pub mod args; 3 | pub mod tui; 4 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use scyllash::args::Command; 3 | use scyllash::{app::App, args::Arguments, tui}; 4 | 5 | fn main() -> color_eyre::Result<()> { 6 | let args = Arguments::parse(); 7 | 8 | match &args.command { 9 | Some(Command::Run { .. }) => run_interface(), 10 | None => run_interface(), 11 | } 12 | } 13 | 14 | fn run_interface() -> color_eyre::Result<()> { 15 | color_eyre::install()?; 16 | let mut terminal = tui::init()?; 17 | let app_result = App::default().run(&mut terminal); 18 | if let Err(err) = tui::restore() { 19 | eprintln!( 20 | "failed to restore terminal. Run `reset` or restart your terminal to recover: {}", 21 | err 22 | ); 23 | } 24 | app_result 25 | } 26 | -------------------------------------------------------------------------------- /src/tui/mod.rs: -------------------------------------------------------------------------------- 1 | use std::io::{self, Stdout}; 2 | 3 | use ratatui::{ 4 | Terminal, 5 | crossterm::{ 6 | execute, 7 | terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, 8 | }, 9 | prelude::CrosstermBackend, 10 | }; 11 | 12 | /// A type alias for the terminal type used in this application 13 | pub type Tui = Terminal>; 14 | 15 | /// Initialize the terminal 16 | pub fn init() -> io::Result { 17 | execute!(io::stdout(), EnterAlternateScreen)?; 18 | enable_raw_mode()?; 19 | set_panic_hook(); 20 | Terminal::new(CrosstermBackend::new(io::stdout())) 21 | } 22 | 23 | fn set_panic_hook() { 24 | let hook = std::panic::take_hook(); 25 | std::panic::set_hook(Box::new(move |panic_info| { 26 | let _ = restore(); // ignore any errors as we are already failing 27 | hook(panic_info); 28 | })); 29 | } 30 | 31 | /// Restore the terminal to its original state 32 | pub fn restore() -> io::Result<()> { 33 | execute!(io::stdout(), LeaveAlternateScreen)?; 34 | disable_raw_mode()?; 35 | Ok(()) 36 | } 37 | --------------------------------------------------------------------------------