Your one-stop-cake-shop for everything Freshly Baked has to offer

import: add sprinkles to patisserie

Sprinkles is widgets for our Niri desktop. Currently we're working on a
notification daemon, and we plan to move our clock out from PacketMix
into sprinkles as well...

+4053 -3
+4 -3
README.md
··· 7 7 *Patisserie* is a [monorepo](https://en.wikipedia.org/wiki/Monorepo), which means 8 8 there are multiple projects hosted here. Here's a list! 9 9 10 - | Project | Description | 11 - | ----------- | ------------------------------------------------------------------------------------------- | 12 - | *packetmix* | Our [*NixOS*](https://nixos.org) configurations ("All you need to bake a delicious system") | 10 + | Project | Description | 11 + | ----------- | ------------------------------------------------------------------------------------------------- | 12 + | *packetmix* | Our [*NixOS*](https://nixos.org) configurations ("All you need to bake a delicious system") | 13 + | *sprinkles* | Our [*Niri*](https://github.com/YaLTeR/niri) widgets ("Add some decoration to your Niri desktop") | 13 14 14 15 ## Cloning a single project 15 16
+3
sprinkles/.gitignore
··· 1 + /target 2 + test.db 3 + result
+2802
sprinkles/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.1" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 + 20 + [[package]] 21 + name = "allocator-api2" 22 + version = "0.2.21" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 25 + 26 + [[package]] 27 + name = "anstream" 28 + version = "0.6.20" 29 + source = "registry+https://github.com/rust-lang/crates.io-index" 30 + checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 31 + dependencies = [ 32 + "anstyle", 33 + "anstyle-parse", 34 + "anstyle-query", 35 + "anstyle-wincon", 36 + "colorchoice", 37 + "is_terminal_polyfill", 38 + "utf8parse", 39 + ] 40 + 41 + [[package]] 42 + name = "anstyle" 43 + version = "1.0.11" 44 + source = "registry+https://github.com/rust-lang/crates.io-index" 45 + checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 46 + 47 + [[package]] 48 + name = "anstyle-parse" 49 + version = "0.2.7" 50 + source = "registry+https://github.com/rust-lang/crates.io-index" 51 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 52 + dependencies = [ 53 + "utf8parse", 54 + ] 55 + 56 + [[package]] 57 + name = "anstyle-query" 58 + version = "1.1.4" 59 + source = "registry+https://github.com/rust-lang/crates.io-index" 60 + checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 61 + dependencies = [ 62 + "windows-sys 0.60.2", 63 + ] 64 + 65 + [[package]] 66 + name = "anstyle-wincon" 67 + version = "3.0.10" 68 + source = "registry+https://github.com/rust-lang/crates.io-index" 69 + checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 70 + dependencies = [ 71 + "anstyle", 72 + "once_cell_polyfill", 73 + "windows-sys 0.60.2", 74 + ] 75 + 76 + [[package]] 77 + name = "async-broadcast" 78 + version = "0.7.2" 79 + source = "registry+https://github.com/rust-lang/crates.io-index" 80 + checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 81 + dependencies = [ 82 + "event-listener", 83 + "event-listener-strategy", 84 + "futures-core", 85 + "pin-project-lite", 86 + ] 87 + 88 + [[package]] 89 + name = "async-channel" 90 + version = "2.3.1" 91 + source = "registry+https://github.com/rust-lang/crates.io-index" 92 + checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 93 + dependencies = [ 94 + "concurrent-queue", 95 + "event-listener-strategy", 96 + "futures-core", 97 + "pin-project-lite", 98 + ] 99 + 100 + [[package]] 101 + name = "async-executor" 102 + version = "1.13.2" 103 + source = "registry+https://github.com/rust-lang/crates.io-index" 104 + checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 105 + dependencies = [ 106 + "async-task", 107 + "concurrent-queue", 108 + "fastrand", 109 + "futures-lite", 110 + "pin-project-lite", 111 + "slab", 112 + ] 113 + 114 + [[package]] 115 + name = "async-io" 116 + version = "2.4.1" 117 + source = "registry+https://github.com/rust-lang/crates.io-index" 118 + checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" 119 + dependencies = [ 120 + "async-lock", 121 + "cfg-if", 122 + "concurrent-queue", 123 + "futures-io", 124 + "futures-lite", 125 + "parking", 126 + "polling", 127 + "rustix", 128 + "slab", 129 + "tracing", 130 + "windows-sys 0.59.0", 131 + ] 132 + 133 + [[package]] 134 + name = "async-lock" 135 + version = "3.4.0" 136 + source = "registry+https://github.com/rust-lang/crates.io-index" 137 + checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 138 + dependencies = [ 139 + "event-listener", 140 + "event-listener-strategy", 141 + "pin-project-lite", 142 + ] 143 + 144 + [[package]] 145 + name = "async-process" 146 + version = "2.3.1" 147 + source = "registry+https://github.com/rust-lang/crates.io-index" 148 + checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" 149 + dependencies = [ 150 + "async-channel", 151 + "async-io", 152 + "async-lock", 153 + "async-signal", 154 + "async-task", 155 + "blocking", 156 + "cfg-if", 157 + "event-listener", 158 + "futures-lite", 159 + "rustix", 160 + "tracing", 161 + ] 162 + 163 + [[package]] 164 + name = "async-recursion" 165 + version = "1.1.1" 166 + source = "registry+https://github.com/rust-lang/crates.io-index" 167 + checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 168 + dependencies = [ 169 + "proc-macro2", 170 + "quote", 171 + "syn", 172 + ] 173 + 174 + [[package]] 175 + name = "async-signal" 176 + version = "0.2.11" 177 + source = "registry+https://github.com/rust-lang/crates.io-index" 178 + checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" 179 + dependencies = [ 180 + "async-io", 181 + "async-lock", 182 + "atomic-waker", 183 + "cfg-if", 184 + "futures-core", 185 + "futures-io", 186 + "rustix", 187 + "signal-hook-registry", 188 + "slab", 189 + "windows-sys 0.59.0", 190 + ] 191 + 192 + [[package]] 193 + name = "async-task" 194 + version = "4.7.1" 195 + source = "registry+https://github.com/rust-lang/crates.io-index" 196 + checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 197 + 198 + [[package]] 199 + name = "async-trait" 200 + version = "0.1.88" 201 + source = "registry+https://github.com/rust-lang/crates.io-index" 202 + checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 203 + dependencies = [ 204 + "proc-macro2", 205 + "quote", 206 + "syn", 207 + ] 208 + 209 + [[package]] 210 + name = "atoi" 211 + version = "2.0.0" 212 + source = "registry+https://github.com/rust-lang/crates.io-index" 213 + checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 214 + dependencies = [ 215 + "num-traits", 216 + ] 217 + 218 + [[package]] 219 + name = "atomic-waker" 220 + version = "1.1.2" 221 + source = "registry+https://github.com/rust-lang/crates.io-index" 222 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 223 + 224 + [[package]] 225 + name = "autocfg" 226 + version = "1.5.0" 227 + source = "registry+https://github.com/rust-lang/crates.io-index" 228 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 229 + 230 + [[package]] 231 + name = "backtrace" 232 + version = "0.3.75" 233 + source = "registry+https://github.com/rust-lang/crates.io-index" 234 + checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 235 + dependencies = [ 236 + "addr2line", 237 + "cfg-if", 238 + "libc", 239 + "miniz_oxide", 240 + "object", 241 + "rustc-demangle", 242 + "windows-targets 0.52.6", 243 + ] 244 + 245 + [[package]] 246 + name = "base64" 247 + version = "0.22.1" 248 + source = "registry+https://github.com/rust-lang/crates.io-index" 249 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 250 + 251 + [[package]] 252 + name = "base64ct" 253 + version = "1.8.0" 254 + source = "registry+https://github.com/rust-lang/crates.io-index" 255 + checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 256 + 257 + [[package]] 258 + name = "bitflags" 259 + version = "2.9.1" 260 + source = "registry+https://github.com/rust-lang/crates.io-index" 261 + checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 262 + dependencies = [ 263 + "serde", 264 + ] 265 + 266 + [[package]] 267 + name = "block-buffer" 268 + version = "0.10.4" 269 + source = "registry+https://github.com/rust-lang/crates.io-index" 270 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 271 + dependencies = [ 272 + "generic-array", 273 + ] 274 + 275 + [[package]] 276 + name = "blocking" 277 + version = "1.6.1" 278 + source = "registry+https://github.com/rust-lang/crates.io-index" 279 + checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 280 + dependencies = [ 281 + "async-channel", 282 + "async-task", 283 + "futures-io", 284 + "futures-lite", 285 + "piper", 286 + ] 287 + 288 + [[package]] 289 + name = "bumpalo" 290 + version = "3.19.0" 291 + source = "registry+https://github.com/rust-lang/crates.io-index" 292 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 293 + 294 + [[package]] 295 + name = "byteorder" 296 + version = "1.5.0" 297 + source = "registry+https://github.com/rust-lang/crates.io-index" 298 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 299 + 300 + [[package]] 301 + name = "bytes" 302 + version = "1.10.1" 303 + source = "registry+https://github.com/rust-lang/crates.io-index" 304 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 305 + 306 + [[package]] 307 + name = "cc" 308 + version = "1.2.27" 309 + source = "registry+https://github.com/rust-lang/crates.io-index" 310 + checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" 311 + dependencies = [ 312 + "shlex", 313 + ] 314 + 315 + [[package]] 316 + name = "cfg-if" 317 + version = "1.0.1" 318 + source = "registry+https://github.com/rust-lang/crates.io-index" 319 + checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 320 + 321 + [[package]] 322 + name = "cfg_aliases" 323 + version = "0.2.1" 324 + source = "registry+https://github.com/rust-lang/crates.io-index" 325 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 326 + 327 + [[package]] 328 + name = "clap" 329 + version = "4.5.45" 330 + source = "registry+https://github.com/rust-lang/crates.io-index" 331 + checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" 332 + dependencies = [ 333 + "clap_builder", 334 + "clap_derive", 335 + ] 336 + 337 + [[package]] 338 + name = "clap_builder" 339 + version = "4.5.44" 340 + source = "registry+https://github.com/rust-lang/crates.io-index" 341 + checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" 342 + dependencies = [ 343 + "anstream", 344 + "anstyle", 345 + "clap_lex", 346 + "strsim", 347 + ] 348 + 349 + [[package]] 350 + name = "clap_derive" 351 + version = "4.5.45" 352 + source = "registry+https://github.com/rust-lang/crates.io-index" 353 + checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" 354 + dependencies = [ 355 + "heck", 356 + "proc-macro2", 357 + "quote", 358 + "syn", 359 + ] 360 + 361 + [[package]] 362 + name = "clap_lex" 363 + version = "0.7.5" 364 + source = "registry+https://github.com/rust-lang/crates.io-index" 365 + checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" 366 + 367 + [[package]] 368 + name = "colorchoice" 369 + version = "1.0.4" 370 + source = "registry+https://github.com/rust-lang/crates.io-index" 371 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 372 + 373 + [[package]] 374 + name = "concurrent-queue" 375 + version = "2.5.0" 376 + source = "registry+https://github.com/rust-lang/crates.io-index" 377 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 378 + dependencies = [ 379 + "crossbeam-utils", 380 + ] 381 + 382 + [[package]] 383 + name = "const-oid" 384 + version = "0.9.6" 385 + source = "registry+https://github.com/rust-lang/crates.io-index" 386 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 387 + 388 + [[package]] 389 + name = "cpufeatures" 390 + version = "0.2.17" 391 + source = "registry+https://github.com/rust-lang/crates.io-index" 392 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 393 + dependencies = [ 394 + "libc", 395 + ] 396 + 397 + [[package]] 398 + name = "crc" 399 + version = "3.3.0" 400 + source = "registry+https://github.com/rust-lang/crates.io-index" 401 + checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" 402 + dependencies = [ 403 + "crc-catalog", 404 + ] 405 + 406 + [[package]] 407 + name = "crc-catalog" 408 + version = "2.4.0" 409 + source = "registry+https://github.com/rust-lang/crates.io-index" 410 + checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 411 + 412 + [[package]] 413 + name = "crossbeam-queue" 414 + version = "0.3.12" 415 + source = "registry+https://github.com/rust-lang/crates.io-index" 416 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 417 + dependencies = [ 418 + "crossbeam-utils", 419 + ] 420 + 421 + [[package]] 422 + name = "crossbeam-utils" 423 + version = "0.8.21" 424 + source = "registry+https://github.com/rust-lang/crates.io-index" 425 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 426 + 427 + [[package]] 428 + name = "crypto-common" 429 + version = "0.1.6" 430 + source = "registry+https://github.com/rust-lang/crates.io-index" 431 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 432 + dependencies = [ 433 + "generic-array", 434 + "typenum", 435 + ] 436 + 437 + [[package]] 438 + name = "der" 439 + version = "0.7.10" 440 + source = "registry+https://github.com/rust-lang/crates.io-index" 441 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 442 + dependencies = [ 443 + "const-oid", 444 + "pem-rfc7468", 445 + "zeroize", 446 + ] 447 + 448 + [[package]] 449 + name = "digest" 450 + version = "0.10.7" 451 + source = "registry+https://github.com/rust-lang/crates.io-index" 452 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 453 + dependencies = [ 454 + "block-buffer", 455 + "const-oid", 456 + "crypto-common", 457 + "subtle", 458 + ] 459 + 460 + [[package]] 461 + name = "dirs" 462 + version = "6.0.0" 463 + source = "registry+https://github.com/rust-lang/crates.io-index" 464 + checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" 465 + dependencies = [ 466 + "dirs-sys", 467 + ] 468 + 469 + [[package]] 470 + name = "dirs-sys" 471 + version = "0.5.0" 472 + source = "registry+https://github.com/rust-lang/crates.io-index" 473 + checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" 474 + dependencies = [ 475 + "libc", 476 + "option-ext", 477 + "redox_users", 478 + "windows-sys 0.60.2", 479 + ] 480 + 481 + [[package]] 482 + name = "displaydoc" 483 + version = "0.2.5" 484 + source = "registry+https://github.com/rust-lang/crates.io-index" 485 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 486 + dependencies = [ 487 + "proc-macro2", 488 + "quote", 489 + "syn", 490 + ] 491 + 492 + [[package]] 493 + name = "dotenvy" 494 + version = "0.15.7" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 497 + 498 + [[package]] 499 + name = "either" 500 + version = "1.15.0" 501 + source = "registry+https://github.com/rust-lang/crates.io-index" 502 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 503 + dependencies = [ 504 + "serde", 505 + ] 506 + 507 + [[package]] 508 + name = "endi" 509 + version = "1.1.0" 510 + source = "registry+https://github.com/rust-lang/crates.io-index" 511 + checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 512 + 513 + [[package]] 514 + name = "enumflags2" 515 + version = "0.7.12" 516 + source = "registry+https://github.com/rust-lang/crates.io-index" 517 + checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" 518 + dependencies = [ 519 + "enumflags2_derive", 520 + "serde", 521 + ] 522 + 523 + [[package]] 524 + name = "enumflags2_derive" 525 + version = "0.7.12" 526 + source = "registry+https://github.com/rust-lang/crates.io-index" 527 + checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" 528 + dependencies = [ 529 + "proc-macro2", 530 + "quote", 531 + "syn", 532 + ] 533 + 534 + [[package]] 535 + name = "equivalent" 536 + version = "1.0.2" 537 + source = "registry+https://github.com/rust-lang/crates.io-index" 538 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 539 + 540 + [[package]] 541 + name = "errno" 542 + version = "0.3.13" 543 + source = "registry+https://github.com/rust-lang/crates.io-index" 544 + checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 545 + dependencies = [ 546 + "libc", 547 + "windows-sys 0.60.2", 548 + ] 549 + 550 + [[package]] 551 + name = "etcetera" 552 + version = "0.8.0" 553 + source = "registry+https://github.com/rust-lang/crates.io-index" 554 + checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 555 + dependencies = [ 556 + "cfg-if", 557 + "home", 558 + "windows-sys 0.48.0", 559 + ] 560 + 561 + [[package]] 562 + name = "event-listener" 563 + version = "5.4.0" 564 + source = "registry+https://github.com/rust-lang/crates.io-index" 565 + checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 566 + dependencies = [ 567 + "concurrent-queue", 568 + "parking", 569 + "pin-project-lite", 570 + ] 571 + 572 + [[package]] 573 + name = "event-listener-strategy" 574 + version = "0.5.4" 575 + source = "registry+https://github.com/rust-lang/crates.io-index" 576 + checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 577 + dependencies = [ 578 + "event-listener", 579 + "pin-project-lite", 580 + ] 581 + 582 + [[package]] 583 + name = "fastrand" 584 + version = "2.3.0" 585 + source = "registry+https://github.com/rust-lang/crates.io-index" 586 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 587 + 588 + [[package]] 589 + name = "flume" 590 + version = "0.11.1" 591 + source = "registry+https://github.com/rust-lang/crates.io-index" 592 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 593 + dependencies = [ 594 + "futures-core", 595 + "futures-sink", 596 + "spin", 597 + ] 598 + 599 + [[package]] 600 + name = "foldhash" 601 + version = "0.1.5" 602 + source = "registry+https://github.com/rust-lang/crates.io-index" 603 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 604 + 605 + [[package]] 606 + name = "form_urlencoded" 607 + version = "1.2.1" 608 + source = "registry+https://github.com/rust-lang/crates.io-index" 609 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 610 + dependencies = [ 611 + "percent-encoding", 612 + ] 613 + 614 + [[package]] 615 + name = "futures" 616 + version = "0.3.31" 617 + source = "registry+https://github.com/rust-lang/crates.io-index" 618 + checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 619 + dependencies = [ 620 + "futures-channel", 621 + "futures-core", 622 + "futures-executor", 623 + "futures-io", 624 + "futures-sink", 625 + "futures-task", 626 + "futures-util", 627 + ] 628 + 629 + [[package]] 630 + name = "futures-channel" 631 + version = "0.3.31" 632 + source = "registry+https://github.com/rust-lang/crates.io-index" 633 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 634 + dependencies = [ 635 + "futures-core", 636 + "futures-sink", 637 + ] 638 + 639 + [[package]] 640 + name = "futures-core" 641 + version = "0.3.31" 642 + source = "registry+https://github.com/rust-lang/crates.io-index" 643 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 644 + 645 + [[package]] 646 + name = "futures-executor" 647 + version = "0.3.31" 648 + source = "registry+https://github.com/rust-lang/crates.io-index" 649 + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 650 + dependencies = [ 651 + "futures-core", 652 + "futures-task", 653 + "futures-util", 654 + ] 655 + 656 + [[package]] 657 + name = "futures-intrusive" 658 + version = "0.5.0" 659 + source = "registry+https://github.com/rust-lang/crates.io-index" 660 + checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 661 + dependencies = [ 662 + "futures-core", 663 + "lock_api", 664 + "parking_lot", 665 + ] 666 + 667 + [[package]] 668 + name = "futures-io" 669 + version = "0.3.31" 670 + source = "registry+https://github.com/rust-lang/crates.io-index" 671 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 672 + 673 + [[package]] 674 + name = "futures-lite" 675 + version = "2.6.0" 676 + source = "registry+https://github.com/rust-lang/crates.io-index" 677 + checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 678 + dependencies = [ 679 + "fastrand", 680 + "futures-core", 681 + "futures-io", 682 + "parking", 683 + "pin-project-lite", 684 + ] 685 + 686 + [[package]] 687 + name = "futures-macro" 688 + version = "0.3.31" 689 + source = "registry+https://github.com/rust-lang/crates.io-index" 690 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 691 + dependencies = [ 692 + "proc-macro2", 693 + "quote", 694 + "syn", 695 + ] 696 + 697 + [[package]] 698 + name = "futures-sink" 699 + version = "0.3.31" 700 + source = "registry+https://github.com/rust-lang/crates.io-index" 701 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 702 + 703 + [[package]] 704 + name = "futures-task" 705 + version = "0.3.31" 706 + source = "registry+https://github.com/rust-lang/crates.io-index" 707 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 708 + 709 + [[package]] 710 + name = "futures-util" 711 + version = "0.3.31" 712 + source = "registry+https://github.com/rust-lang/crates.io-index" 713 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 714 + dependencies = [ 715 + "futures-channel", 716 + "futures-core", 717 + "futures-io", 718 + "futures-macro", 719 + "futures-sink", 720 + "futures-task", 721 + "memchr", 722 + "pin-project-lite", 723 + "pin-utils", 724 + "slab", 725 + ] 726 + 727 + [[package]] 728 + name = "generic-array" 729 + version = "0.14.7" 730 + source = "registry+https://github.com/rust-lang/crates.io-index" 731 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 732 + dependencies = [ 733 + "typenum", 734 + "version_check", 735 + ] 736 + 737 + [[package]] 738 + name = "getrandom" 739 + version = "0.2.16" 740 + source = "registry+https://github.com/rust-lang/crates.io-index" 741 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 742 + dependencies = [ 743 + "cfg-if", 744 + "libc", 745 + "wasi 0.11.1+wasi-snapshot-preview1", 746 + ] 747 + 748 + [[package]] 749 + name = "getrandom" 750 + version = "0.3.3" 751 + source = "registry+https://github.com/rust-lang/crates.io-index" 752 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 753 + dependencies = [ 754 + "cfg-if", 755 + "libc", 756 + "r-efi", 757 + "wasi 0.14.2+wasi-0.2.4", 758 + ] 759 + 760 + [[package]] 761 + name = "gimli" 762 + version = "0.31.1" 763 + source = "registry+https://github.com/rust-lang/crates.io-index" 764 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 765 + 766 + [[package]] 767 + name = "glob" 768 + version = "0.3.2" 769 + source = "registry+https://github.com/rust-lang/crates.io-index" 770 + checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 771 + 772 + [[package]] 773 + name = "hashbrown" 774 + version = "0.15.4" 775 + source = "registry+https://github.com/rust-lang/crates.io-index" 776 + checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 777 + dependencies = [ 778 + "allocator-api2", 779 + "equivalent", 780 + "foldhash", 781 + ] 782 + 783 + [[package]] 784 + name = "hashlink" 785 + version = "0.10.0" 786 + source = "registry+https://github.com/rust-lang/crates.io-index" 787 + checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 788 + dependencies = [ 789 + "hashbrown", 790 + ] 791 + 792 + [[package]] 793 + name = "heck" 794 + version = "0.5.0" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 797 + 798 + [[package]] 799 + name = "hermit-abi" 800 + version = "0.5.2" 801 + source = "registry+https://github.com/rust-lang/crates.io-index" 802 + checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" 803 + 804 + [[package]] 805 + name = "hex" 806 + version = "0.4.3" 807 + source = "registry+https://github.com/rust-lang/crates.io-index" 808 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 809 + 810 + [[package]] 811 + name = "hkdf" 812 + version = "0.12.4" 813 + source = "registry+https://github.com/rust-lang/crates.io-index" 814 + checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 815 + dependencies = [ 816 + "hmac", 817 + ] 818 + 819 + [[package]] 820 + name = "hmac" 821 + version = "0.12.1" 822 + source = "registry+https://github.com/rust-lang/crates.io-index" 823 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 824 + dependencies = [ 825 + "digest", 826 + ] 827 + 828 + [[package]] 829 + name = "home" 830 + version = "0.5.11" 831 + source = "registry+https://github.com/rust-lang/crates.io-index" 832 + checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 833 + dependencies = [ 834 + "windows-sys 0.59.0", 835 + ] 836 + 837 + [[package]] 838 + name = "icu_collections" 839 + version = "2.0.0" 840 + source = "registry+https://github.com/rust-lang/crates.io-index" 841 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 842 + dependencies = [ 843 + "displaydoc", 844 + "potential_utf", 845 + "yoke", 846 + "zerofrom", 847 + "zerovec", 848 + ] 849 + 850 + [[package]] 851 + name = "icu_locale_core" 852 + version = "2.0.0" 853 + source = "registry+https://github.com/rust-lang/crates.io-index" 854 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 855 + dependencies = [ 856 + "displaydoc", 857 + "litemap", 858 + "tinystr", 859 + "writeable", 860 + "zerovec", 861 + ] 862 + 863 + [[package]] 864 + name = "icu_normalizer" 865 + version = "2.0.0" 866 + source = "registry+https://github.com/rust-lang/crates.io-index" 867 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 868 + dependencies = [ 869 + "displaydoc", 870 + "icu_collections", 871 + "icu_normalizer_data", 872 + "icu_properties", 873 + "icu_provider", 874 + "smallvec", 875 + "zerovec", 876 + ] 877 + 878 + [[package]] 879 + name = "icu_normalizer_data" 880 + version = "2.0.0" 881 + source = "registry+https://github.com/rust-lang/crates.io-index" 882 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 883 + 884 + [[package]] 885 + name = "icu_properties" 886 + version = "2.0.1" 887 + source = "registry+https://github.com/rust-lang/crates.io-index" 888 + checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 889 + dependencies = [ 890 + "displaydoc", 891 + "icu_collections", 892 + "icu_locale_core", 893 + "icu_properties_data", 894 + "icu_provider", 895 + "potential_utf", 896 + "zerotrie", 897 + "zerovec", 898 + ] 899 + 900 + [[package]] 901 + name = "icu_properties_data" 902 + version = "2.0.1" 903 + source = "registry+https://github.com/rust-lang/crates.io-index" 904 + checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 905 + 906 + [[package]] 907 + name = "icu_provider" 908 + version = "2.0.0" 909 + source = "registry+https://github.com/rust-lang/crates.io-index" 910 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 911 + dependencies = [ 912 + "displaydoc", 913 + "icu_locale_core", 914 + "stable_deref_trait", 915 + "tinystr", 916 + "writeable", 917 + "yoke", 918 + "zerofrom", 919 + "zerotrie", 920 + "zerovec", 921 + ] 922 + 923 + [[package]] 924 + name = "idna" 925 + version = "1.0.3" 926 + source = "registry+https://github.com/rust-lang/crates.io-index" 927 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 928 + dependencies = [ 929 + "idna_adapter", 930 + "smallvec", 931 + "utf8_iter", 932 + ] 933 + 934 + [[package]] 935 + name = "idna_adapter" 936 + version = "1.2.1" 937 + source = "registry+https://github.com/rust-lang/crates.io-index" 938 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 939 + dependencies = [ 940 + "icu_normalizer", 941 + "icu_properties", 942 + ] 943 + 944 + [[package]] 945 + name = "indexmap" 946 + version = "2.10.0" 947 + source = "registry+https://github.com/rust-lang/crates.io-index" 948 + checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 949 + dependencies = [ 950 + "equivalent", 951 + "hashbrown", 952 + ] 953 + 954 + [[package]] 955 + name = "is_terminal_polyfill" 956 + version = "1.70.1" 957 + source = "registry+https://github.com/rust-lang/crates.io-index" 958 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 959 + 960 + [[package]] 961 + name = "itoa" 962 + version = "1.0.15" 963 + source = "registry+https://github.com/rust-lang/crates.io-index" 964 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 965 + 966 + [[package]] 967 + name = "js-sys" 968 + version = "0.3.77" 969 + source = "registry+https://github.com/rust-lang/crates.io-index" 970 + checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 971 + dependencies = [ 972 + "once_cell", 973 + "wasm-bindgen", 974 + ] 975 + 976 + [[package]] 977 + name = "lazy_static" 978 + version = "1.5.0" 979 + source = "registry+https://github.com/rust-lang/crates.io-index" 980 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 981 + dependencies = [ 982 + "spin", 983 + ] 984 + 985 + [[package]] 986 + name = "libc" 987 + version = "0.2.174" 988 + source = "registry+https://github.com/rust-lang/crates.io-index" 989 + checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 990 + 991 + [[package]] 992 + name = "libm" 993 + version = "0.2.15" 994 + source = "registry+https://github.com/rust-lang/crates.io-index" 995 + checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 996 + 997 + [[package]] 998 + name = "libredox" 999 + version = "0.1.9" 1000 + source = "registry+https://github.com/rust-lang/crates.io-index" 1001 + checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" 1002 + dependencies = [ 1003 + "bitflags", 1004 + "libc", 1005 + ] 1006 + 1007 + [[package]] 1008 + name = "libsqlite3-sys" 1009 + version = "0.30.1" 1010 + source = "registry+https://github.com/rust-lang/crates.io-index" 1011 + checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 1012 + dependencies = [ 1013 + "cc", 1014 + "pkg-config", 1015 + "vcpkg", 1016 + ] 1017 + 1018 + [[package]] 1019 + name = "linux-raw-sys" 1020 + version = "0.9.4" 1021 + source = "registry+https://github.com/rust-lang/crates.io-index" 1022 + checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1023 + 1024 + [[package]] 1025 + name = "litemap" 1026 + version = "0.8.0" 1027 + source = "registry+https://github.com/rust-lang/crates.io-index" 1028 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1029 + 1030 + [[package]] 1031 + name = "lock_api" 1032 + version = "0.4.13" 1033 + source = "registry+https://github.com/rust-lang/crates.io-index" 1034 + checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 1035 + dependencies = [ 1036 + "autocfg", 1037 + "scopeguard", 1038 + ] 1039 + 1040 + [[package]] 1041 + name = "log" 1042 + version = "0.4.27" 1043 + source = "registry+https://github.com/rust-lang/crates.io-index" 1044 + checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1045 + 1046 + [[package]] 1047 + name = "md-5" 1048 + version = "0.10.6" 1049 + source = "registry+https://github.com/rust-lang/crates.io-index" 1050 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1051 + dependencies = [ 1052 + "cfg-if", 1053 + "digest", 1054 + ] 1055 + 1056 + [[package]] 1057 + name = "memchr" 1058 + version = "2.7.5" 1059 + source = "registry+https://github.com/rust-lang/crates.io-index" 1060 + checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 1061 + 1062 + [[package]] 1063 + name = "memoffset" 1064 + version = "0.9.1" 1065 + source = "registry+https://github.com/rust-lang/crates.io-index" 1066 + checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 1067 + dependencies = [ 1068 + "autocfg", 1069 + ] 1070 + 1071 + [[package]] 1072 + name = "miniz_oxide" 1073 + version = "0.8.9" 1074 + source = "registry+https://github.com/rust-lang/crates.io-index" 1075 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1076 + dependencies = [ 1077 + "adler2", 1078 + ] 1079 + 1080 + [[package]] 1081 + name = "mio" 1082 + version = "1.0.4" 1083 + source = "registry+https://github.com/rust-lang/crates.io-index" 1084 + checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1085 + dependencies = [ 1086 + "libc", 1087 + "wasi 0.11.1+wasi-snapshot-preview1", 1088 + "windows-sys 0.59.0", 1089 + ] 1090 + 1091 + [[package]] 1092 + name = "nix" 1093 + version = "0.29.0" 1094 + source = "registry+https://github.com/rust-lang/crates.io-index" 1095 + checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 1096 + dependencies = [ 1097 + "bitflags", 1098 + "cfg-if", 1099 + "cfg_aliases", 1100 + "libc", 1101 + "memoffset", 1102 + ] 1103 + 1104 + [[package]] 1105 + name = "nix" 1106 + version = "0.30.1" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 1109 + dependencies = [ 1110 + "bitflags", 1111 + "cfg-if", 1112 + "cfg_aliases", 1113 + "libc", 1114 + "memoffset", 1115 + ] 1116 + 1117 + [[package]] 1118 + name = "num-bigint-dig" 1119 + version = "0.8.4" 1120 + source = "registry+https://github.com/rust-lang/crates.io-index" 1121 + checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1122 + dependencies = [ 1123 + "byteorder", 1124 + "lazy_static", 1125 + "libm", 1126 + "num-integer", 1127 + "num-iter", 1128 + "num-traits", 1129 + "rand", 1130 + "smallvec", 1131 + "zeroize", 1132 + ] 1133 + 1134 + [[package]] 1135 + name = "num-integer" 1136 + version = "0.1.46" 1137 + source = "registry+https://github.com/rust-lang/crates.io-index" 1138 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1139 + dependencies = [ 1140 + "num-traits", 1141 + ] 1142 + 1143 + [[package]] 1144 + name = "num-iter" 1145 + version = "0.1.45" 1146 + source = "registry+https://github.com/rust-lang/crates.io-index" 1147 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1148 + dependencies = [ 1149 + "autocfg", 1150 + "num-integer", 1151 + "num-traits", 1152 + ] 1153 + 1154 + [[package]] 1155 + name = "num-traits" 1156 + version = "0.2.19" 1157 + source = "registry+https://github.com/rust-lang/crates.io-index" 1158 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1159 + dependencies = [ 1160 + "autocfg", 1161 + "libm", 1162 + ] 1163 + 1164 + [[package]] 1165 + name = "object" 1166 + version = "0.36.7" 1167 + source = "registry+https://github.com/rust-lang/crates.io-index" 1168 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1169 + dependencies = [ 1170 + "memchr", 1171 + ] 1172 + 1173 + [[package]] 1174 + name = "once_cell" 1175 + version = "1.21.3" 1176 + source = "registry+https://github.com/rust-lang/crates.io-index" 1177 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1178 + 1179 + [[package]] 1180 + name = "once_cell_polyfill" 1181 + version = "1.70.1" 1182 + source = "registry+https://github.com/rust-lang/crates.io-index" 1183 + checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 1184 + 1185 + [[package]] 1186 + name = "option-ext" 1187 + version = "0.2.0" 1188 + source = "registry+https://github.com/rust-lang/crates.io-index" 1189 + checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1190 + 1191 + [[package]] 1192 + name = "ordered-stream" 1193 + version = "0.2.0" 1194 + source = "registry+https://github.com/rust-lang/crates.io-index" 1195 + checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 1196 + dependencies = [ 1197 + "futures-core", 1198 + "pin-project-lite", 1199 + ] 1200 + 1201 + [[package]] 1202 + name = "parking" 1203 + version = "2.2.1" 1204 + source = "registry+https://github.com/rust-lang/crates.io-index" 1205 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1206 + 1207 + [[package]] 1208 + name = "parking_lot" 1209 + version = "0.12.4" 1210 + source = "registry+https://github.com/rust-lang/crates.io-index" 1211 + checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 1212 + dependencies = [ 1213 + "lock_api", 1214 + "parking_lot_core", 1215 + ] 1216 + 1217 + [[package]] 1218 + name = "parking_lot_core" 1219 + version = "0.9.11" 1220 + source = "registry+https://github.com/rust-lang/crates.io-index" 1221 + checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 1222 + dependencies = [ 1223 + "cfg-if", 1224 + "libc", 1225 + "redox_syscall", 1226 + "smallvec", 1227 + "windows-targets 0.52.6", 1228 + ] 1229 + 1230 + [[package]] 1231 + name = "pem-rfc7468" 1232 + version = "0.7.0" 1233 + source = "registry+https://github.com/rust-lang/crates.io-index" 1234 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1235 + dependencies = [ 1236 + "base64ct", 1237 + ] 1238 + 1239 + [[package]] 1240 + name = "percent-encoding" 1241 + version = "2.3.1" 1242 + source = "registry+https://github.com/rust-lang/crates.io-index" 1243 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1244 + 1245 + [[package]] 1246 + name = "pin-project-lite" 1247 + version = "0.2.16" 1248 + source = "registry+https://github.com/rust-lang/crates.io-index" 1249 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1250 + 1251 + [[package]] 1252 + name = "pin-utils" 1253 + version = "0.1.0" 1254 + source = "registry+https://github.com/rust-lang/crates.io-index" 1255 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1256 + 1257 + [[package]] 1258 + name = "piper" 1259 + version = "0.2.4" 1260 + source = "registry+https://github.com/rust-lang/crates.io-index" 1261 + checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 1262 + dependencies = [ 1263 + "atomic-waker", 1264 + "fastrand", 1265 + "futures-io", 1266 + ] 1267 + 1268 + [[package]] 1269 + name = "pkcs1" 1270 + version = "0.7.5" 1271 + source = "registry+https://github.com/rust-lang/crates.io-index" 1272 + checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1273 + dependencies = [ 1274 + "der", 1275 + "pkcs8", 1276 + "spki", 1277 + ] 1278 + 1279 + [[package]] 1280 + name = "pkcs8" 1281 + version = "0.10.2" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1284 + dependencies = [ 1285 + "der", 1286 + "spki", 1287 + ] 1288 + 1289 + [[package]] 1290 + name = "pkg-config" 1291 + version = "0.3.32" 1292 + source = "registry+https://github.com/rust-lang/crates.io-index" 1293 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1294 + 1295 + [[package]] 1296 + name = "polling" 1297 + version = "3.8.0" 1298 + source = "registry+https://github.com/rust-lang/crates.io-index" 1299 + checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" 1300 + dependencies = [ 1301 + "cfg-if", 1302 + "concurrent-queue", 1303 + "hermit-abi", 1304 + "pin-project-lite", 1305 + "rustix", 1306 + "tracing", 1307 + "windows-sys 0.59.0", 1308 + ] 1309 + 1310 + [[package]] 1311 + name = "potential_utf" 1312 + version = "0.1.2" 1313 + source = "registry+https://github.com/rust-lang/crates.io-index" 1314 + checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 1315 + dependencies = [ 1316 + "zerovec", 1317 + ] 1318 + 1319 + [[package]] 1320 + name = "ppv-lite86" 1321 + version = "0.2.21" 1322 + source = "registry+https://github.com/rust-lang/crates.io-index" 1323 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1324 + dependencies = [ 1325 + "zerocopy", 1326 + ] 1327 + 1328 + [[package]] 1329 + name = "proc-macro-crate" 1330 + version = "3.3.0" 1331 + source = "registry+https://github.com/rust-lang/crates.io-index" 1332 + checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 1333 + dependencies = [ 1334 + "toml_edit", 1335 + ] 1336 + 1337 + [[package]] 1338 + name = "proc-macro2" 1339 + version = "1.0.95" 1340 + source = "registry+https://github.com/rust-lang/crates.io-index" 1341 + checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1342 + dependencies = [ 1343 + "unicode-ident", 1344 + ] 1345 + 1346 + [[package]] 1347 + name = "quote" 1348 + version = "1.0.40" 1349 + source = "registry+https://github.com/rust-lang/crates.io-index" 1350 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1351 + dependencies = [ 1352 + "proc-macro2", 1353 + ] 1354 + 1355 + [[package]] 1356 + name = "r-efi" 1357 + version = "5.3.0" 1358 + source = "registry+https://github.com/rust-lang/crates.io-index" 1359 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1360 + 1361 + [[package]] 1362 + name = "rand" 1363 + version = "0.8.5" 1364 + source = "registry+https://github.com/rust-lang/crates.io-index" 1365 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1366 + dependencies = [ 1367 + "libc", 1368 + "rand_chacha", 1369 + "rand_core", 1370 + ] 1371 + 1372 + [[package]] 1373 + name = "rand_chacha" 1374 + version = "0.3.1" 1375 + source = "registry+https://github.com/rust-lang/crates.io-index" 1376 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1377 + dependencies = [ 1378 + "ppv-lite86", 1379 + "rand_core", 1380 + ] 1381 + 1382 + [[package]] 1383 + name = "rand_core" 1384 + version = "0.6.4" 1385 + source = "registry+https://github.com/rust-lang/crates.io-index" 1386 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1387 + dependencies = [ 1388 + "getrandom 0.2.16", 1389 + ] 1390 + 1391 + [[package]] 1392 + name = "redox_syscall" 1393 + version = "0.5.13" 1394 + source = "registry+https://github.com/rust-lang/crates.io-index" 1395 + checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" 1396 + dependencies = [ 1397 + "bitflags", 1398 + ] 1399 + 1400 + [[package]] 1401 + name = "redox_users" 1402 + version = "0.5.2" 1403 + source = "registry+https://github.com/rust-lang/crates.io-index" 1404 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 1405 + dependencies = [ 1406 + "getrandom 0.2.16", 1407 + "libredox", 1408 + "thiserror", 1409 + ] 1410 + 1411 + [[package]] 1412 + name = "rsa" 1413 + version = "0.9.8" 1414 + source = "registry+https://github.com/rust-lang/crates.io-index" 1415 + checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 1416 + dependencies = [ 1417 + "const-oid", 1418 + "digest", 1419 + "num-bigint-dig", 1420 + "num-integer", 1421 + "num-traits", 1422 + "pkcs1", 1423 + "pkcs8", 1424 + "rand_core", 1425 + "signature", 1426 + "spki", 1427 + "subtle", 1428 + "zeroize", 1429 + ] 1430 + 1431 + [[package]] 1432 + name = "rustc-demangle" 1433 + version = "0.1.25" 1434 + source = "registry+https://github.com/rust-lang/crates.io-index" 1435 + checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" 1436 + 1437 + [[package]] 1438 + name = "rustix" 1439 + version = "1.0.7" 1440 + source = "registry+https://github.com/rust-lang/crates.io-index" 1441 + checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 1442 + dependencies = [ 1443 + "bitflags", 1444 + "errno", 1445 + "libc", 1446 + "linux-raw-sys", 1447 + "windows-sys 0.59.0", 1448 + ] 1449 + 1450 + [[package]] 1451 + name = "rustversion" 1452 + version = "1.0.21" 1453 + source = "registry+https://github.com/rust-lang/crates.io-index" 1454 + checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 1455 + 1456 + [[package]] 1457 + name = "ryu" 1458 + version = "1.0.20" 1459 + source = "registry+https://github.com/rust-lang/crates.io-index" 1460 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1461 + 1462 + [[package]] 1463 + name = "scopeguard" 1464 + version = "1.2.0" 1465 + source = "registry+https://github.com/rust-lang/crates.io-index" 1466 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1467 + 1468 + [[package]] 1469 + name = "serde" 1470 + version = "1.0.219" 1471 + source = "registry+https://github.com/rust-lang/crates.io-index" 1472 + checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1473 + dependencies = [ 1474 + "serde_derive", 1475 + ] 1476 + 1477 + [[package]] 1478 + name = "serde_derive" 1479 + version = "1.0.219" 1480 + source = "registry+https://github.com/rust-lang/crates.io-index" 1481 + checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1482 + dependencies = [ 1483 + "proc-macro2", 1484 + "quote", 1485 + "syn", 1486 + ] 1487 + 1488 + [[package]] 1489 + name = "serde_json" 1490 + version = "1.0.142" 1491 + source = "registry+https://github.com/rust-lang/crates.io-index" 1492 + checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" 1493 + dependencies = [ 1494 + "itoa", 1495 + "memchr", 1496 + "ryu", 1497 + "serde", 1498 + ] 1499 + 1500 + [[package]] 1501 + name = "serde_repr" 1502 + version = "0.1.20" 1503 + source = "registry+https://github.com/rust-lang/crates.io-index" 1504 + checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" 1505 + dependencies = [ 1506 + "proc-macro2", 1507 + "quote", 1508 + "syn", 1509 + ] 1510 + 1511 + [[package]] 1512 + name = "serde_urlencoded" 1513 + version = "0.7.1" 1514 + source = "registry+https://github.com/rust-lang/crates.io-index" 1515 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1516 + dependencies = [ 1517 + "form_urlencoded", 1518 + "itoa", 1519 + "ryu", 1520 + "serde", 1521 + ] 1522 + 1523 + [[package]] 1524 + name = "sha1" 1525 + version = "0.10.6" 1526 + source = "registry+https://github.com/rust-lang/crates.io-index" 1527 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1528 + dependencies = [ 1529 + "cfg-if", 1530 + "cpufeatures", 1531 + "digest", 1532 + ] 1533 + 1534 + [[package]] 1535 + name = "sha2" 1536 + version = "0.10.9" 1537 + source = "registry+https://github.com/rust-lang/crates.io-index" 1538 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 1539 + dependencies = [ 1540 + "cfg-if", 1541 + "cpufeatures", 1542 + "digest", 1543 + ] 1544 + 1545 + [[package]] 1546 + name = "shlex" 1547 + version = "1.3.0" 1548 + source = "registry+https://github.com/rust-lang/crates.io-index" 1549 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1550 + 1551 + [[package]] 1552 + name = "signal-hook-registry" 1553 + version = "1.4.5" 1554 + source = "registry+https://github.com/rust-lang/crates.io-index" 1555 + checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1556 + dependencies = [ 1557 + "libc", 1558 + ] 1559 + 1560 + [[package]] 1561 + name = "signature" 1562 + version = "2.2.0" 1563 + source = "registry+https://github.com/rust-lang/crates.io-index" 1564 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1565 + dependencies = [ 1566 + "digest", 1567 + "rand_core", 1568 + ] 1569 + 1570 + [[package]] 1571 + name = "slab" 1572 + version = "0.4.10" 1573 + source = "registry+https://github.com/rust-lang/crates.io-index" 1574 + checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 1575 + 1576 + [[package]] 1577 + name = "smallvec" 1578 + version = "1.15.1" 1579 + source = "registry+https://github.com/rust-lang/crates.io-index" 1580 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1581 + dependencies = [ 1582 + "serde", 1583 + ] 1584 + 1585 + [[package]] 1586 + name = "socket2" 1587 + version = "0.5.10" 1588 + source = "registry+https://github.com/rust-lang/crates.io-index" 1589 + checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 1590 + dependencies = [ 1591 + "libc", 1592 + "windows-sys 0.52.0", 1593 + ] 1594 + 1595 + [[package]] 1596 + name = "spin" 1597 + version = "0.9.8" 1598 + source = "registry+https://github.com/rust-lang/crates.io-index" 1599 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1600 + dependencies = [ 1601 + "lock_api", 1602 + ] 1603 + 1604 + [[package]] 1605 + name = "spki" 1606 + version = "0.7.3" 1607 + source = "registry+https://github.com/rust-lang/crates.io-index" 1608 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1609 + dependencies = [ 1610 + "base64ct", 1611 + "der", 1612 + ] 1613 + 1614 + [[package]] 1615 + name = "sprinkles" 1616 + version = "0.0.1" 1617 + dependencies = [ 1618 + "clap", 1619 + "dirs", 1620 + "serde", 1621 + "serde_json", 1622 + "sqlx", 1623 + "tokio", 1624 + "uuid", 1625 + "zbus 5.7.1", 1626 + "zbus_notification", 1627 + ] 1628 + 1629 + [[package]] 1630 + name = "sqlx" 1631 + version = "0.8.6" 1632 + source = "registry+https://github.com/rust-lang/crates.io-index" 1633 + checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" 1634 + dependencies = [ 1635 + "sqlx-core", 1636 + "sqlx-macros", 1637 + "sqlx-mysql", 1638 + "sqlx-postgres", 1639 + "sqlx-sqlite", 1640 + ] 1641 + 1642 + [[package]] 1643 + name = "sqlx-core" 1644 + version = "0.8.6" 1645 + source = "registry+https://github.com/rust-lang/crates.io-index" 1646 + checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" 1647 + dependencies = [ 1648 + "base64", 1649 + "bytes", 1650 + "crc", 1651 + "crossbeam-queue", 1652 + "either", 1653 + "event-listener", 1654 + "futures-core", 1655 + "futures-intrusive", 1656 + "futures-io", 1657 + "futures-util", 1658 + "hashbrown", 1659 + "hashlink", 1660 + "indexmap", 1661 + "log", 1662 + "memchr", 1663 + "once_cell", 1664 + "percent-encoding", 1665 + "serde", 1666 + "serde_json", 1667 + "sha2", 1668 + "smallvec", 1669 + "thiserror", 1670 + "tokio", 1671 + "tokio-stream", 1672 + "tracing", 1673 + "url", 1674 + "uuid", 1675 + ] 1676 + 1677 + [[package]] 1678 + name = "sqlx-macros" 1679 + version = "0.8.6" 1680 + source = "registry+https://github.com/rust-lang/crates.io-index" 1681 + checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" 1682 + dependencies = [ 1683 + "proc-macro2", 1684 + "quote", 1685 + "sqlx-core", 1686 + "sqlx-macros-core", 1687 + "syn", 1688 + ] 1689 + 1690 + [[package]] 1691 + name = "sqlx-macros-core" 1692 + version = "0.8.6" 1693 + source = "registry+https://github.com/rust-lang/crates.io-index" 1694 + checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" 1695 + dependencies = [ 1696 + "dotenvy", 1697 + "either", 1698 + "heck", 1699 + "hex", 1700 + "once_cell", 1701 + "proc-macro2", 1702 + "quote", 1703 + "serde", 1704 + "serde_json", 1705 + "sha2", 1706 + "sqlx-core", 1707 + "sqlx-mysql", 1708 + "sqlx-postgres", 1709 + "sqlx-sqlite", 1710 + "syn", 1711 + "tokio", 1712 + "url", 1713 + ] 1714 + 1715 + [[package]] 1716 + name = "sqlx-mysql" 1717 + version = "0.8.6" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" 1720 + dependencies = [ 1721 + "atoi", 1722 + "base64", 1723 + "bitflags", 1724 + "byteorder", 1725 + "bytes", 1726 + "crc", 1727 + "digest", 1728 + "dotenvy", 1729 + "either", 1730 + "futures-channel", 1731 + "futures-core", 1732 + "futures-io", 1733 + "futures-util", 1734 + "generic-array", 1735 + "hex", 1736 + "hkdf", 1737 + "hmac", 1738 + "itoa", 1739 + "log", 1740 + "md-5", 1741 + "memchr", 1742 + "once_cell", 1743 + "percent-encoding", 1744 + "rand", 1745 + "rsa", 1746 + "serde", 1747 + "sha1", 1748 + "sha2", 1749 + "smallvec", 1750 + "sqlx-core", 1751 + "stringprep", 1752 + "thiserror", 1753 + "tracing", 1754 + "uuid", 1755 + "whoami", 1756 + ] 1757 + 1758 + [[package]] 1759 + name = "sqlx-postgres" 1760 + version = "0.8.6" 1761 + source = "registry+https://github.com/rust-lang/crates.io-index" 1762 + checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" 1763 + dependencies = [ 1764 + "atoi", 1765 + "base64", 1766 + "bitflags", 1767 + "byteorder", 1768 + "crc", 1769 + "dotenvy", 1770 + "etcetera", 1771 + "futures-channel", 1772 + "futures-core", 1773 + "futures-util", 1774 + "hex", 1775 + "hkdf", 1776 + "hmac", 1777 + "home", 1778 + "itoa", 1779 + "log", 1780 + "md-5", 1781 + "memchr", 1782 + "once_cell", 1783 + "rand", 1784 + "serde", 1785 + "serde_json", 1786 + "sha2", 1787 + "smallvec", 1788 + "sqlx-core", 1789 + "stringprep", 1790 + "thiserror", 1791 + "tracing", 1792 + "uuid", 1793 + "whoami", 1794 + ] 1795 + 1796 + [[package]] 1797 + name = "sqlx-sqlite" 1798 + version = "0.8.6" 1799 + source = "registry+https://github.com/rust-lang/crates.io-index" 1800 + checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" 1801 + dependencies = [ 1802 + "atoi", 1803 + "flume", 1804 + "futures-channel", 1805 + "futures-core", 1806 + "futures-executor", 1807 + "futures-intrusive", 1808 + "futures-util", 1809 + "libsqlite3-sys", 1810 + "log", 1811 + "percent-encoding", 1812 + "serde", 1813 + "serde_urlencoded", 1814 + "sqlx-core", 1815 + "thiserror", 1816 + "tracing", 1817 + "url", 1818 + "uuid", 1819 + ] 1820 + 1821 + [[package]] 1822 + name = "stable_deref_trait" 1823 + version = "1.2.0" 1824 + source = "registry+https://github.com/rust-lang/crates.io-index" 1825 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1826 + 1827 + [[package]] 1828 + name = "static_assertions" 1829 + version = "1.1.0" 1830 + source = "registry+https://github.com/rust-lang/crates.io-index" 1831 + checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1832 + 1833 + [[package]] 1834 + name = "stringprep" 1835 + version = "0.1.5" 1836 + source = "registry+https://github.com/rust-lang/crates.io-index" 1837 + checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1838 + dependencies = [ 1839 + "unicode-bidi", 1840 + "unicode-normalization", 1841 + "unicode-properties", 1842 + ] 1843 + 1844 + [[package]] 1845 + name = "strsim" 1846 + version = "0.11.1" 1847 + source = "registry+https://github.com/rust-lang/crates.io-index" 1848 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1849 + 1850 + [[package]] 1851 + name = "subtle" 1852 + version = "2.6.1" 1853 + source = "registry+https://github.com/rust-lang/crates.io-index" 1854 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1855 + 1856 + [[package]] 1857 + name = "syn" 1858 + version = "2.0.104" 1859 + source = "registry+https://github.com/rust-lang/crates.io-index" 1860 + checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 1861 + dependencies = [ 1862 + "proc-macro2", 1863 + "quote", 1864 + "unicode-ident", 1865 + ] 1866 + 1867 + [[package]] 1868 + name = "synstructure" 1869 + version = "0.13.2" 1870 + source = "registry+https://github.com/rust-lang/crates.io-index" 1871 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1872 + dependencies = [ 1873 + "proc-macro2", 1874 + "quote", 1875 + "syn", 1876 + ] 1877 + 1878 + [[package]] 1879 + name = "tempfile" 1880 + version = "3.20.0" 1881 + source = "registry+https://github.com/rust-lang/crates.io-index" 1882 + checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 1883 + dependencies = [ 1884 + "fastrand", 1885 + "getrandom 0.3.3", 1886 + "once_cell", 1887 + "rustix", 1888 + "windows-sys 0.59.0", 1889 + ] 1890 + 1891 + [[package]] 1892 + name = "thiserror" 1893 + version = "2.0.12" 1894 + source = "registry+https://github.com/rust-lang/crates.io-index" 1895 + checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1896 + dependencies = [ 1897 + "thiserror-impl", 1898 + ] 1899 + 1900 + [[package]] 1901 + name = "thiserror-impl" 1902 + version = "2.0.12" 1903 + source = "registry+https://github.com/rust-lang/crates.io-index" 1904 + checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1905 + dependencies = [ 1906 + "proc-macro2", 1907 + "quote", 1908 + "syn", 1909 + ] 1910 + 1911 + [[package]] 1912 + name = "tinystr" 1913 + version = "0.8.1" 1914 + source = "registry+https://github.com/rust-lang/crates.io-index" 1915 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1916 + dependencies = [ 1917 + "displaydoc", 1918 + "zerovec", 1919 + ] 1920 + 1921 + [[package]] 1922 + name = "tinyvec" 1923 + version = "1.9.0" 1924 + source = "registry+https://github.com/rust-lang/crates.io-index" 1925 + checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 1926 + dependencies = [ 1927 + "tinyvec_macros", 1928 + ] 1929 + 1930 + [[package]] 1931 + name = "tinyvec_macros" 1932 + version = "0.1.1" 1933 + source = "registry+https://github.com/rust-lang/crates.io-index" 1934 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1935 + 1936 + [[package]] 1937 + name = "tokio" 1938 + version = "1.45.1" 1939 + source = "registry+https://github.com/rust-lang/crates.io-index" 1940 + checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" 1941 + dependencies = [ 1942 + "backtrace", 1943 + "bytes", 1944 + "libc", 1945 + "mio", 1946 + "parking_lot", 1947 + "pin-project-lite", 1948 + "signal-hook-registry", 1949 + "socket2", 1950 + "tokio-macros", 1951 + "tracing", 1952 + "windows-sys 0.52.0", 1953 + ] 1954 + 1955 + [[package]] 1956 + name = "tokio-macros" 1957 + version = "2.5.0" 1958 + source = "registry+https://github.com/rust-lang/crates.io-index" 1959 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1960 + dependencies = [ 1961 + "proc-macro2", 1962 + "quote", 1963 + "syn", 1964 + ] 1965 + 1966 + [[package]] 1967 + name = "tokio-stream" 1968 + version = "0.1.17" 1969 + source = "registry+https://github.com/rust-lang/crates.io-index" 1970 + checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 1971 + dependencies = [ 1972 + "futures-core", 1973 + "pin-project-lite", 1974 + "tokio", 1975 + ] 1976 + 1977 + [[package]] 1978 + name = "toml_datetime" 1979 + version = "0.6.11" 1980 + source = "registry+https://github.com/rust-lang/crates.io-index" 1981 + checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 1982 + 1983 + [[package]] 1984 + name = "toml_edit" 1985 + version = "0.22.27" 1986 + source = "registry+https://github.com/rust-lang/crates.io-index" 1987 + checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 1988 + dependencies = [ 1989 + "indexmap", 1990 + "toml_datetime", 1991 + "winnow", 1992 + ] 1993 + 1994 + [[package]] 1995 + name = "tracing" 1996 + version = "0.1.41" 1997 + source = "registry+https://github.com/rust-lang/crates.io-index" 1998 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1999 + dependencies = [ 2000 + "log", 2001 + "pin-project-lite", 2002 + "tracing-attributes", 2003 + "tracing-core", 2004 + ] 2005 + 2006 + [[package]] 2007 + name = "tracing-attributes" 2008 + version = "0.1.30" 2009 + source = "registry+https://github.com/rust-lang/crates.io-index" 2010 + checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 2011 + dependencies = [ 2012 + "proc-macro2", 2013 + "quote", 2014 + "syn", 2015 + ] 2016 + 2017 + [[package]] 2018 + name = "tracing-core" 2019 + version = "0.1.34" 2020 + source = "registry+https://github.com/rust-lang/crates.io-index" 2021 + checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 2022 + dependencies = [ 2023 + "once_cell", 2024 + ] 2025 + 2026 + [[package]] 2027 + name = "typenum" 2028 + version = "1.18.0" 2029 + source = "registry+https://github.com/rust-lang/crates.io-index" 2030 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2031 + 2032 + [[package]] 2033 + name = "uds_windows" 2034 + version = "1.1.0" 2035 + source = "registry+https://github.com/rust-lang/crates.io-index" 2036 + checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" 2037 + dependencies = [ 2038 + "memoffset", 2039 + "tempfile", 2040 + "winapi", 2041 + ] 2042 + 2043 + [[package]] 2044 + name = "unicode-bidi" 2045 + version = "0.3.18" 2046 + source = "registry+https://github.com/rust-lang/crates.io-index" 2047 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2048 + 2049 + [[package]] 2050 + name = "unicode-ident" 2051 + version = "1.0.18" 2052 + source = "registry+https://github.com/rust-lang/crates.io-index" 2053 + checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2054 + 2055 + [[package]] 2056 + name = "unicode-normalization" 2057 + version = "0.1.24" 2058 + source = "registry+https://github.com/rust-lang/crates.io-index" 2059 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2060 + dependencies = [ 2061 + "tinyvec", 2062 + ] 2063 + 2064 + [[package]] 2065 + name = "unicode-properties" 2066 + version = "0.1.3" 2067 + source = "registry+https://github.com/rust-lang/crates.io-index" 2068 + checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2069 + 2070 + [[package]] 2071 + name = "url" 2072 + version = "2.5.4" 2073 + source = "registry+https://github.com/rust-lang/crates.io-index" 2074 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2075 + dependencies = [ 2076 + "form_urlencoded", 2077 + "idna", 2078 + "percent-encoding", 2079 + ] 2080 + 2081 + [[package]] 2082 + name = "utf8_iter" 2083 + version = "1.0.4" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2086 + 2087 + [[package]] 2088 + name = "utf8parse" 2089 + version = "0.2.2" 2090 + source = "registry+https://github.com/rust-lang/crates.io-index" 2091 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2092 + 2093 + [[package]] 2094 + name = "uuid" 2095 + version = "1.17.0" 2096 + source = "registry+https://github.com/rust-lang/crates.io-index" 2097 + checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 2098 + dependencies = [ 2099 + "getrandom 0.3.3", 2100 + "js-sys", 2101 + "serde", 2102 + "wasm-bindgen", 2103 + ] 2104 + 2105 + [[package]] 2106 + name = "vcpkg" 2107 + version = "0.2.15" 2108 + source = "registry+https://github.com/rust-lang/crates.io-index" 2109 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2110 + 2111 + [[package]] 2112 + name = "version_check" 2113 + version = "0.9.5" 2114 + source = "registry+https://github.com/rust-lang/crates.io-index" 2115 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2116 + 2117 + [[package]] 2118 + name = "wasi" 2119 + version = "0.11.1+wasi-snapshot-preview1" 2120 + source = "registry+https://github.com/rust-lang/crates.io-index" 2121 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 2122 + 2123 + [[package]] 2124 + name = "wasi" 2125 + version = "0.14.2+wasi-0.2.4" 2126 + source = "registry+https://github.com/rust-lang/crates.io-index" 2127 + checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2128 + dependencies = [ 2129 + "wit-bindgen-rt", 2130 + ] 2131 + 2132 + [[package]] 2133 + name = "wasite" 2134 + version = "0.1.0" 2135 + source = "registry+https://github.com/rust-lang/crates.io-index" 2136 + checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2137 + 2138 + [[package]] 2139 + name = "wasm-bindgen" 2140 + version = "0.2.100" 2141 + source = "registry+https://github.com/rust-lang/crates.io-index" 2142 + checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2143 + dependencies = [ 2144 + "cfg-if", 2145 + "once_cell", 2146 + "rustversion", 2147 + "wasm-bindgen-macro", 2148 + ] 2149 + 2150 + [[package]] 2151 + name = "wasm-bindgen-backend" 2152 + version = "0.2.100" 2153 + source = "registry+https://github.com/rust-lang/crates.io-index" 2154 + checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2155 + dependencies = [ 2156 + "bumpalo", 2157 + "log", 2158 + "proc-macro2", 2159 + "quote", 2160 + "syn", 2161 + "wasm-bindgen-shared", 2162 + ] 2163 + 2164 + [[package]] 2165 + name = "wasm-bindgen-macro" 2166 + version = "0.2.100" 2167 + source = "registry+https://github.com/rust-lang/crates.io-index" 2168 + checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2169 + dependencies = [ 2170 + "quote", 2171 + "wasm-bindgen-macro-support", 2172 + ] 2173 + 2174 + [[package]] 2175 + name = "wasm-bindgen-macro-support" 2176 + version = "0.2.100" 2177 + source = "registry+https://github.com/rust-lang/crates.io-index" 2178 + checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2179 + dependencies = [ 2180 + "proc-macro2", 2181 + "quote", 2182 + "syn", 2183 + "wasm-bindgen-backend", 2184 + "wasm-bindgen-shared", 2185 + ] 2186 + 2187 + [[package]] 2188 + name = "wasm-bindgen-shared" 2189 + version = "0.2.100" 2190 + source = "registry+https://github.com/rust-lang/crates.io-index" 2191 + checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2192 + dependencies = [ 2193 + "unicode-ident", 2194 + ] 2195 + 2196 + [[package]] 2197 + name = "whoami" 2198 + version = "1.6.0" 2199 + source = "registry+https://github.com/rust-lang/crates.io-index" 2200 + checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" 2201 + dependencies = [ 2202 + "redox_syscall", 2203 + "wasite", 2204 + ] 2205 + 2206 + [[package]] 2207 + name = "winapi" 2208 + version = "0.3.9" 2209 + source = "registry+https://github.com/rust-lang/crates.io-index" 2210 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2211 + dependencies = [ 2212 + "winapi-i686-pc-windows-gnu", 2213 + "winapi-x86_64-pc-windows-gnu", 2214 + ] 2215 + 2216 + [[package]] 2217 + name = "winapi-i686-pc-windows-gnu" 2218 + version = "0.4.0" 2219 + source = "registry+https://github.com/rust-lang/crates.io-index" 2220 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2221 + 2222 + [[package]] 2223 + name = "winapi-x86_64-pc-windows-gnu" 2224 + version = "0.4.0" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2227 + 2228 + [[package]] 2229 + name = "windows-link" 2230 + version = "0.1.3" 2231 + source = "registry+https://github.com/rust-lang/crates.io-index" 2232 + checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 2233 + 2234 + [[package]] 2235 + name = "windows-sys" 2236 + version = "0.48.0" 2237 + source = "registry+https://github.com/rust-lang/crates.io-index" 2238 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2239 + dependencies = [ 2240 + "windows-targets 0.48.5", 2241 + ] 2242 + 2243 + [[package]] 2244 + name = "windows-sys" 2245 + version = "0.52.0" 2246 + source = "registry+https://github.com/rust-lang/crates.io-index" 2247 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2248 + dependencies = [ 2249 + "windows-targets 0.52.6", 2250 + ] 2251 + 2252 + [[package]] 2253 + name = "windows-sys" 2254 + version = "0.59.0" 2255 + source = "registry+https://github.com/rust-lang/crates.io-index" 2256 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2257 + dependencies = [ 2258 + "windows-targets 0.52.6", 2259 + ] 2260 + 2261 + [[package]] 2262 + name = "windows-sys" 2263 + version = "0.60.2" 2264 + source = "registry+https://github.com/rust-lang/crates.io-index" 2265 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 2266 + dependencies = [ 2267 + "windows-targets 0.53.3", 2268 + ] 2269 + 2270 + [[package]] 2271 + name = "windows-targets" 2272 + version = "0.48.5" 2273 + source = "registry+https://github.com/rust-lang/crates.io-index" 2274 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2275 + dependencies = [ 2276 + "windows_aarch64_gnullvm 0.48.5", 2277 + "windows_aarch64_msvc 0.48.5", 2278 + "windows_i686_gnu 0.48.5", 2279 + "windows_i686_msvc 0.48.5", 2280 + "windows_x86_64_gnu 0.48.5", 2281 + "windows_x86_64_gnullvm 0.48.5", 2282 + "windows_x86_64_msvc 0.48.5", 2283 + ] 2284 + 2285 + [[package]] 2286 + name = "windows-targets" 2287 + version = "0.52.6" 2288 + source = "registry+https://github.com/rust-lang/crates.io-index" 2289 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2290 + dependencies = [ 2291 + "windows_aarch64_gnullvm 0.52.6", 2292 + "windows_aarch64_msvc 0.52.6", 2293 + "windows_i686_gnu 0.52.6", 2294 + "windows_i686_gnullvm 0.52.6", 2295 + "windows_i686_msvc 0.52.6", 2296 + "windows_x86_64_gnu 0.52.6", 2297 + "windows_x86_64_gnullvm 0.52.6", 2298 + "windows_x86_64_msvc 0.52.6", 2299 + ] 2300 + 2301 + [[package]] 2302 + name = "windows-targets" 2303 + version = "0.53.3" 2304 + source = "registry+https://github.com/rust-lang/crates.io-index" 2305 + checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 2306 + dependencies = [ 2307 + "windows-link", 2308 + "windows_aarch64_gnullvm 0.53.0", 2309 + "windows_aarch64_msvc 0.53.0", 2310 + "windows_i686_gnu 0.53.0", 2311 + "windows_i686_gnullvm 0.53.0", 2312 + "windows_i686_msvc 0.53.0", 2313 + "windows_x86_64_gnu 0.53.0", 2314 + "windows_x86_64_gnullvm 0.53.0", 2315 + "windows_x86_64_msvc 0.53.0", 2316 + ] 2317 + 2318 + [[package]] 2319 + name = "windows_aarch64_gnullvm" 2320 + version = "0.48.5" 2321 + source = "registry+https://github.com/rust-lang/crates.io-index" 2322 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2323 + 2324 + [[package]] 2325 + name = "windows_aarch64_gnullvm" 2326 + version = "0.52.6" 2327 + source = "registry+https://github.com/rust-lang/crates.io-index" 2328 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2329 + 2330 + [[package]] 2331 + name = "windows_aarch64_gnullvm" 2332 + version = "0.53.0" 2333 + source = "registry+https://github.com/rust-lang/crates.io-index" 2334 + checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2335 + 2336 + [[package]] 2337 + name = "windows_aarch64_msvc" 2338 + version = "0.48.5" 2339 + source = "registry+https://github.com/rust-lang/crates.io-index" 2340 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2341 + 2342 + [[package]] 2343 + name = "windows_aarch64_msvc" 2344 + version = "0.52.6" 2345 + source = "registry+https://github.com/rust-lang/crates.io-index" 2346 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2347 + 2348 + [[package]] 2349 + name = "windows_aarch64_msvc" 2350 + version = "0.53.0" 2351 + source = "registry+https://github.com/rust-lang/crates.io-index" 2352 + checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2353 + 2354 + [[package]] 2355 + name = "windows_i686_gnu" 2356 + version = "0.48.5" 2357 + source = "registry+https://github.com/rust-lang/crates.io-index" 2358 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2359 + 2360 + [[package]] 2361 + name = "windows_i686_gnu" 2362 + version = "0.52.6" 2363 + source = "registry+https://github.com/rust-lang/crates.io-index" 2364 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2365 + 2366 + [[package]] 2367 + name = "windows_i686_gnu" 2368 + version = "0.53.0" 2369 + source = "registry+https://github.com/rust-lang/crates.io-index" 2370 + checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2371 + 2372 + [[package]] 2373 + name = "windows_i686_gnullvm" 2374 + version = "0.52.6" 2375 + source = "registry+https://github.com/rust-lang/crates.io-index" 2376 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2377 + 2378 + [[package]] 2379 + name = "windows_i686_gnullvm" 2380 + version = "0.53.0" 2381 + source = "registry+https://github.com/rust-lang/crates.io-index" 2382 + checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2383 + 2384 + [[package]] 2385 + name = "windows_i686_msvc" 2386 + version = "0.48.5" 2387 + source = "registry+https://github.com/rust-lang/crates.io-index" 2388 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2389 + 2390 + [[package]] 2391 + name = "windows_i686_msvc" 2392 + version = "0.52.6" 2393 + source = "registry+https://github.com/rust-lang/crates.io-index" 2394 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2395 + 2396 + [[package]] 2397 + name = "windows_i686_msvc" 2398 + version = "0.53.0" 2399 + source = "registry+https://github.com/rust-lang/crates.io-index" 2400 + checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2401 + 2402 + [[package]] 2403 + name = "windows_x86_64_gnu" 2404 + version = "0.48.5" 2405 + source = "registry+https://github.com/rust-lang/crates.io-index" 2406 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2407 + 2408 + [[package]] 2409 + name = "windows_x86_64_gnu" 2410 + version = "0.52.6" 2411 + source = "registry+https://github.com/rust-lang/crates.io-index" 2412 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2413 + 2414 + [[package]] 2415 + name = "windows_x86_64_gnu" 2416 + version = "0.53.0" 2417 + source = "registry+https://github.com/rust-lang/crates.io-index" 2418 + checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2419 + 2420 + [[package]] 2421 + name = "windows_x86_64_gnullvm" 2422 + version = "0.48.5" 2423 + source = "registry+https://github.com/rust-lang/crates.io-index" 2424 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2425 + 2426 + [[package]] 2427 + name = "windows_x86_64_gnullvm" 2428 + version = "0.52.6" 2429 + source = "registry+https://github.com/rust-lang/crates.io-index" 2430 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2431 + 2432 + [[package]] 2433 + name = "windows_x86_64_gnullvm" 2434 + version = "0.53.0" 2435 + source = "registry+https://github.com/rust-lang/crates.io-index" 2436 + checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2437 + 2438 + [[package]] 2439 + name = "windows_x86_64_msvc" 2440 + version = "0.48.5" 2441 + source = "registry+https://github.com/rust-lang/crates.io-index" 2442 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2443 + 2444 + [[package]] 2445 + name = "windows_x86_64_msvc" 2446 + version = "0.52.6" 2447 + source = "registry+https://github.com/rust-lang/crates.io-index" 2448 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2449 + 2450 + [[package]] 2451 + name = "windows_x86_64_msvc" 2452 + version = "0.53.0" 2453 + source = "registry+https://github.com/rust-lang/crates.io-index" 2454 + checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2455 + 2456 + [[package]] 2457 + name = "winnow" 2458 + version = "0.7.11" 2459 + source = "registry+https://github.com/rust-lang/crates.io-index" 2460 + checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" 2461 + dependencies = [ 2462 + "memchr", 2463 + ] 2464 + 2465 + [[package]] 2466 + name = "wit-bindgen-rt" 2467 + version = "0.39.0" 2468 + source = "registry+https://github.com/rust-lang/crates.io-index" 2469 + checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2470 + dependencies = [ 2471 + "bitflags", 2472 + ] 2473 + 2474 + [[package]] 2475 + name = "writeable" 2476 + version = "0.6.1" 2477 + source = "registry+https://github.com/rust-lang/crates.io-index" 2478 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 2479 + 2480 + [[package]] 2481 + name = "xdg-home" 2482 + version = "1.3.0" 2483 + source = "registry+https://github.com/rust-lang/crates.io-index" 2484 + checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" 2485 + dependencies = [ 2486 + "libc", 2487 + "windows-sys 0.59.0", 2488 + ] 2489 + 2490 + [[package]] 2491 + name = "yoke" 2492 + version = "0.8.0" 2493 + source = "registry+https://github.com/rust-lang/crates.io-index" 2494 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 2495 + dependencies = [ 2496 + "serde", 2497 + "stable_deref_trait", 2498 + "yoke-derive", 2499 + "zerofrom", 2500 + ] 2501 + 2502 + [[package]] 2503 + name = "yoke-derive" 2504 + version = "0.8.0" 2505 + source = "registry+https://github.com/rust-lang/crates.io-index" 2506 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 2507 + dependencies = [ 2508 + "proc-macro2", 2509 + "quote", 2510 + "syn", 2511 + "synstructure", 2512 + ] 2513 + 2514 + [[package]] 2515 + name = "zbus" 2516 + version = "4.4.0" 2517 + source = "registry+https://github.com/rust-lang/crates.io-index" 2518 + checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" 2519 + dependencies = [ 2520 + "async-broadcast", 2521 + "async-process", 2522 + "async-recursion", 2523 + "async-trait", 2524 + "enumflags2", 2525 + "event-listener", 2526 + "futures-core", 2527 + "futures-sink", 2528 + "futures-util", 2529 + "hex", 2530 + "nix 0.29.0", 2531 + "ordered-stream", 2532 + "rand", 2533 + "serde", 2534 + "serde_repr", 2535 + "sha1", 2536 + "static_assertions", 2537 + "tokio", 2538 + "tracing", 2539 + "uds_windows", 2540 + "windows-sys 0.52.0", 2541 + "xdg-home", 2542 + "zbus_macros 4.4.0", 2543 + "zbus_names 3.0.0", 2544 + "zvariant 4.2.0", 2545 + ] 2546 + 2547 + [[package]] 2548 + name = "zbus" 2549 + version = "5.7.1" 2550 + source = "registry+https://github.com/rust-lang/crates.io-index" 2551 + checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" 2552 + dependencies = [ 2553 + "async-broadcast", 2554 + "async-executor", 2555 + "async-io", 2556 + "async-lock", 2557 + "async-process", 2558 + "async-recursion", 2559 + "async-task", 2560 + "async-trait", 2561 + "blocking", 2562 + "enumflags2", 2563 + "event-listener", 2564 + "futures-core", 2565 + "futures-lite", 2566 + "hex", 2567 + "nix 0.30.1", 2568 + "ordered-stream", 2569 + "serde", 2570 + "serde_repr", 2571 + "tokio", 2572 + "tracing", 2573 + "uds_windows", 2574 + "windows-sys 0.59.0", 2575 + "winnow", 2576 + "zbus_macros 5.7.1", 2577 + "zbus_names 4.2.0", 2578 + "zvariant 5.5.3", 2579 + ] 2580 + 2581 + [[package]] 2582 + name = "zbus_macros" 2583 + version = "4.4.0" 2584 + source = "registry+https://github.com/rust-lang/crates.io-index" 2585 + checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" 2586 + dependencies = [ 2587 + "proc-macro-crate", 2588 + "proc-macro2", 2589 + "quote", 2590 + "syn", 2591 + "zvariant_utils 2.1.0", 2592 + ] 2593 + 2594 + [[package]] 2595 + name = "zbus_macros" 2596 + version = "5.7.1" 2597 + source = "registry+https://github.com/rust-lang/crates.io-index" 2598 + checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" 2599 + dependencies = [ 2600 + "proc-macro-crate", 2601 + "proc-macro2", 2602 + "quote", 2603 + "syn", 2604 + "zbus_names 4.2.0", 2605 + "zvariant 5.5.3", 2606 + "zvariant_utils 3.2.0", 2607 + ] 2608 + 2609 + [[package]] 2610 + name = "zbus_names" 2611 + version = "3.0.0" 2612 + source = "registry+https://github.com/rust-lang/crates.io-index" 2613 + checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" 2614 + dependencies = [ 2615 + "serde", 2616 + "static_assertions", 2617 + "zvariant 4.2.0", 2618 + ] 2619 + 2620 + [[package]] 2621 + name = "zbus_names" 2622 + version = "4.2.0" 2623 + source = "registry+https://github.com/rust-lang/crates.io-index" 2624 + checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" 2625 + dependencies = [ 2626 + "serde", 2627 + "static_assertions", 2628 + "winnow", 2629 + "zvariant 5.5.3", 2630 + ] 2631 + 2632 + [[package]] 2633 + name = "zbus_notification" 2634 + version = "0.3.6" 2635 + source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "46f00f5c74961f27d12cd1567eb962bd86c093af6685b6ca8dc7aaf09b75664d" 2637 + dependencies = [ 2638 + "futures", 2639 + "futures-util", 2640 + "glob", 2641 + "serde", 2642 + "url", 2643 + "zbus 4.4.0", 2644 + ] 2645 + 2646 + [[package]] 2647 + name = "zerocopy" 2648 + version = "0.8.26" 2649 + source = "registry+https://github.com/rust-lang/crates.io-index" 2650 + checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 2651 + dependencies = [ 2652 + "zerocopy-derive", 2653 + ] 2654 + 2655 + [[package]] 2656 + name = "zerocopy-derive" 2657 + version = "0.8.26" 2658 + source = "registry+https://github.com/rust-lang/crates.io-index" 2659 + checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 2660 + dependencies = [ 2661 + "proc-macro2", 2662 + "quote", 2663 + "syn", 2664 + ] 2665 + 2666 + [[package]] 2667 + name = "zerofrom" 2668 + version = "0.1.6" 2669 + source = "registry+https://github.com/rust-lang/crates.io-index" 2670 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2671 + dependencies = [ 2672 + "zerofrom-derive", 2673 + ] 2674 + 2675 + [[package]] 2676 + name = "zerofrom-derive" 2677 + version = "0.1.6" 2678 + source = "registry+https://github.com/rust-lang/crates.io-index" 2679 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2680 + dependencies = [ 2681 + "proc-macro2", 2682 + "quote", 2683 + "syn", 2684 + "synstructure", 2685 + ] 2686 + 2687 + [[package]] 2688 + name = "zeroize" 2689 + version = "1.8.1" 2690 + source = "registry+https://github.com/rust-lang/crates.io-index" 2691 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2692 + 2693 + [[package]] 2694 + name = "zerotrie" 2695 + version = "0.2.2" 2696 + source = "registry+https://github.com/rust-lang/crates.io-index" 2697 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 2698 + dependencies = [ 2699 + "displaydoc", 2700 + "yoke", 2701 + "zerofrom", 2702 + ] 2703 + 2704 + [[package]] 2705 + name = "zerovec" 2706 + version = "0.11.2" 2707 + source = "registry+https://github.com/rust-lang/crates.io-index" 2708 + checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 2709 + dependencies = [ 2710 + "yoke", 2711 + "zerofrom", 2712 + "zerovec-derive", 2713 + ] 2714 + 2715 + [[package]] 2716 + name = "zerovec-derive" 2717 + version = "0.11.1" 2718 + source = "registry+https://github.com/rust-lang/crates.io-index" 2719 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2720 + dependencies = [ 2721 + "proc-macro2", 2722 + "quote", 2723 + "syn", 2724 + ] 2725 + 2726 + [[package]] 2727 + name = "zvariant" 2728 + version = "4.2.0" 2729 + source = "registry+https://github.com/rust-lang/crates.io-index" 2730 + checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" 2731 + dependencies = [ 2732 + "endi", 2733 + "enumflags2", 2734 + "serde", 2735 + "static_assertions", 2736 + "zvariant_derive 4.2.0", 2737 + ] 2738 + 2739 + [[package]] 2740 + name = "zvariant" 2741 + version = "5.5.3" 2742 + source = "registry+https://github.com/rust-lang/crates.io-index" 2743 + checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" 2744 + dependencies = [ 2745 + "endi", 2746 + "enumflags2", 2747 + "serde", 2748 + "winnow", 2749 + "zvariant_derive 5.5.3", 2750 + "zvariant_utils 3.2.0", 2751 + ] 2752 + 2753 + [[package]] 2754 + name = "zvariant_derive" 2755 + version = "4.2.0" 2756 + source = "registry+https://github.com/rust-lang/crates.io-index" 2757 + checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" 2758 + dependencies = [ 2759 + "proc-macro-crate", 2760 + "proc-macro2", 2761 + "quote", 2762 + "syn", 2763 + "zvariant_utils 2.1.0", 2764 + ] 2765 + 2766 + [[package]] 2767 + name = "zvariant_derive" 2768 + version = "5.5.3" 2769 + source = "registry+https://github.com/rust-lang/crates.io-index" 2770 + checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" 2771 + dependencies = [ 2772 + "proc-macro-crate", 2773 + "proc-macro2", 2774 + "quote", 2775 + "syn", 2776 + "zvariant_utils 3.2.0", 2777 + ] 2778 + 2779 + [[package]] 2780 + name = "zvariant_utils" 2781 + version = "2.1.0" 2782 + source = "registry+https://github.com/rust-lang/crates.io-index" 2783 + checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" 2784 + dependencies = [ 2785 + "proc-macro2", 2786 + "quote", 2787 + "syn", 2788 + ] 2789 + 2790 + [[package]] 2791 + name = "zvariant_utils" 2792 + version = "3.2.0" 2793 + source = "registry+https://github.com/rust-lang/crates.io-index" 2794 + checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 2795 + dependencies = [ 2796 + "proc-macro2", 2797 + "quote", 2798 + "serde", 2799 + "static_assertions", 2800 + "syn", 2801 + "winnow", 2802 + ]
+15
sprinkles/Cargo.toml
··· 1 + [package] 2 + name = "sprinkles" 3 + version = "0.0.1" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + clap = { version = "4.5.45", features = ["derive"] } 8 + dirs = "6.0.0" 9 + serde = { version = "1.0.219", features = ["derive"] } 10 + serde_json = "1.0.142" 11 + sqlx = { version = "0.8.6", features = ["sqlite", "derive", "uuid", "runtime-tokio"] } 12 + tokio = { version = "1.45.1", features = ["full"] } 13 + uuid = { version = "1.17.0", features = ["serde", "v4"] } 14 + zbus = { version = "5.7.1", features = ["tokio"] } 15 + zbus_notification = "0.3.6"
+6
sprinkles/migrations/20250701052622_initial.down.sql
··· 1 + -- Add migration script here 2 + DROP TABLE dbus_notifications 3 + DROP TABLE notifications 4 + DROP TABLE notification_actions 5 + DROP TABLE notification_hints 6 + DROP TABLE previous_dbus_notifications
+36
sprinkles/migrations/20250701052622_initial.up.sql
··· 1 + -- Add migration script here 2 + CREATE TABLE dbus_notifications ( 3 + id STRING PRIMARY KEY, 4 + app_name TEXT NOT NULL, 5 + replaces_id INTEGER REFERENCES notifications (id), 6 + app_icon TEXT, 7 + summary TEXT NOT NULL, 8 + body TEXT, 9 + expire_timeout INTEGER NOT NULL DEFAULT 0 10 + ); 11 + 12 + CREATE TABLE notifications ( 13 + id INTEGER PRIMARY KEY AUTOINCREMENT, 14 + dbus_notification_id STRING REFERENCES dbus_notifications (id), 15 + read BOOLEAN NOT NULL DEFAULT FALSE 16 + ); 17 + 18 + CREATE TABLE notification_actions ( 19 + id STRING PRIMARY KEY, 20 + dbus_notification_id INTEGER REFERENCES dbus_notifications (id), 21 + action TEXT NOT NULL 22 + ); 23 + 24 + CREATE TABLE notification_hints ( 25 + id STRING PRIMARY KEY, 26 + dbus_notification_id STRING REFERENCES dbus_notifications (id), 27 + k TEXT NOT NULL, 28 + value TEXT NOT NULL 29 + ); 30 + 31 + CREATE TABLE previous_dbus_notifications ( 32 + id STRING PRIMARY KEY, 33 + dbus_notification_id STRING REFERENCES dbus_notifications (id), 34 + notification_id INTEGER REFERENCES notifications (id), 35 + idx INTEGER NOT NULL 36 + );
+103
sprinkles/nilla.nix
··· 1 + let 2 + pins = import ./npins; 3 + 4 + nilla = import pins.nilla; 5 + in 6 + nilla.create ({ config, lib }: { 7 + config = { 8 + inputs = { 9 + fenix.src = pins.fenix; 10 + quickshell.src = pins.quickshell; 11 + 12 + nixpkgs = { 13 + src = pins.nixpkgs; 14 + 15 + settings = { 16 + overlays = [ 17 + config.inputs.fenix.result.overlays.default 18 + ]; 19 + }; 20 + }; 21 + }; 22 + 23 + packages.default = config.packages.sprinkles; 24 + packages.sprinkles = { 25 + systems = [ "x86_64-linux" "aarch64-linux" ]; 26 + 27 + package = { fenix, makeRustPlatform, lib, installShellFiles, dbus, ... }: 28 + let 29 + toolchain = fenix.complete.toolchain; 30 + 31 + manifest = (lib.importTOML ./Cargo.toml).package; 32 + 33 + platform = makeRustPlatform { 34 + cargo = toolchain; 35 + rustc = toolchain; 36 + }; 37 + in 38 + platform.buildRustPackage { 39 + meta.mainProgram = "sprinkles"; 40 + pname = manifest.name; 41 + version = manifest.version; 42 + 43 + src = ./.; 44 + 45 + buildInputs = [ dbus ]; 46 + nativeBuildInputs = [ installShellFiles ]; 47 + 48 + cargoLock.lockFile = ./Cargo.lock; 49 + }; 50 + }; 51 + 52 + shells.default = config.shells.sprinkles; 53 + shells.sprinkles = { 54 + systems = [ "x86_64-linux" "aarch64-linux" ]; 55 + 56 + shell = { mkShell, kdePackages, fenix, bacon, pkg-config, reuse, dbus, sqlx-cli, system, ... }: 57 + mkShell { 58 + QML_IMPORT_PATH = 59 + lib.fp.pipe 60 + [ 61 + (map (pkg: "${pkg}/lib/qt-6/qml")) 62 + (builtins.concatStringsSep ":") 63 + ] 64 + [ 65 + (config.inputs.quickshell.result.packages.${system}.default.override { gitRev=pins.quickshell.revision; }) 66 + kdePackages.qtdeclarative 67 + ]; 68 + 69 + buildInputs = [ dbus ]; 70 + packages = [ 71 + kdePackages.qtdeclarative 72 + (fenix.complete.withComponents [ 73 + "cargo" 74 + "clippy" 75 + "rust-src" 76 + "rustc" 77 + "rustfmt" 78 + "rust-analyzer" 79 + ]) 80 + sqlx-cli 81 + bacon 82 + pkg-config 83 + reuse 84 + dbus 85 + ]; 86 + }; 87 + }; 88 + shells.testing = { 89 + systems = [ "x86_64-linux" "aarch64-linux" ]; 90 + 91 + shell = { mkShell, libnotify, sqlitebrowser, system, ... }: 92 + mkShell { 93 + buildInputs = [ libnotify ]; 94 + packages = [ 95 + libnotify 96 + sqlitebrowser 97 + config.packages.default.result.${system} 98 + (config.inputs.quickshell.result.packages.${system}.default.override { gitRev=pins.quickshell.revision; }) 99 + ]; 100 + }; 101 + }; 102 + }; 103 + })
+146
sprinkles/npins/default.nix
··· 1 + /* 2 + This file is provided under the MIT licence: 3 + 4 + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 + 6 + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 + 8 + THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 + */ 10 + # Generated by npins. Do not modify; will be overwritten regularly 11 + let 12 + data = builtins.fromJSON (builtins.readFile ./sources.json); 13 + version = data.version; 14 + 15 + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 16 + range = 17 + first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1); 18 + 19 + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 20 + stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); 21 + 22 + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 23 + stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); 24 + concatMapStrings = f: list: concatStrings (map f list); 25 + concatStrings = builtins.concatStringsSep ""; 26 + 27 + # If the environment variable NPINS_OVERRIDE_${name} is set, then use 28 + # the path directly as opposed to the fetched source. 29 + # (Taken from Niv for compatibility) 30 + mayOverride = 31 + name: path: 32 + let 33 + envVarName = "NPINS_OVERRIDE_${saneName}"; 34 + saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name; 35 + ersatz = builtins.getEnv envVarName; 36 + in 37 + if ersatz == "" then 38 + path 39 + else 40 + # this turns the string into an actual Nix path (for both absolute and 41 + # relative paths) 42 + builtins.trace "Overriding path of \"${name}\" with \"${ersatz}\" due to set \"${envVarName}\"" ( 43 + if builtins.substring 0 1 ersatz == "/" then 44 + /. + ersatz 45 + else 46 + /. + builtins.getEnv "PWD" + "/${ersatz}" 47 + ); 48 + 49 + mkSource = 50 + name: spec: 51 + assert spec ? type; 52 + let 53 + path = 54 + if spec.type == "Git" then 55 + mkGitSource spec 56 + else if spec.type == "GitRelease" then 57 + mkGitSource spec 58 + else if spec.type == "PyPi" then 59 + mkPyPiSource spec 60 + else if spec.type == "Channel" then 61 + mkChannelSource spec 62 + else if spec.type == "Tarball" then 63 + mkTarballSource spec 64 + else 65 + builtins.throw "Unknown source type ${spec.type}"; 66 + in 67 + spec // { outPath = mayOverride name path; }; 68 + 69 + mkGitSource = 70 + { 71 + repository, 72 + revision, 73 + url ? null, 74 + submodules, 75 + hash, 76 + branch ? null, 77 + ... 78 + }: 79 + assert repository ? type; 80 + # At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository 81 + # In the latter case, there we will always be an url to the tarball 82 + if url != null && !submodules then 83 + builtins.fetchTarball { 84 + inherit url; 85 + sha256 = hash; 86 + } 87 + else 88 + let 89 + url = 90 + if repository.type == "Git" then 91 + repository.url 92 + else if repository.type == "GitHub" then 93 + "https://github.com/${repository.owner}/${repository.repo}.git" 94 + else if repository.type == "GitLab" then 95 + "${repository.server}/${repository.repo_path}.git" 96 + else 97 + throw "Unrecognized repository type ${repository.type}"; 98 + urlToName = 99 + url: rev: 100 + let 101 + matched = builtins.match "^.*/([^/]*)(\\.git)?$" url; 102 + 103 + short = builtins.substring 0 7 rev; 104 + 105 + appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else ""; 106 + in 107 + "${if matched == null then "source" else builtins.head matched}${appendShort}"; 108 + name = urlToName url revision; 109 + in 110 + builtins.fetchGit { 111 + rev = revision; 112 + narHash = hash; 113 + 114 + inherit name submodules url; 115 + }; 116 + 117 + mkPyPiSource = 118 + { url, hash, ... }: 119 + builtins.fetchurl { 120 + inherit url; 121 + sha256 = hash; 122 + }; 123 + 124 + mkChannelSource = 125 + { url, hash, ... }: 126 + builtins.fetchTarball { 127 + inherit url; 128 + sha256 = hash; 129 + }; 130 + 131 + mkTarballSource = 132 + { 133 + url, 134 + locked_url ? url, 135 + hash, 136 + ... 137 + }: 138 + builtins.fetchTarball { 139 + url = locked_url; 140 + sha256 = hash; 141 + }; 142 + in 143 + if version == 6 then 144 + builtins.mapAttrs mkSource data.pins 145 + else 146 + throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
+59
sprinkles/npins/sources.json
··· 1 + { 2 + "pins": { 3 + "fenix": { 4 + "type": "Git", 5 + "repository": { 6 + "type": "GitHub", 7 + "owner": "nix-community", 8 + "repo": "fenix" 9 + }, 10 + "branch": "monthly", 11 + "submodules": false, 12 + "revision": "f44d7c3596ff028ad9f7fcc31d1941ed585f11b3", 13 + "url": "https://github.com/nix-community/fenix/archive/f44d7c3596ff028ad9f7fcc31d1941ed585f11b3.tar.gz", 14 + "hash": "sha256-6RzWfxENGlO73jQb3uQNgOvubUFwvveeIg+PZxhAu6s=" 15 + }, 16 + "nilla": { 17 + "type": "Git", 18 + "repository": { 19 + "type": "GitHub", 20 + "owner": "nilla-nix", 21 + "repo": "nilla" 22 + }, 23 + "branch": "main", 24 + "submodules": false, 25 + "revision": "4e6038f4ebc89487194013af6a1e077dfeb00359", 26 + "url": "https://github.com/nilla-nix/nilla/archive/4e6038f4ebc89487194013af6a1e077dfeb00359.tar.gz", 27 + "hash": "sha256-7iLzbTLtgdFtm9em3xxHO9BunN2YpgYquMLKXh5hEpQ=" 28 + }, 29 + "nixpkgs": { 30 + "type": "Git", 31 + "repository": { 32 + "type": "GitHub", 33 + "owner": "nixos", 34 + "repo": "nixpkgs" 35 + }, 36 + "branch": "nixos-unstable", 37 + "submodules": false, 38 + "revision": "a84ebe20c6bc2ecbcfb000a50776219f48d134cc", 39 + "url": "https://github.com/nixos/nixpkgs/archive/a84ebe20c6bc2ecbcfb000a50776219f48d134cc.tar.gz", 40 + "hash": "sha256-mNqIplmEohk5jRkqYqG19GA8MbQ/D4gQSK0Mu4LvfRQ=" 41 + }, 42 + "quickshell": { 43 + "type": "GitRelease", 44 + "repository": { 45 + "type": "Git", 46 + "url": "https://git.outfoxxed.me/quickshell/quickshell.git" 47 + }, 48 + "pre_releases": false, 49 + "version_upper_bound": null, 50 + "release_prefix": null, 51 + "submodules": false, 52 + "version": "v0.2.0", 53 + "revision": "a5431dd02dc23d9ef1680e67777fed00fe5f7cda", 54 + "url": null, 55 + "hash": "sha256-vqkSDvh7hWhPvNjMjEDV4KbSCv2jyl2Arh73ZXe274k=" 56 + } 57 + }, 58 + "version": 6 59 + }
+32
sprinkles/src/cli.rs
··· 1 + use clap::{ArgAction, Parser, Subcommand}; 2 + 3 + #[derive(Parser)] 4 + #[command(version, about, long_about = None)] 5 + pub struct Cli { 6 + #[command(subcommand)] 7 + pub command: Commands, 8 + } 9 + 10 + #[derive(Subcommand)] 11 + pub enum Commands { 12 + #[command(alias = "notifications")] 13 + Notification { 14 + #[command(subcommand)] 15 + subcommand: NotificationSubcommand, 16 + }, 17 + } 18 + 19 + #[derive(Subcommand)] 20 + pub enum NotificationSubcommand { 21 + Server, 22 + Close { 23 + notification_id: u32, 24 + }, 25 + Query { 26 + query: String, 27 + #[arg(long, conflicts_with = "raw", action = ArgAction::SetTrue, default_value_t = false)] 28 + json: bool, 29 + #[arg(long, conflicts_with = "json", action = ArgAction::SetTrue, default_value_t = false)] 30 + raw: bool, 31 + }, 32 + }
+69
sprinkles/src/db/get_parsed_notification.sql
··· 1 + WITH nid AS ( 2 + SELECT id, dbus_notification_id, closed 3 + FROM notifications 4 + WHERE id = ? 5 + ), 6 + current AS ( 7 + SELECT c.*, c.id AS raw_id 8 + FROM dbus_notifications c 9 + JOIN nid ON c.id = nid.dbus_notification_id 10 + ), 11 + actions AS ( 12 + SELECT action 13 + FROM notification_actions 14 + WHERE dbus_notification_id = (SELECT dbus_notification_id FROM nid) 15 + ORDER BY action 16 + ), 17 + hints AS ( 18 + SELECT k, value 19 + FROM notification_hints 20 + WHERE dbus_notification_id = (SELECT dbus_notification_id FROM nid) 21 + ), 22 + history AS ( 23 + SELECT 24 + h.*, 25 + p.idx, 26 + ( 27 + SELECT json_group_array(action ORDER BY action) 28 + FROM notification_actions na 29 + WHERE na.dbus_notification_id = h.id 30 + ) AS actions, 31 + ( 32 + SELECT json_group_object(k, value) 33 + FROM notification_hints nh 34 + WHERE nh.dbus_notification_id = h.id 35 + ) AS hints 36 + FROM previous_dbus_notifications p 37 + JOIN dbus_notifications h ON h.id = p.dbus_notification_id 38 + WHERE p.notification_id = (SELECT id FROM nid) 39 + ORDER BY p.idx ASC 40 + ) 41 + SELECT 42 + (SELECT id FROM nid) AS id, 43 + (SELECT closed FROM nid) AS closed, 44 + (SELECT CAST(json_object( 45 + 'id', lower(substr(hex(current.id),1,8)||'-'||substr(hex(current.id),9,4)||'-'||substr(hex(current.id),13,4)||'-'||substr(hex(current.id),17,4)||'-'||substr(hex(current.id),21)), 46 + 'app_name', current.app_name, 47 + 'replaces_id', COALESCE(current.replaces_id, 0), 48 + 'app_icon', current.app_icon, 49 + 'summary', current.summary, 50 + 'body', current.body, 51 + 'expire_timeout',current.expire_timeout, 52 + 'actions', (SELECT json_group_array(action) FROM actions), 53 + 'hints', (SELECT json_group_object(k,value) FROM hints) 54 + ) AS TEXT) FROM current) AS dbus_notification, 55 + (SELECT CAST(json_group_array( 56 + json_object( 57 + 'id', lower(substr(hex(history.id),1,8)||'-'||substr(hex(history.id),9,4)||'-'||substr(hex(history.id),13,4)||'-'||substr(hex(history.id),17,4)||'-'||substr(hex(history.id),21)), 58 + 'app_name', history.app_name, 59 + 'replaces_id', COALESCE(history.replaces_id, 0), 60 + 'app_icon', history.app_icon, 61 + 'summary', history.summary, 62 + 'body', history.body, 63 + 'expire_timeout',history.expire_timeout, 64 + 'actions', history.actions, 65 + 'hints', history.hints 66 + ) 67 + ORDER BY idx 68 + ) AS TEXT) FROM history) AS history 69 + ;
+52
sprinkles/src/db/intermediates.rs
··· 1 + use serde::{Deserialize, Deserializer, de::DeserializeOwned}; 2 + use serde_json::{Value, from_value}; 3 + use sqlx::FromRow; 4 + use std::collections::HashMap; 5 + use uuid::Uuid; 6 + 7 + #[derive(Debug, Clone, FromRow)] 8 + pub struct ReturnedNotification { 9 + pub id: i32, 10 + pub dbus_notification_id: uuid::Uuid, 11 + } 12 + 13 + #[derive(Debug, Clone, FromRow)] 14 + pub struct Count { 15 + pub count: u32, 16 + } 17 + 18 + fn from_json_or_str<'de, D, T>(deser: D) -> Result<T, D::Error> 19 + where 20 + D: Deserializer<'de>, 21 + T: DeserializeOwned, 22 + { 23 + let v = Value::deserialize(deser)?; 24 + match v { 25 + Value::Array(_) | Value::Object(_) => from_value::<T>(v).map_err(serde::de::Error::custom), 26 + Value::String(s) => serde_json::from_str::<T>(&s).map_err(serde::de::Error::custom), 27 + _ => Err(serde::de::Error::custom("unexpected json type")), 28 + } 29 + } 30 + 31 + #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] 32 + pub struct ParsedDBusNotification { 33 + pub id: Uuid, 34 + pub app_name: String, 35 + pub replaces_id: u32, 36 + pub app_icon: String, 37 + pub summary: String, 38 + pub body: String, 39 + pub expire_timeout: i32, 40 + #[serde(deserialize_with = "from_json_or_str")] 41 + pub actions: Vec<String>, 42 + #[serde(deserialize_with = "from_json_or_str")] 43 + pub hints: HashMap<String, String>, 44 + } 45 + 46 + #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] 47 + pub struct ParsedNotification { 48 + pub id: u32, 49 + pub dbus_notification: ParsedDBusNotification, 50 + pub read: bool, 51 + pub history: Vec<ParsedDBusNotification>, 52 + }
+236
sprinkles/src/db/mod.rs
··· 1 + use intermediates::ParsedNotification; 2 + use sqlx::{Connection, Row}; 3 + use std::collections::HashMap; 4 + use std::str::FromStr as _; 5 + 6 + pub mod intermediates; 7 + pub mod parser; 8 + pub mod tables; 9 + 10 + pub struct DB { 11 + connection: sqlx::sqlite::SqliteConnection, 12 + } 13 + 14 + impl DB { 15 + pub async fn default() -> Self { 16 + let dev_mode = std::env::var("SPRINKLES_DEV").is_ok(); 17 + let mut data_dir = dirs::data_local_dir().unwrap(); 18 + data_dir.push("sprinkles"); 19 + if !dev_mode && !std::fs::exists(data_dir.clone()).unwrap() { 20 + std::fs::create_dir(data_dir.clone()).unwrap(); 21 + } 22 + let db_opts = sqlx::sqlite::SqliteConnectOptions::from_str(if dev_mode { 23 + "test.db" 24 + } else { 25 + data_dir.push("sprinkles.db"); 26 + data_dir.to_str().unwrap() 27 + }) 28 + .unwrap() 29 + .create_if_missing(true); 30 + DB::new( 31 + sqlx::SqliteConnection::connect_with(&db_opts) 32 + .await 33 + .unwrap(), 34 + ) 35 + .await 36 + } 37 + 38 + pub async fn new(mut connection: sqlx::sqlite::SqliteConnection) -> Self { 39 + sqlx::migrate!().run(&mut connection).await.unwrap(); 40 + DB { connection } 41 + } 42 + 43 + pub async fn get_parsed_notification( 44 + &mut self, 45 + notification_id: u32, 46 + ) -> Result<ParsedNotification, sqlx::Error> { 47 + let row = sqlx::query(include_str!("get_parsed_notification.sql")) 48 + .bind(notification_id) 49 + .fetch_one(&mut self.connection) 50 + .await?; 51 + 52 + let id = row.get("id"); 53 + let read = row.get("read"); 54 + let dbus_json_bytes: Vec<u8> = row.get("dbus_notification"); 55 + let history_json_bytes: Vec<u8> = row.get("history"); 56 + 57 + let dbus_json = String::from_utf8(dbus_json_bytes) 58 + .map_err(|a| sqlx::Error::Decode(format!("invalid utf-8: {a:?}").into()))?; 59 + let history_json = String::from_utf8(history_json_bytes) 60 + .map_err(|a| sqlx::Error::Decode(format!("invalid utf-8: {a:?}").into()))?; 61 + 62 + Ok(ParsedNotification { 63 + id, 64 + read, 65 + dbus_notification: serde_json::from_str(&dbus_json) 66 + .map_err(|e| sqlx::Error::Decode(Box::new(e)))?, 67 + history: serde_json::from_str(&history_json) 68 + .map_err(|e| sqlx::Error::Decode(Box::new(e)))?, 69 + }) 70 + } 71 + 72 + pub async fn get_notification( 73 + &mut self, 74 + where_sql: &str, 75 + params: &Vec<String>, 76 + ) -> Result<Vec<intermediates::ParsedNotification>, sqlx::Error> { 77 + let sql = format!("SELECT * FROM notifications WHERE {where_sql}"); 78 + let mut builder = sqlx::query_as(&sql); 79 + 80 + for param in params { 81 + builder = builder.bind(param); 82 + } 83 + 84 + let fetched_notifications: Vec<tables::Notification> = 85 + builder.fetch_all(&mut self.connection).await.unwrap(); 86 + 87 + let mut notifications = Vec::<ParsedNotification>::new(); 88 + 89 + for nf in fetched_notifications { 90 + let parsed = self.get_parsed_notification(nf.id).await.unwrap(); 91 + notifications.push(parsed); 92 + } 93 + Ok(notifications) 94 + } 95 + 96 + pub async fn create_notification( 97 + &mut self, 98 + app_name: &str, 99 + replaces_id: u32, 100 + app_icon: &str, 101 + summary: &str, 102 + body: &str, 103 + actions: Vec<&str>, 104 + hints: HashMap<&str, zbus::zvariant::Value<'_>>, 105 + expire_timeout: i32, 106 + ) -> Result<tables::Notification, sqlx::Error> { 107 + let mut tx = self.connection.begin().await?; 108 + let dbus_notification: tables::DBusNotification = sqlx::query_as( 109 + "INSERT INTO dbus_notifications 110 + (id, app_name, replaces_id, app_icon, summary, body, expire_timeout) 111 + VALUES (?, ?, ?, ?, ?, ?, ?) 112 + RETURNING * 113 + ", 114 + ) 115 + .bind(uuid::Uuid::new_v4()) 116 + .bind(app_name) 117 + .bind(if replaces_id == 0 { 118 + None 119 + } else { 120 + Some(replaces_id) 121 + }) 122 + .bind(app_icon) 123 + .bind(summary) 124 + .bind(body) 125 + .bind(expire_timeout) 126 + .fetch_one(&mut *tx) 127 + .await?; 128 + 129 + for item in actions { 130 + sqlx::query( 131 + " 132 + INSERT INTO notification_actions 133 + (id, dbus_notification_id, action) 134 + VALUES (?, ?, ?)", 135 + ) 136 + .bind(uuid::Uuid::new_v4()) 137 + .bind(dbus_notification.id) 138 + .bind(item) 139 + .execute(&mut *tx) 140 + .await?; 141 + } 142 + 143 + for (key, value) in hints { 144 + sqlx::query( 145 + " 146 + INSERT INTO notification_hints 147 + (id, dbus_notification_id, k, value) 148 + VALUES (?, ?, ?, ?)", 149 + ) 150 + .bind(uuid::Uuid::new_v4()) 151 + .bind(dbus_notification.id) 152 + .bind(key) 153 + .bind(value.to_string()) 154 + .execute(&mut *tx) 155 + .await?; 156 + } 157 + let count = sqlx::query_as::<_, intermediates::Count>( 158 + " 159 + SELECT COUNT(id) as count FROM notifications 160 + ", 161 + ) 162 + .fetch_one(&mut *tx) 163 + .await? 164 + .count; 165 + 166 + let notification: tables::Notification = if replaces_id == 0 167 + || count == 0 168 + || replaces_id > count 169 + { 170 + sqlx::query_as( 171 + " 172 + INSERT INTO notifications 173 + (dbus_notification_id) 174 + VALUES (?) 175 + RETURNING *", 176 + ) 177 + .bind(dbus_notification.id) 178 + .fetch_one(&mut *tx) 179 + .await? 180 + } else { 181 + let n_returned: intermediates::ReturnedNotification = sqlx::query_as( 182 + " 183 + SELECT id, dbus_notification_id FROM notifications WHERE id = ? 184 + ", 185 + ) 186 + .bind(replaces_id) 187 + .fetch_one(&mut *tx) 188 + .await?; 189 + 190 + let prev_num = sqlx::query_as::<_, intermediates::Count>( 191 + " 192 + SELECT COUNT(id) as count FROM previous_dbus_notifications 193 + WHERE notification_id = ? 194 + ", 195 + ) 196 + .bind(n_returned.id) 197 + .fetch_one(&mut *tx) 198 + .await? 199 + .count; 200 + 201 + sqlx::query( 202 + " 203 + INSERT INTO previous_dbus_notifications (id, dbus_notification_id, notification_id, idx) 204 + VALUES (?, ?, ?, ?)", 205 + ) 206 + .bind(uuid::Uuid::new_v4()) 207 + .bind(n_returned.dbus_notification_id) 208 + .bind(n_returned.id) 209 + .bind(prev_num) 210 + .execute(&mut *tx) 211 + .await?; 212 + sqlx::query_as( 213 + " 214 + UPDATE notifications 215 + SET dbus_notification_id = ? 216 + WHERE id = ? 217 + RETURNING *", 218 + ) 219 + .bind(dbus_notification.id) 220 + .bind(replaces_id) 221 + .fetch_one(&mut *tx) 222 + .await? 223 + }; 224 + tx.commit().await?; 225 + 226 + Ok(notification) 227 + } 228 + 229 + pub async fn close_notification(&mut self, notification_id: u32) { 230 + sqlx::query("UPDATE notifications SET read = true WHERE id = ?") 231 + .bind(notification_id) 232 + .execute(&mut self.connection) 233 + .await 234 + .unwrap(); 235 + } 236 + }
+339
sprinkles/src/db/parser.rs
··· 1 + use std::collections::VecDeque; 2 + 3 + #[derive(Debug, Clone, PartialEq)] 4 + enum Token { 5 + // Literals 6 + Ident(String), 7 + Number(i64), 8 + 9 + // Delims 10 + LParen, 11 + RParen, 12 + LBrace, 13 + RBrace, 14 + DotDot, 15 + Comma, 16 + 17 + // Ops 18 + And, 19 + Or, 20 + Not, 21 + Eq, 22 + 23 + // Functions 24 + Unread, 25 + Last, 26 + Page, 27 + } 28 + 29 + fn tokenize(input: &str) -> Result<Vec<Token>, String> { 30 + let mut chars = input.chars().peekable(); 31 + let mut tokens = Vec::new(); 32 + 33 + while let Some(c) = chars.next() { 34 + match c { 35 + ' ' | '\t' | '\n' | '\r' => continue, 36 + '(' => tokens.push(Token::LParen), 37 + ')' => tokens.push(Token::RParen), 38 + '{' => tokens.push(Token::LBrace), 39 + '}' => tokens.push(Token::RBrace), 40 + ',' => tokens.push(Token::Comma), 41 + '=' => tokens.push(Token::Eq), 42 + '!' => tokens.push(Token::Not), 43 + '&' => tokens.push(Token::And), 44 + '|' => tokens.push(Token::Or), 45 + '.' => { 46 + if chars.next() == Some('.') { 47 + tokens.push(Token::DotDot); 48 + } else { 49 + return Err("Expected '..'".into()); 50 + } 51 + } 52 + '0'..='9' => { 53 + let mut num = c.to_string(); 54 + while let Some(&d @ '0'..='9') = chars.peek() { 55 + num.push(d); 56 + chars.next(); 57 + } 58 + tokens.push(Token::Number(num.parse().unwrap())); 59 + } 60 + 'a'..='z' | 'A'..='Z' | '_' | '-' => { 61 + let mut ident = c.to_string(); 62 + while let Some(&ch) = chars.peek() { 63 + if ch.is_alphanumeric() || ch == '_' || ch == '-' { 64 + ident.push(ch); 65 + chars.next(); 66 + } else { 67 + break; 68 + } 69 + } 70 + let tok = match ident.as_str() { 71 + "and" | "AND" => Token::And, 72 + "or" | "OR" => Token::Or, 73 + "not" | "NOT" => Token::Not, 74 + "unread" => Token::Unread, 75 + "last" => Token::Last, 76 + "page" => Token::Page, 77 + _ => Token::Ident(ident), 78 + }; 79 + tokens.push(tok); 80 + } 81 + _ => return Err(format!("Unexpected character: {}", c)), 82 + } 83 + } 84 + 85 + Ok(tokens) 86 + } 87 + 88 + #[derive(Debug)] 89 + enum Expr { 90 + And(Box<Expr>, Box<Expr>), 91 + Or(Box<Expr>, Box<Expr>), 92 + Not(Box<Expr>), 93 + 94 + Range(i64, i64), 95 + 96 + AttrFilter(String, String), 97 + 98 + Unread, 99 + Last(i64), 100 + Page(i64, i64), 101 + } 102 + 103 + struct Parser { 104 + tokens: VecDeque<Token>, 105 + } 106 + 107 + impl Parser { 108 + fn new(tokens: Vec<Token>) -> Self { 109 + Self { 110 + tokens: tokens.into(), 111 + } 112 + } 113 + 114 + fn peek(&self) -> Option<&Token> { 115 + self.tokens.front() 116 + } 117 + 118 + fn pop(&mut self) -> Option<Token> { 119 + self.tokens.pop_front() 120 + } 121 + 122 + fn expect(&mut self, expected: Token) -> Result<(), String> { 123 + let tok = self.pop(); 124 + if tok == Some(expected.clone()) { 125 + Ok(()) 126 + } else { 127 + Err(format!("Expected {:?}, got {:?}", expected, tok)) 128 + } 129 + } 130 + 131 + fn parse(&mut self) -> Result<Expr, String> { 132 + let expr = self.or_expr()?; 133 + Ok(expr) 134 + } 135 + 136 + fn or_expr(&mut self) -> Result<Expr, String> { 137 + let mut left = self.and_expr()?; 138 + while let Some(Token::Or) | Some(Token::Ident(_)) = self.peek() { 139 + if let Some(Token::Ident(s)) = self.peek() { 140 + if s.to_lowercase() != "or" { 141 + break; 142 + } 143 + } 144 + self.pop(); 145 + let right = self.and_expr()?; 146 + left = Expr::Or(Box::new(left), Box::new(right)); 147 + } 148 + Ok(left) 149 + } 150 + 151 + fn and_expr(&mut self) -> Result<Expr, String> { 152 + let mut left = self.not_expr()?; 153 + while let Some(Token::And) | Some(Token::Ident(_)) = self.peek() { 154 + if let Some(Token::Ident(s)) = self.peek() { 155 + if s.to_lowercase() != "and" { 156 + break; 157 + } 158 + } 159 + self.pop(); // consume AND 160 + let right = self.not_expr()?; 161 + left = Expr::And(Box::new(left), Box::new(right)); 162 + } 163 + Ok(left) 164 + } 165 + 166 + fn not_expr(&mut self) -> Result<Expr, String> { 167 + if let Some(Token::Not) = self.peek() { 168 + self.pop(); 169 + let expr = self.not_expr()?; 170 + return Ok(Expr::Not(Box::new(expr))); 171 + } 172 + self.primary() 173 + } 174 + 175 + fn primary(&mut self) -> Result<Expr, String> { 176 + match self.peek() { 177 + Some(Token::LBrace) => self.attr_filter(), 178 + Some(Token::Number(_)) => self.range(), 179 + Some(Token::Ident(_)) | Some(Token::Unread) | Some(Token::Last) | Some(Token::Page) => { 180 + self.function_call() 181 + } 182 + Some(Token::LParen) => { 183 + self.pop(); 184 + let expr = self.parse()?; 185 + self.expect(Token::RParen)?; 186 + Ok(expr) 187 + } 188 + tok => Err(format!("Unexpected token {:?}", tok)), 189 + } 190 + } 191 + 192 + fn range(&mut self) -> Result<Expr, String> { 193 + let start = match self.pop() { 194 + Some(Token::Number(n)) => n, 195 + _ => return Err("Expected number for range start".into()), 196 + }; 197 + self.expect(Token::DotDot)?; 198 + let end = match self.pop() { 199 + Some(Token::Number(n)) => n, 200 + _ => return Err("Expected number for range end".into()), 201 + }; 202 + Ok(Expr::Range(start, end)) 203 + } 204 + 205 + fn attr_filter(&mut self) -> Result<Expr, String> { 206 + self.expect(Token::LBrace)?; 207 + let attr = match self.pop() { 208 + Some(Token::Ident(s)) => s, 209 + _ => return Err("Expected attribute name".into()), 210 + }; 211 + self.expect(Token::Eq)?; 212 + let value = match self.pop() { 213 + Some(Token::Ident(s)) => s, 214 + Some(Token::Number(n)) => n.to_string(), 215 + _ => return Err("Expected value after '='".into()), 216 + }; 217 + self.expect(Token::RBrace)?; 218 + Ok(Expr::AttrFilter(attr, value)) 219 + } 220 + 221 + fn function_call(&mut self) -> Result<Expr, String> { 222 + match self.pop() { 223 + Some(Token::Unread) => { 224 + // self.expect(Token::LParen)?; 225 + // self.expect(Token::RParen)?; 226 + return Ok(Expr::Unread); 227 + } 228 + Some(Token::Last) => { 229 + self.expect(Token::LParen)?; 230 + let (num, defaulted) = match self.pop() { 231 + Some(Token::Number(n)) => (n, false), 232 + Some(Token::RParen) => (1, true), 233 + _ => return Err("Unclosed parenthesis when calling last".into()), 234 + }; 235 + if !defaulted { 236 + self.expect(Token::RParen)?; 237 + } 238 + return Ok(Expr::Last(num)); 239 + } 240 + Some(Token::Page) => { 241 + self.expect(Token::LParen)?; 242 + let offset = match self.pop() { 243 + Some(Token::Number(n)) => n, 244 + _ => 0, 245 + }; 246 + let per_page = if let Some(Token::Comma) = self.peek() { 247 + self.pop(); 248 + match self.pop() { 249 + Some(Token::Number(n)) => n, 250 + _ => return Err("Expected per_page in page(offset, per_page)".into()), 251 + } 252 + } else { 253 + 10 254 + }; 255 + self.expect(Token::RParen)?; 256 + return Ok(Expr::Page(offset, per_page)); 257 + } 258 + _ => return Err("Unknown function".into()), 259 + }; 260 + } 261 + } 262 + 263 + struct SqlEmitter { 264 + params: Vec<String>, 265 + } 266 + 267 + impl SqlEmitter { 268 + fn new() -> Self { 269 + SqlEmitter { params: Vec::new() } 270 + } 271 + 272 + fn push(&mut self, s: String) -> () { 273 + self.params.push(s); 274 + } 275 + 276 + fn emit(&mut self, expr: &Expr) -> String { 277 + match expr { 278 + Expr::And(l, r) => format!("({} AND {})", self.emit(l), self.emit(r)), 279 + Expr::Or(l, r) => format!("({} OR {})", self.emit(l), self.emit(r)), 280 + Expr::Not(e) => format!("(NOT {})", self.emit(e)), 281 + Expr::Range(a, b) => { 282 + self.push(a.to_string()); 283 + self.push(b.to_string()); 284 + "id BETWEEN ? AND ?".into() 285 + } 286 + Expr::AttrFilter(attr, value) => { 287 + self.push(value.clone()); 288 + format!( 289 + "EXISTS ( \ 290 + SELECT 1 \ 291 + FROM dbus_notifications d \ 292 + WHERE d.id = dbus_notification_id \ 293 + AND d.{} = ? \ 294 + )", 295 + attr 296 + ) 297 + } 298 + Expr::Unread => "closed = 0".into(), 299 + Expr::Last(n) => { 300 + self.push(n.to_string()); 301 + "id IN (SELECT id FROM notifications ORDER BY id DESC LIMIT ?)".into() 302 + } 303 + Expr::Page(offset, per_page) => { 304 + self.push(offset.to_string()); 305 + self.push(per_page.to_string()); 306 + "id IN (SELECT id FROM notifications ORDER BY id DESC LIMIT ? OFFSET ?)".into() 307 + } 308 + } 309 + } 310 + } 311 + 312 + pub fn parse_query(query: &str) -> Result<(String, Vec<String>), String> { 313 + let tokens = tokenize(query)?; 314 + let mut parser = Parser::new(tokens); 315 + let ast = parser.parse()?; 316 + let mut emitter = SqlEmitter::new(); 317 + let sql = emitter.emit(&ast); 318 + Ok((sql, emitter.params)) 319 + } 320 + 321 + #[cfg(test)] 322 + mod tests { 323 + use super::*; 324 + 325 + #[test] 326 + fn basic_and() { 327 + let (sql, params) = parse_query("{urgent = 1} & unread()").unwrap(); 328 + assert_eq!(sql, "(EXISTS ( SELECT 1 FROM dbus_notifications d WHERE d.id = dbus_notification_id AND d.urgent = ? ) AND closed = 0)"); 329 + assert_eq!(params, vec!["1"]); 330 + } 331 + 332 + #[test] 333 + fn range_and_page() { 334 + let (sql, params) = parse_query("100..200 & page(20,5)").unwrap(); 335 + assert!(sql.contains("BETWEEN ? AND ?")); 336 + assert!(sql.contains("LIMIT ? OFFSET ?")); 337 + assert_eq!(params, vec!["100", "200", "20", "5"]); 338 + } 339 + }
+44
sprinkles/src/db/tables.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + use sqlx::FromRow; 3 + use uuid::Uuid; 4 + 5 + #[derive(Debug, Clone, Serialize, Deserialize, FromRow)] 6 + pub struct DBusNotification { 7 + pub id: Uuid, 8 + pub app_name: String, 9 + pub replaces_id: u32, 10 + pub app_icon: String, 11 + pub summary: String, 12 + pub body: String, 13 + pub expire_timeout: i32, 14 + } 15 + 16 + #[derive(Debug, Clone, Serialize, Deserialize, FromRow)] 17 + pub struct Notification { 18 + pub id: u32, 19 + pub dbus_notification_id: Uuid, 20 + pub read: bool, 21 + } 22 + 23 + #[derive(Debug, Clone, Serialize, Deserialize, FromRow)] 24 + pub struct NotificationAction { 25 + pub id: Uuid, 26 + pub dbus_notification_id: Uuid, 27 + pub action: String, 28 + } 29 + 30 + #[derive(Debug, Clone, Serialize, Deserialize, FromRow)] 31 + pub struct NotificationHint { 32 + pub id: Uuid, 33 + pub dbus_notification_id: Uuid, 34 + pub k: String, 35 + pub value: String, 36 + } 37 + 38 + #[derive(Debug, Clone, Serialize, Deserialize, FromRow)] 39 + pub struct PreviousDbusNotification { 40 + pub id: Uuid, 41 + pub notification_id: u32, 42 + pub dbus_notification_id: Uuid, 43 + pub idx: u32, 44 + }
+37
sprinkles/src/main.rs
··· 1 + use clap::Parser as _; 2 + 3 + mod cli; 4 + mod db; 5 + mod server; 6 + 7 + #[tokio::main] 8 + async fn main() -> Result<(), Box<dyn std::error::Error>> { 9 + let cli = cli::Cli::parse(); 10 + 11 + match cli.command { 12 + cli::Commands::Notification { subcommand } => match subcommand { 13 + cli::NotificationSubcommand::Server => { 14 + server::server().await.unwrap(); 15 + Ok(()) 16 + } 17 + cli::NotificationSubcommand::Query { 18 + query, 19 + json: _, 20 + raw: _, 21 + } => { 22 + let (sql, params) = db::parser::parse_query(&query).unwrap(); 23 + // println!("{sql}"); 24 + let mut database = db::DB::default().await; 25 + let notifications = database.get_notification(&sql, &params).await.unwrap(); 26 + 27 + println!("{}", serde_json::to_string(&notifications).unwrap()); 28 + Ok(()) 29 + } 30 + cli::NotificationSubcommand::Close { notification_id } => { 31 + let mut database = db::DB::default().await; 32 + database.close_notification(notification_id).await; 33 + Ok(()) 34 + } 35 + }, 36 + } 37 + }
+69
sprinkles/src/server.rs
··· 1 + use zbus::{connection::Builder as ConnectionBuilder, interface as dbus_interface}; 2 + 3 + pub struct NotificationServer { 4 + database: crate::db::DB, 5 + } 6 + 7 + #[dbus_interface(name = "org.freedesktop.Notifications")] 8 + impl NotificationServer { 9 + async fn notify( 10 + &mut self, 11 + app_name: &str, 12 + replaces_id: u32, 13 + app_icon: &str, 14 + summary: &str, 15 + body: &str, 16 + actions: Vec<&str>, 17 + hints: std::collections::HashMap<&str, zbus::zvariant::Value<'_>>, 18 + expire_timeout: i32, 19 + ) -> u32 { 20 + let notification = self 21 + .database 22 + .create_notification( 23 + app_name, 24 + replaces_id, 25 + app_icon, 26 + summary, 27 + body, 28 + actions, 29 + hints, 30 + expire_timeout, 31 + ) 32 + .await 33 + .unwrap(); 34 + println!("Notification created with ID: {}", notification.id); 35 + return notification.id; 36 + } 37 + 38 + async fn close_notification(&mut self, id: u32) { 39 + self.database.close_notification(id).await; 40 + } 41 + 42 + async fn get_capabilities(&self) -> Vec<String> { 43 + vec!["body".to_string(), "actions".to_string()] 44 + } 45 + 46 + async fn get_server_information(&self) -> (String, String, String, String) { 47 + ( 48 + "Sprinkles".to_string(), 49 + "FreshlyBakedCake".to_string(), 50 + "1.0".to_string(), 51 + "1.2".to_string(), 52 + ) 53 + } 54 + } 55 + 56 + pub async fn server() -> Result<(), Box<dyn std::error::Error>> { 57 + let db = crate::db::DB::default().await; 58 + 59 + let notification_server = NotificationServer { database: db }; 60 + 61 + let _conn = ConnectionBuilder::session()? 62 + .name("org.freedesktop.Notifications")? 63 + .serve_at("/org/freedesktop/Notifications", notification_server)? 64 + .build() 65 + .await?; 66 + 67 + std::future::pending::<()>().await; 68 + Ok(()) 69 + }
+1
sprinkles/workspace.josh
··· 1 + :empty