├── .github ├── dependabot.yml └── workflows │ ├── release.yml │ └── typos.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── archlinux ├── PKGBUILD └── xdg-desktop-portal-shana.install ├── meson.build ├── misc ├── config.toml ├── org.freedesktop.impl.portal.desktop.shana.service.in ├── shana.portal ├── test │ ├── config1.toml │ └── config2.toml └── xdg-desktop-portal-shana.service.in ├── show ├── choosefile.png └── savefile.png ├── src ├── backends.rs ├── config.rs ├── main.rs └── protaltypes.rs └── tools └── shanatest ├── .gitignore ├── Cargo.lock ├── Cargo.toml └── src └── main.rs /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | # docs 7 | # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 8 | version: 2 9 | updates: 10 | - package-ecosystem: "cargo" 11 | directory: "/" 12 | schedule: 13 | interval: "weekly" 14 | # We release on Tuesdays and open dependabot PRs will rebase after the 15 | # version bump and thus consume unnecessary workers during release, thus 16 | # let's open new ones on Wednesday 17 | day: "wednesday" 18 | ignore: 19 | - dependency-name: "*" 20 | update-types: ["version-update:semver-patch"] 21 | groups: 22 | # Only update polars as a whole as there are many subcrates that need to 23 | # be updated at once. We explicitly depend on some of them, so batch their 24 | # updates to not take up dependabot PR slots with dysfunctional PRs 25 | polars: 26 | patterns: 27 | - "polars" 28 | - "polars-*" 29 | - package-ecosystem: "github-actions" 30 | directory: "/" 31 | schedule: 32 | interval: "weekly" 33 | day: "wednesday" 34 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - v* 9 | pull_request: 10 | branches: 11 | - master 12 | concurrency: 13 | group: ${{ github.ref }} 14 | cancel-in-progress: true 15 | jobs: 16 | build: 17 | name: Build Binary 18 | strategy: 19 | matrix: 20 | os: 21 | - ubuntu-latest 22 | include: 23 | - os: ubuntu-latest 24 | target: x86_64-unknown-linux-gnu 25 | artifact_name: xdg-desktop-portal-shana 26 | 27 | runs-on: ${{ matrix.os }} 28 | steps: 29 | - uses: actions/checkout@v4 30 | - uses: dtolnay/rust-toolchain@stable 31 | with: 32 | targets: ${{ matrix.target }} 33 | - name: Build 34 | run: cargo build --verbose --release 35 | - name: Run tests 36 | run: cargo test --verbose 37 | - name: Upload artifacts 38 | uses: actions/upload-artifact@v4 39 | with: 40 | path: target/release/${{ matrix.artifact_name }} 41 | name: ${{ matrix.target }} 42 | release: 43 | permissions: 44 | contents: write 45 | if: startsWith(github.ref, 'refs/tags/v') 46 | needs: 47 | - build 48 | runs-on: ubuntu-latest 49 | steps: 50 | - uses: actions/download-artifact@v4 51 | - name: Show files 52 | run: | 53 | pwd 54 | find 55 | - name: Copy files 56 | run: | 57 | mkdir out 58 | mv x86_64-unknown-linux-gnu/xdg-desktop-portal-shana out/xdg-desktop-portal-shana-x86_64-unknown-linux-gnu 59 | cd out 60 | sha256sum * > sha256sum 61 | - name: Release 62 | uses: softprops/action-gh-release@v2 63 | with: 64 | files: out/* 65 | draft: true 66 | -------------------------------------------------------------------------------- /.github/workflows/typos.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # yamllint disable rule:line-length 3 | name: check_typos 4 | 5 | on: # yamllint disable-line rule:truthy 6 | push: 7 | pull_request: 8 | branches: 9 | - '**' 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v4 17 | 18 | - name: typos-action 19 | uses: crate-ci/typos@v1.32.0 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /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.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "async-broadcast" 22 | version = "0.7.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 25 | dependencies = [ 26 | "event-listener", 27 | "event-listener-strategy", 28 | "futures-core", 29 | "pin-project-lite", 30 | ] 31 | 32 | [[package]] 33 | name = "async-recursion" 34 | version = "1.1.1" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 37 | dependencies = [ 38 | "proc-macro2", 39 | "quote", 40 | "syn", 41 | ] 42 | 43 | [[package]] 44 | name = "async-trait" 45 | version = "0.1.88" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 48 | dependencies = [ 49 | "proc-macro2", 50 | "quote", 51 | "syn", 52 | ] 53 | 54 | [[package]] 55 | name = "autocfg" 56 | version = "1.4.0" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 59 | 60 | [[package]] 61 | name = "backtrace" 62 | version = "0.3.75" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 65 | dependencies = [ 66 | "addr2line", 67 | "cfg-if", 68 | "libc", 69 | "miniz_oxide", 70 | "object", 71 | "rustc-demangle", 72 | "windows-targets", 73 | ] 74 | 75 | [[package]] 76 | name = "bitflags" 77 | version = "1.3.2" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 80 | 81 | [[package]] 82 | name = "bitflags" 83 | version = "2.9.1" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 86 | 87 | [[package]] 88 | name = "bytes" 89 | version = "1.10.1" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 92 | 93 | [[package]] 94 | name = "cfg-if" 95 | version = "1.0.0" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 98 | 99 | [[package]] 100 | name = "cfg_aliases" 101 | version = "0.2.1" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 104 | 105 | [[package]] 106 | name = "concurrent-queue" 107 | version = "2.5.0" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 110 | dependencies = [ 111 | "crossbeam-utils", 112 | ] 113 | 114 | [[package]] 115 | name = "crossbeam-utils" 116 | version = "0.8.21" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 119 | 120 | [[package]] 121 | name = "displaydoc" 122 | version = "0.2.5" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 125 | dependencies = [ 126 | "proc-macro2", 127 | "quote", 128 | "syn", 129 | ] 130 | 131 | [[package]] 132 | name = "endi" 133 | version = "1.1.0" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 136 | 137 | [[package]] 138 | name = "enumflags2" 139 | version = "0.7.11" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" 142 | dependencies = [ 143 | "enumflags2_derive", 144 | "serde", 145 | ] 146 | 147 | [[package]] 148 | name = "enumflags2_derive" 149 | version = "0.7.11" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" 152 | dependencies = [ 153 | "proc-macro2", 154 | "quote", 155 | "syn", 156 | ] 157 | 158 | [[package]] 159 | name = "equivalent" 160 | version = "1.0.2" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 163 | 164 | [[package]] 165 | name = "errno" 166 | version = "0.3.12" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" 169 | dependencies = [ 170 | "libc", 171 | "windows-sys 0.59.0", 172 | ] 173 | 174 | [[package]] 175 | name = "event-listener" 176 | version = "5.4.0" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 179 | dependencies = [ 180 | "concurrent-queue", 181 | "parking", 182 | "pin-project-lite", 183 | ] 184 | 185 | [[package]] 186 | name = "event-listener-strategy" 187 | version = "0.5.4" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 190 | dependencies = [ 191 | "event-listener", 192 | "pin-project-lite", 193 | ] 194 | 195 | [[package]] 196 | name = "fastrand" 197 | version = "2.3.0" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 200 | 201 | [[package]] 202 | name = "filetime" 203 | version = "0.2.25" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" 206 | dependencies = [ 207 | "cfg-if", 208 | "libc", 209 | "libredox", 210 | "windows-sys 0.59.0", 211 | ] 212 | 213 | [[package]] 214 | name = "form_urlencoded" 215 | version = "1.2.1" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 218 | dependencies = [ 219 | "percent-encoding", 220 | ] 221 | 222 | [[package]] 223 | name = "fsevent-sys" 224 | version = "4.1.0" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" 227 | dependencies = [ 228 | "libc", 229 | ] 230 | 231 | [[package]] 232 | name = "futures" 233 | version = "0.3.31" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 236 | dependencies = [ 237 | "futures-channel", 238 | "futures-core", 239 | "futures-executor", 240 | "futures-io", 241 | "futures-sink", 242 | "futures-task", 243 | "futures-util", 244 | ] 245 | 246 | [[package]] 247 | name = "futures-channel" 248 | version = "0.3.31" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 251 | dependencies = [ 252 | "futures-core", 253 | "futures-sink", 254 | ] 255 | 256 | [[package]] 257 | name = "futures-core" 258 | version = "0.3.31" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 261 | 262 | [[package]] 263 | name = "futures-executor" 264 | version = "0.3.31" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 267 | dependencies = [ 268 | "futures-core", 269 | "futures-task", 270 | "futures-util", 271 | ] 272 | 273 | [[package]] 274 | name = "futures-io" 275 | version = "0.3.31" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 278 | 279 | [[package]] 280 | name = "futures-lite" 281 | version = "2.6.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 284 | dependencies = [ 285 | "fastrand", 286 | "futures-core", 287 | "futures-io", 288 | "parking", 289 | "pin-project-lite", 290 | ] 291 | 292 | [[package]] 293 | name = "futures-macro" 294 | version = "0.3.31" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 297 | dependencies = [ 298 | "proc-macro2", 299 | "quote", 300 | "syn", 301 | ] 302 | 303 | [[package]] 304 | name = "futures-sink" 305 | version = "0.3.31" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 308 | 309 | [[package]] 310 | name = "futures-task" 311 | version = "0.3.31" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 314 | 315 | [[package]] 316 | name = "futures-util" 317 | version = "0.3.31" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 320 | dependencies = [ 321 | "futures-channel", 322 | "futures-core", 323 | "futures-io", 324 | "futures-macro", 325 | "futures-sink", 326 | "futures-task", 327 | "memchr", 328 | "pin-project-lite", 329 | "pin-utils", 330 | "slab", 331 | ] 332 | 333 | [[package]] 334 | name = "getrandom" 335 | version = "0.3.3" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 338 | dependencies = [ 339 | "cfg-if", 340 | "libc", 341 | "r-efi", 342 | "wasi 0.14.2+wasi-0.2.4", 343 | ] 344 | 345 | [[package]] 346 | name = "gimli" 347 | version = "0.31.1" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 350 | 351 | [[package]] 352 | name = "hashbrown" 353 | version = "0.15.3" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 356 | 357 | [[package]] 358 | name = "hex" 359 | version = "0.4.3" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 362 | 363 | [[package]] 364 | name = "icu_collections" 365 | version = "2.0.0" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 368 | dependencies = [ 369 | "displaydoc", 370 | "potential_utf", 371 | "yoke", 372 | "zerofrom", 373 | "zerovec", 374 | ] 375 | 376 | [[package]] 377 | name = "icu_locale_core" 378 | version = "2.0.0" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 381 | dependencies = [ 382 | "displaydoc", 383 | "litemap", 384 | "tinystr", 385 | "writeable", 386 | "zerovec", 387 | ] 388 | 389 | [[package]] 390 | name = "icu_normalizer" 391 | version = "2.0.0" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 394 | dependencies = [ 395 | "displaydoc", 396 | "icu_collections", 397 | "icu_normalizer_data", 398 | "icu_properties", 399 | "icu_provider", 400 | "smallvec", 401 | "zerovec", 402 | ] 403 | 404 | [[package]] 405 | name = "icu_normalizer_data" 406 | version = "2.0.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 409 | 410 | [[package]] 411 | name = "icu_properties" 412 | version = "2.0.1" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 415 | dependencies = [ 416 | "displaydoc", 417 | "icu_collections", 418 | "icu_locale_core", 419 | "icu_properties_data", 420 | "icu_provider", 421 | "potential_utf", 422 | "zerotrie", 423 | "zerovec", 424 | ] 425 | 426 | [[package]] 427 | name = "icu_properties_data" 428 | version = "2.0.1" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 431 | 432 | [[package]] 433 | name = "icu_provider" 434 | version = "2.0.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 437 | dependencies = [ 438 | "displaydoc", 439 | "icu_locale_core", 440 | "stable_deref_trait", 441 | "tinystr", 442 | "writeable", 443 | "yoke", 444 | "zerofrom", 445 | "zerotrie", 446 | "zerovec", 447 | ] 448 | 449 | [[package]] 450 | name = "idna" 451 | version = "1.0.3" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 454 | dependencies = [ 455 | "idna_adapter", 456 | "smallvec", 457 | "utf8_iter", 458 | ] 459 | 460 | [[package]] 461 | name = "idna_adapter" 462 | version = "1.2.1" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 465 | dependencies = [ 466 | "icu_normalizer", 467 | "icu_properties", 468 | ] 469 | 470 | [[package]] 471 | name = "indexmap" 472 | version = "2.9.0" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 475 | dependencies = [ 476 | "equivalent", 477 | "hashbrown", 478 | ] 479 | 480 | [[package]] 481 | name = "inotify" 482 | version = "0.11.0" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" 485 | dependencies = [ 486 | "bitflags 2.9.1", 487 | "inotify-sys", 488 | "libc", 489 | ] 490 | 491 | [[package]] 492 | name = "inotify-sys" 493 | version = "0.1.5" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" 496 | dependencies = [ 497 | "libc", 498 | ] 499 | 500 | [[package]] 501 | name = "kqueue" 502 | version = "1.1.1" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" 505 | dependencies = [ 506 | "kqueue-sys", 507 | "libc", 508 | ] 509 | 510 | [[package]] 511 | name = "kqueue-sys" 512 | version = "1.0.4" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" 515 | dependencies = [ 516 | "bitflags 1.3.2", 517 | "libc", 518 | ] 519 | 520 | [[package]] 521 | name = "lazy_static" 522 | version = "1.5.0" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 525 | 526 | [[package]] 527 | name = "libc" 528 | version = "0.2.172" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 531 | 532 | [[package]] 533 | name = "libredox" 534 | version = "0.1.3" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 537 | dependencies = [ 538 | "bitflags 2.9.1", 539 | "libc", 540 | "redox_syscall", 541 | ] 542 | 543 | [[package]] 544 | name = "linux-raw-sys" 545 | version = "0.9.4" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 548 | 549 | [[package]] 550 | name = "litemap" 551 | version = "0.8.0" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 554 | 555 | [[package]] 556 | name = "lock_api" 557 | version = "0.4.13" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 560 | dependencies = [ 561 | "autocfg", 562 | "scopeguard", 563 | ] 564 | 565 | [[package]] 566 | name = "log" 567 | version = "0.4.27" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 570 | 571 | [[package]] 572 | name = "memchr" 573 | version = "2.7.4" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 576 | 577 | [[package]] 578 | name = "memoffset" 579 | version = "0.9.1" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 582 | dependencies = [ 583 | "autocfg", 584 | ] 585 | 586 | [[package]] 587 | name = "miniz_oxide" 588 | version = "0.8.8" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 591 | dependencies = [ 592 | "adler2", 593 | ] 594 | 595 | [[package]] 596 | name = "mio" 597 | version = "1.0.4" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 600 | dependencies = [ 601 | "libc", 602 | "log", 603 | "wasi 0.11.0+wasi-snapshot-preview1", 604 | "windows-sys 0.59.0", 605 | ] 606 | 607 | [[package]] 608 | name = "nix" 609 | version = "0.30.1" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 612 | dependencies = [ 613 | "bitflags 2.9.1", 614 | "cfg-if", 615 | "cfg_aliases", 616 | "libc", 617 | "memoffset", 618 | ] 619 | 620 | [[package]] 621 | name = "notify" 622 | version = "8.0.0" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" 625 | dependencies = [ 626 | "bitflags 2.9.1", 627 | "filetime", 628 | "fsevent-sys", 629 | "inotify", 630 | "kqueue", 631 | "libc", 632 | "log", 633 | "mio", 634 | "notify-types", 635 | "walkdir", 636 | "windows-sys 0.59.0", 637 | ] 638 | 639 | [[package]] 640 | name = "notify-types" 641 | version = "2.0.0" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" 644 | 645 | [[package]] 646 | name = "nu-ansi-term" 647 | version = "0.46.0" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 650 | dependencies = [ 651 | "overload", 652 | "winapi", 653 | ] 654 | 655 | [[package]] 656 | name = "object" 657 | version = "0.36.7" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 660 | dependencies = [ 661 | "memchr", 662 | ] 663 | 664 | [[package]] 665 | name = "once_cell" 666 | version = "1.21.3" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 669 | 670 | [[package]] 671 | name = "ordered-stream" 672 | version = "0.2.0" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 675 | dependencies = [ 676 | "futures-core", 677 | "pin-project-lite", 678 | ] 679 | 680 | [[package]] 681 | name = "overload" 682 | version = "0.1.1" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 685 | 686 | [[package]] 687 | name = "parking" 688 | version = "2.2.1" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 691 | 692 | [[package]] 693 | name = "parking_lot" 694 | version = "0.12.4" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 697 | dependencies = [ 698 | "lock_api", 699 | "parking_lot_core", 700 | ] 701 | 702 | [[package]] 703 | name = "parking_lot_core" 704 | version = "0.9.11" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 707 | dependencies = [ 708 | "cfg-if", 709 | "libc", 710 | "redox_syscall", 711 | "smallvec", 712 | "windows-targets", 713 | ] 714 | 715 | [[package]] 716 | name = "percent-encoding" 717 | version = "2.3.1" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 720 | 721 | [[package]] 722 | name = "pin-project-lite" 723 | version = "0.2.16" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 726 | 727 | [[package]] 728 | name = "pin-utils" 729 | version = "0.1.0" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 732 | 733 | [[package]] 734 | name = "potential_utf" 735 | version = "0.1.2" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 738 | dependencies = [ 739 | "zerovec", 740 | ] 741 | 742 | [[package]] 743 | name = "proc-macro-crate" 744 | version = "3.3.0" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 747 | dependencies = [ 748 | "toml_edit", 749 | ] 750 | 751 | [[package]] 752 | name = "proc-macro2" 753 | version = "1.0.95" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 756 | dependencies = [ 757 | "unicode-ident", 758 | ] 759 | 760 | [[package]] 761 | name = "quote" 762 | version = "1.0.40" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 765 | dependencies = [ 766 | "proc-macro2", 767 | ] 768 | 769 | [[package]] 770 | name = "r-efi" 771 | version = "5.2.0" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 774 | 775 | [[package]] 776 | name = "redox_syscall" 777 | version = "0.5.12" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 780 | dependencies = [ 781 | "bitflags 2.9.1", 782 | ] 783 | 784 | [[package]] 785 | name = "rustc-demangle" 786 | version = "0.1.24" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 789 | 790 | [[package]] 791 | name = "rustix" 792 | version = "1.0.7" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 795 | dependencies = [ 796 | "bitflags 2.9.1", 797 | "errno", 798 | "libc", 799 | "linux-raw-sys", 800 | "windows-sys 0.59.0", 801 | ] 802 | 803 | [[package]] 804 | name = "same-file" 805 | version = "1.0.6" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 808 | dependencies = [ 809 | "winapi-util", 810 | ] 811 | 812 | [[package]] 813 | name = "scopeguard" 814 | version = "1.2.0" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 817 | 818 | [[package]] 819 | name = "serde" 820 | version = "1.0.219" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 823 | dependencies = [ 824 | "serde_derive", 825 | ] 826 | 827 | [[package]] 828 | name = "serde_derive" 829 | version = "1.0.219" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 832 | dependencies = [ 833 | "proc-macro2", 834 | "quote", 835 | "syn", 836 | ] 837 | 838 | [[package]] 839 | name = "serde_repr" 840 | version = "0.1.20" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" 843 | dependencies = [ 844 | "proc-macro2", 845 | "quote", 846 | "syn", 847 | ] 848 | 849 | [[package]] 850 | name = "serde_spanned" 851 | version = "0.6.8" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 854 | dependencies = [ 855 | "serde", 856 | ] 857 | 858 | [[package]] 859 | name = "sharded-slab" 860 | version = "0.1.7" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 863 | dependencies = [ 864 | "lazy_static", 865 | ] 866 | 867 | [[package]] 868 | name = "signal-hook-registry" 869 | version = "1.4.5" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 872 | dependencies = [ 873 | "libc", 874 | ] 875 | 876 | [[package]] 877 | name = "slab" 878 | version = "0.4.9" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 881 | dependencies = [ 882 | "autocfg", 883 | ] 884 | 885 | [[package]] 886 | name = "smallvec" 887 | version = "1.15.0" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 890 | 891 | [[package]] 892 | name = "socket2" 893 | version = "0.5.10" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 896 | dependencies = [ 897 | "libc", 898 | "windows-sys 0.52.0", 899 | ] 900 | 901 | [[package]] 902 | name = "stable_deref_trait" 903 | version = "1.2.0" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 906 | 907 | [[package]] 908 | name = "static_assertions" 909 | version = "1.1.0" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 912 | 913 | [[package]] 914 | name = "syn" 915 | version = "2.0.101" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 918 | dependencies = [ 919 | "proc-macro2", 920 | "quote", 921 | "unicode-ident", 922 | ] 923 | 924 | [[package]] 925 | name = "synstructure" 926 | version = "0.13.2" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 929 | dependencies = [ 930 | "proc-macro2", 931 | "quote", 932 | "syn", 933 | ] 934 | 935 | [[package]] 936 | name = "tempfile" 937 | version = "3.20.0" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 940 | dependencies = [ 941 | "fastrand", 942 | "getrandom", 943 | "once_cell", 944 | "rustix", 945 | "windows-sys 0.59.0", 946 | ] 947 | 948 | [[package]] 949 | name = "thread_local" 950 | version = "1.1.8" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 953 | dependencies = [ 954 | "cfg-if", 955 | "once_cell", 956 | ] 957 | 958 | [[package]] 959 | name = "tinystr" 960 | version = "0.8.1" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 963 | dependencies = [ 964 | "displaydoc", 965 | "zerovec", 966 | ] 967 | 968 | [[package]] 969 | name = "tokio" 970 | version = "1.45.1" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" 973 | dependencies = [ 974 | "backtrace", 975 | "bytes", 976 | "libc", 977 | "mio", 978 | "parking_lot", 979 | "pin-project-lite", 980 | "signal-hook-registry", 981 | "socket2", 982 | "tokio-macros", 983 | "tracing", 984 | "windows-sys 0.52.0", 985 | ] 986 | 987 | [[package]] 988 | name = "tokio-macros" 989 | version = "2.5.0" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 992 | dependencies = [ 993 | "proc-macro2", 994 | "quote", 995 | "syn", 996 | ] 997 | 998 | [[package]] 999 | name = "toml" 1000 | version = "0.8.22" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" 1003 | dependencies = [ 1004 | "serde", 1005 | "serde_spanned", 1006 | "toml_datetime", 1007 | "toml_edit", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "toml_datetime" 1012 | version = "0.6.9" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" 1015 | dependencies = [ 1016 | "serde", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "toml_edit" 1021 | version = "0.22.26" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" 1024 | dependencies = [ 1025 | "indexmap", 1026 | "serde", 1027 | "serde_spanned", 1028 | "toml_datetime", 1029 | "toml_write", 1030 | "winnow", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "toml_write" 1035 | version = "0.1.1" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" 1038 | 1039 | [[package]] 1040 | name = "tracing" 1041 | version = "0.1.41" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1044 | dependencies = [ 1045 | "pin-project-lite", 1046 | "tracing-attributes", 1047 | "tracing-core", 1048 | ] 1049 | 1050 | [[package]] 1051 | name = "tracing-attributes" 1052 | version = "0.1.28" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1055 | dependencies = [ 1056 | "proc-macro2", 1057 | "quote", 1058 | "syn", 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "tracing-core" 1063 | version = "0.1.33" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1066 | dependencies = [ 1067 | "once_cell", 1068 | "valuable", 1069 | ] 1070 | 1071 | [[package]] 1072 | name = "tracing-log" 1073 | version = "0.2.0" 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" 1075 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1076 | dependencies = [ 1077 | "log", 1078 | "once_cell", 1079 | "tracing-core", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "tracing-subscriber" 1084 | version = "0.3.19" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 1087 | dependencies = [ 1088 | "nu-ansi-term", 1089 | "sharded-slab", 1090 | "smallvec", 1091 | "thread_local", 1092 | "tracing-core", 1093 | "tracing-log", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "uds_windows" 1098 | version = "1.1.0" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" 1101 | dependencies = [ 1102 | "memoffset", 1103 | "tempfile", 1104 | "winapi", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "unicode-ident" 1109 | version = "1.0.18" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1112 | 1113 | [[package]] 1114 | name = "url" 1115 | version = "2.5.4" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1118 | dependencies = [ 1119 | "form_urlencoded", 1120 | "idna", 1121 | "percent-encoding", 1122 | "serde", 1123 | ] 1124 | 1125 | [[package]] 1126 | name = "utf8_iter" 1127 | version = "1.0.4" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1130 | 1131 | [[package]] 1132 | name = "valuable" 1133 | version = "0.1.1" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1136 | 1137 | [[package]] 1138 | name = "walkdir" 1139 | version = "2.5.0" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1142 | dependencies = [ 1143 | "same-file", 1144 | "winapi-util", 1145 | ] 1146 | 1147 | [[package]] 1148 | name = "wasi" 1149 | version = "0.11.0+wasi-snapshot-preview1" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1152 | 1153 | [[package]] 1154 | name = "wasi" 1155 | version = "0.14.2+wasi-0.2.4" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1158 | dependencies = [ 1159 | "wit-bindgen-rt", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "winapi" 1164 | version = "0.3.9" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1167 | dependencies = [ 1168 | "winapi-i686-pc-windows-gnu", 1169 | "winapi-x86_64-pc-windows-gnu", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "winapi-i686-pc-windows-gnu" 1174 | version = "0.4.0" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1177 | 1178 | [[package]] 1179 | name = "winapi-util" 1180 | version = "0.1.9" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 1183 | dependencies = [ 1184 | "windows-sys 0.59.0", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "winapi-x86_64-pc-windows-gnu" 1189 | version = "0.4.0" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1192 | 1193 | [[package]] 1194 | name = "windows-sys" 1195 | version = "0.52.0" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1198 | dependencies = [ 1199 | "windows-targets", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "windows-sys" 1204 | version = "0.59.0" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1207 | dependencies = [ 1208 | "windows-targets", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "windows-targets" 1213 | version = "0.52.6" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1216 | dependencies = [ 1217 | "windows_aarch64_gnullvm", 1218 | "windows_aarch64_msvc", 1219 | "windows_i686_gnu", 1220 | "windows_i686_gnullvm", 1221 | "windows_i686_msvc", 1222 | "windows_x86_64_gnu", 1223 | "windows_x86_64_gnullvm", 1224 | "windows_x86_64_msvc", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "windows_aarch64_gnullvm" 1229 | version = "0.52.6" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1232 | 1233 | [[package]] 1234 | name = "windows_aarch64_msvc" 1235 | version = "0.52.6" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1238 | 1239 | [[package]] 1240 | name = "windows_i686_gnu" 1241 | version = "0.52.6" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1244 | 1245 | [[package]] 1246 | name = "windows_i686_gnullvm" 1247 | version = "0.52.6" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1250 | 1251 | [[package]] 1252 | name = "windows_i686_msvc" 1253 | version = "0.52.6" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1256 | 1257 | [[package]] 1258 | name = "windows_x86_64_gnu" 1259 | version = "0.52.6" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1262 | 1263 | [[package]] 1264 | name = "windows_x86_64_gnullvm" 1265 | version = "0.52.6" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1268 | 1269 | [[package]] 1270 | name = "windows_x86_64_msvc" 1271 | version = "0.52.6" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1274 | 1275 | [[package]] 1276 | name = "winnow" 1277 | version = "0.7.10" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" 1280 | dependencies = [ 1281 | "memchr", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "wit-bindgen-rt" 1286 | version = "0.39.0" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 1289 | dependencies = [ 1290 | "bitflags 2.9.1", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "writeable" 1295 | version = "0.6.1" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 1298 | 1299 | [[package]] 1300 | name = "xdg-desktop-portal-shana" 1301 | version = "0.3.15" 1302 | dependencies = [ 1303 | "futures", 1304 | "notify", 1305 | "serde", 1306 | "serde_repr", 1307 | "tokio", 1308 | "toml", 1309 | "tracing", 1310 | "tracing-subscriber", 1311 | "url", 1312 | "zbus", 1313 | ] 1314 | 1315 | [[package]] 1316 | name = "yoke" 1317 | version = "0.8.0" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 1320 | dependencies = [ 1321 | "serde", 1322 | "stable_deref_trait", 1323 | "yoke-derive", 1324 | "zerofrom", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "yoke-derive" 1329 | version = "0.8.0" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 1332 | dependencies = [ 1333 | "proc-macro2", 1334 | "quote", 1335 | "syn", 1336 | "synstructure", 1337 | ] 1338 | 1339 | [[package]] 1340 | name = "zbus" 1341 | version = "5.7.1" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" 1344 | dependencies = [ 1345 | "async-broadcast", 1346 | "async-recursion", 1347 | "async-trait", 1348 | "enumflags2", 1349 | "event-listener", 1350 | "futures-core", 1351 | "futures-lite", 1352 | "hex", 1353 | "nix", 1354 | "ordered-stream", 1355 | "serde", 1356 | "serde_repr", 1357 | "tokio", 1358 | "tracing", 1359 | "uds_windows", 1360 | "windows-sys 0.59.0", 1361 | "winnow", 1362 | "zbus_macros", 1363 | "zbus_names", 1364 | "zvariant", 1365 | ] 1366 | 1367 | [[package]] 1368 | name = "zbus_macros" 1369 | version = "5.7.1" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" 1372 | dependencies = [ 1373 | "proc-macro-crate", 1374 | "proc-macro2", 1375 | "quote", 1376 | "syn", 1377 | "zbus_names", 1378 | "zvariant", 1379 | "zvariant_utils", 1380 | ] 1381 | 1382 | [[package]] 1383 | name = "zbus_names" 1384 | version = "4.2.0" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" 1387 | dependencies = [ 1388 | "serde", 1389 | "static_assertions", 1390 | "winnow", 1391 | "zvariant", 1392 | ] 1393 | 1394 | [[package]] 1395 | name = "zerofrom" 1396 | version = "0.1.6" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 1399 | dependencies = [ 1400 | "zerofrom-derive", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "zerofrom-derive" 1405 | version = "0.1.6" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 1408 | dependencies = [ 1409 | "proc-macro2", 1410 | "quote", 1411 | "syn", 1412 | "synstructure", 1413 | ] 1414 | 1415 | [[package]] 1416 | name = "zerotrie" 1417 | version = "0.2.2" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 1420 | dependencies = [ 1421 | "displaydoc", 1422 | "yoke", 1423 | "zerofrom", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "zerovec" 1428 | version = "0.11.2" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 1431 | dependencies = [ 1432 | "yoke", 1433 | "zerofrom", 1434 | "zerovec-derive", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "zerovec-derive" 1439 | version = "0.11.1" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 1442 | dependencies = [ 1443 | "proc-macro2", 1444 | "quote", 1445 | "syn", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "zvariant" 1450 | version = "5.5.3" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" 1453 | dependencies = [ 1454 | "endi", 1455 | "enumflags2", 1456 | "serde", 1457 | "url", 1458 | "winnow", 1459 | "zvariant_derive", 1460 | "zvariant_utils", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "zvariant_derive" 1465 | version = "5.5.3" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" 1468 | dependencies = [ 1469 | "proc-macro-crate", 1470 | "proc-macro2", 1471 | "quote", 1472 | "syn", 1473 | "zvariant_utils", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "zvariant_utils" 1478 | version = "3.2.0" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 1481 | dependencies = [ 1482 | "proc-macro2", 1483 | "quote", 1484 | "serde", 1485 | "static_assertions", 1486 | "syn", 1487 | "winnow", 1488 | ] 1489 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "xdg-desktop-portal-shana" 3 | version = "0.3.15" 4 | edition = "2024" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | zbus = { version = "5", default-features = false, features = ["tokio", "url"] } 10 | tokio = { version = "1.45.1", features = ["full"] } 11 | serde = { version = "1.0", features = ["derive"] } 12 | tracing = "0.1.41" 13 | tracing-subscriber = "0.3.19" 14 | url = { version = "2.5", features = ["serde"] } 15 | serde_repr = "0.1" 16 | toml = "0.8.22" 17 | notify = "8.0.0" 18 | futures = "0.3.31" 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xdg-desktop-portal-shana 2 | 3 | [![Packaging status](https://repology.org/badge/vertical-allrepos/xdg-desktop-portal-shana.svg)](https://repology.org/project/xdg-desktop-portal-shana/versions) 4 | 5 | 6 | ## How it works 7 | it just redirect other portal to it, `the portal of portal`, maybe? 8 | 9 | now it just use 10 | 11 | * Gnome 12 | * Kde 13 | * Gtk 14 | * Lxqt 15 | 16 | ## How to use 17 | 18 | create ~/.config/xdg-desktop-portal-shana/config.toml 19 | 20 | write like this 21 | 22 | ```toml 23 | open_file = "Kde" 24 | save_file = "Gnome" 25 | 26 | [tips] 27 | open_file_when_folder = "Lxqt" 28 | ``` 29 | 30 | The keyword you can use include 31 | 32 | `Gnome` 33 | `Kde` 34 | `Gtk` 35 | `Lxqt` 36 | 37 | or set 38 | 39 | ```toml 40 | open_file = "org.freedesktop.desktop.impl.lxqt" 41 | save_file = "org.freedesktop.desktop.impl.lxqt" 42 | save_files = "Gnome" 43 | ``` 44 | 45 | the key now is allowed to set the service path 46 | 47 | ## Show 48 | 49 | ![select file](./show/choosefile.png) 50 | 51 | ![save file](./show/savefile.png) 52 | 53 | ## How to use it 54 | 55 | to use it, you need to create ~/.config/xdg-desktop-portal/CURRENT_DESKTOP_NAME-portals.conf, for example, if you name is set as sway, you need to create sway.conf 56 | 57 | This will override the config under `/usr/share/xdg-desktop-portal/deskop-portals.conf`, it there is already one. 58 | 59 | ``` 60 | [preferred] 61 | default=luminous 62 | org.freedesktop.impl.portal.Settings=luminous;gtk 63 | org.freedesktop.impl.portal.FileChooser=shana 64 | ``` 65 | -------------------------------------------------------------------------------- /archlinux/PKGBUILD: -------------------------------------------------------------------------------- 1 | pkgname=xdg-desktop-portal-shana 2 | pkgver=0.3.6 3 | pkgrel=1.0 4 | pkgdesc='xdg-desktop-portal-shana' 5 | arch=('x86_64' 'aarch64') 6 | pkgdesc='A filechooser portal backend for any desktop environment' 7 | url='https://github.com/Decodetalkers/xdg-desktop-portal-shana' 8 | install=''$pkgname'.install' 9 | license=('MIT') 10 | depends=('xdg-desktop-portal') 11 | provides=("xdg-desktop-portal-impl") 12 | optdepends=("xdg-desktop-portal-gnome: provide gnome backend" 13 | "xdg-desktop-portal-kde: provide kde backend" 14 | "xdg-desktop-portal-gtk: provide gtk backend" 15 | "xdg-desktop-portal-lxqt: provide lxqt backend") 16 | makedepends=('git' 'ninja' 'meson' 'rust') 17 | source=('source.tar.gz') 18 | sha256sums=('SKIP') 19 | 20 | build() { 21 | meson setup build \ 22 | -Dprefix=/usr \ 23 | -Dlibexecdir=lib \ 24 | -Dbuildtype=release 25 | ninja -C build 26 | } 27 | package() { 28 | DESTDIR="$pkgdir" ninja -C build install 29 | } 30 | -------------------------------------------------------------------------------- /archlinux/xdg-desktop-portal-shana.install: -------------------------------------------------------------------------------- 1 | msg_blue() { 2 | printf "${blue}==>${bold} $1${all_off}\n" 3 | } 4 | 5 | note() { 6 | printf "${blue}==>${yellow} Note:${bold} $1${all_off}\n" 7 | } 8 | 9 | all_off="$(tput sgr0)" 10 | bold="${all_off}$(tput bold)" 11 | blue="${bold}$(tput setaf 4)" 12 | yellow="${bold}$(tput setaf 3)" 13 | post_install() { 14 | note # 15 | msg_blue " create ~/.config/xdg-desktop-portal-shana/config.toml to custom which portal to use." 16 | msg_blue " for more info: https://github.com/Decodetalkers/xdg-desktop-portal-shana" 17 | } 18 | post_upgrade() { 19 | post_install 20 | } 21 | 22 | -------------------------------------------------------------------------------- /meson.build: -------------------------------------------------------------------------------- 1 | project( 2 | 'xdg-desktop-portal-shana', 3 | 'rust', 4 | version: '0.3.15', 5 | meson_version: '>= 1.1.0', 6 | ) 7 | 8 | cargo = find_program('cargo', version: '>= 1.80') 9 | 10 | find_program('rustc', version: '>= 1.80') 11 | 12 | if get_option('debug') 13 | command = [ 14 | cargo, 15 | 'build', 16 | '&&', 17 | 'cp', 18 | meson.global_source_root() / 'target' / 'debug' / meson.project_name(), 19 | '@OUTPUT@', 20 | ] 21 | else 22 | command = [ 23 | cargo, 24 | 'build', 25 | '--release', '&&', 26 | 'cp', 27 | meson.global_source_root() / 'target' / 'release' / meson.project_name(), 28 | '@OUTPUT@', 29 | ] 30 | endif 31 | 32 | prefix = get_option('prefix') 33 | 34 | xdg_install_dir = prefix / get_option('libexecdir') 35 | 36 | portal_dir = prefix / get_option('datadir') / 'xdg-desktop-portal' / 'portals' 37 | 38 | dbus1_dir = prefix / get_option('datadir') / 'dbus-1' / 'services' 39 | 40 | system_dir = prefix / get_option('libdir') / 'systemd' / 'user' 41 | global_conf = configuration_data() 42 | 43 | global_conf.set('xdg_install_dir', xdg_install_dir) 44 | 45 | configure_file( 46 | input: 'misc/xdg-desktop-portal-shana.service.in', 47 | output: 'xdg-desktop-portal-shana.service', 48 | configuration: global_conf, 49 | ) 50 | 51 | configure_file( 52 | input: 'misc/org.freedesktop.impl.portal.desktop.shana.service.in', 53 | output: 'org.freedesktop.impl.portal.desktop.shana.service', 54 | configuration: global_conf, 55 | ) 56 | 57 | custom_target( 58 | 'xdg-desktop-portal-shana', 59 | output: 'xdg-desktop-portal-shana', 60 | build_by_default: true, 61 | install: true, 62 | install_dir: xdg_install_dir, 63 | console: true, 64 | command: command, 65 | ) 66 | 67 | install_data('misc/shana.portal', install_dir: portal_dir) 68 | 69 | install_data( 70 | meson.project_build_root() / 'org.freedesktop.impl.portal.desktop.shana.service', 71 | install_dir: dbus1_dir, 72 | ) 73 | 74 | install_data( 75 | meson.project_build_root() / 'xdg-desktop-portal-shana.service', 76 | install_dir: system_dir, 77 | ) 78 | -------------------------------------------------------------------------------- /misc/config.toml: -------------------------------------------------------------------------------- 1 | open_file = "Kde" 2 | save_file = "Gnome" 3 | 4 | [tips] 5 | open_file_when_folder = "Lxqt" -------------------------------------------------------------------------------- /misc/org.freedesktop.impl.portal.desktop.shana.service.in: -------------------------------------------------------------------------------- 1 | [D-BUS Service] 2 | Name=org.freedesktop.impl.portal.desktop.shana 3 | Exec=@xdg_install_dir@/xdg-desktop-portal-shana 4 | SystemdService=xdg-desktop-portal-shana.service 5 | -------------------------------------------------------------------------------- /misc/shana.portal: -------------------------------------------------------------------------------- 1 | [portal] 2 | DBusName=org.freedesktop.impl.portal.desktop.shana 3 | Interfaces=org.freedesktop.impl.portal.FileChooser; 4 | -------------------------------------------------------------------------------- /misc/test/config1.toml: -------------------------------------------------------------------------------- 1 | open_file = "Kde" 2 | save_file = "Gnome" 3 | 4 | [tips] 5 | open_file_when_folder = "Lxqt" -------------------------------------------------------------------------------- /misc/test/config2.toml: -------------------------------------------------------------------------------- 1 | open_file = "Kde" 2 | save_file = "Gnome" 3 | -------------------------------------------------------------------------------- /misc/xdg-desktop-portal-shana.service.in: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Xdg Desktop Portal for other portal 3 | PartOf=graphical-session.target 4 | After=graphical-session.target 5 | 6 | [Service] 7 | Type=dbus 8 | BusName=org.freedesktop.impl.portal.desktop.shana 9 | ExecStart=@xdg_install_dir@/xdg-desktop-portal-shana 10 | Restart=on-failure 11 | -------------------------------------------------------------------------------- /show/choosefile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Decodetalkers/xdg-desktop-portal-shana/48347b8a90f6dd57086fc86be9f0198695065a6a/show/choosefile.png -------------------------------------------------------------------------------- /show/savefile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Decodetalkers/xdg-desktop-portal-shana/48347b8a90f6dd57086fc86be9f0198695065a6a/show/savefile.png -------------------------------------------------------------------------------- /src/backends.rs: -------------------------------------------------------------------------------- 1 | use zbus::{proxy, zvariant::ObjectPath}; 2 | 3 | #[derive(PartialEq, PartialOrd, Eq, Debug, Clone)] 4 | pub enum PortalSelect { 5 | Kde, 6 | Gnome, 7 | Lxqt, 8 | Gtk, 9 | Other(String), 10 | } 11 | use crate::protaltypes::{OpenFileOptions, SaveFileOptions, SaveFilesOptions, SelectedFiles}; 12 | 13 | #[proxy( 14 | interface = "org.freedesktop.impl.portal.FileChooser", 15 | default_path = "/org/freedesktop/portal/desktop" 16 | )] 17 | pub trait XdgDesktopFilePortal { 18 | fn open_file( 19 | &self, 20 | handle: ObjectPath<'_>, 21 | app_id: String, 22 | parent_window: String, 23 | title: String, 24 | options: OpenFileOptions, 25 | ) -> zbus::Result<(u32, SelectedFiles)>; 26 | fn save_file( 27 | &self, 28 | handle: ObjectPath<'_>, 29 | app_id: String, 30 | parent_window: String, 31 | title: String, 32 | options: SaveFileOptions, 33 | ) -> zbus::Result<(u32, SelectedFiles)>; 34 | fn save_files( 35 | &self, 36 | handle: ObjectPath<'_>, 37 | app_id: String, 38 | parent_window: String, 39 | title: String, 40 | options: SaveFilesOptions, 41 | ) -> zbus::Result<(u32, SelectedFiles)>; 42 | } 43 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use serde::Deserialize; 2 | use std::io::Read; 3 | #[derive(Deserialize, PartialEq, Eq, Debug)] 4 | pub struct Config { 5 | pub open_file: String, 6 | pub save_file: String, 7 | pub save_files: Option, 8 | pub tips: Option, 9 | } 10 | 11 | #[derive(Deserialize, PartialEq, Eq, Debug)] 12 | pub struct Tips { 13 | pub open_file_when_folder: String, 14 | } 15 | 16 | impl Config { 17 | pub fn config_from_file() -> Option { 18 | let Ok(home) = std::env::var("HOME") else { 19 | return None; 20 | }; 21 | let config_path = std::path::Path::new(home.as_str()) 22 | .join(".config") 23 | .join("xdg-desktop-portal-shana") 24 | .join("config.toml"); 25 | let Ok(mut file) = std::fs::OpenOptions::new().read(true).open(config_path) else { 26 | return None; 27 | }; 28 | let mut buf = String::new(); 29 | if file.read_to_string(&mut buf).is_err() { 30 | return None; 31 | }; 32 | toml::from_str(&buf).unwrap_or(None) 33 | } 34 | } 35 | 36 | impl From for super::PortalSelect { 37 | fn from(value: String) -> Self { 38 | match value.as_str() { 39 | "Gnome" => Self::Gnome, 40 | "Kde" => Self::Kde, 41 | "Lxqt" => Self::Lxqt, 42 | "Gtk" => Self::Gtk, 43 | value => Self::Other(value.to_string()), 44 | } 45 | } 46 | } 47 | 48 | impl From> for super::ProtalConfig { 49 | fn from(value: Option) -> Self { 50 | match value { 51 | None => crate::ProtalConfig { 52 | savefile: crate::PortalSelect::Gtk, 53 | openfile: crate::PortalSelect::Gtk, 54 | savefiles: crate::PortalSelect::Gtk, 55 | openfile_casefolder: crate::PortalSelect::Gtk, 56 | }, 57 | Some(value) => crate::ProtalConfig { 58 | savefile: value.save_file.into(), 59 | openfile: value.open_file.clone().into(), 60 | savefiles: value.save_files.unwrap_or("Gtk".to_string()).into(), 61 | openfile_casefolder: match value.tips { 62 | None => value.open_file.into(), 63 | Some(v) => v.open_file_when_folder.into(), 64 | }, 65 | }, 66 | } 67 | } 68 | } 69 | 70 | #[test] 71 | fn tst_toml() { 72 | let config_src1 = include_str!("../misc/test/config1.toml"); 73 | let config1: super::ProtalConfig = Some(toml::from_str(config_src1).unwrap()).into(); 74 | assert_eq!( 75 | config1, 76 | super::ProtalConfig { 77 | openfile: crate::PortalSelect::Kde, 78 | savefile: crate::PortalSelect::Gnome, 79 | savefiles: crate::PortalSelect::Gtk, 80 | openfile_casefolder: crate::PortalSelect::Lxqt, 81 | } 82 | ); 83 | let config_src2 = include_str!("../misc/test/config2.toml"); 84 | let config2: super::ProtalConfig = Some(toml::from_str(config_src2).unwrap()).into(); 85 | assert_eq!( 86 | config2, 87 | super::ProtalConfig { 88 | openfile: crate::PortalSelect::Kde, 89 | savefile: crate::PortalSelect::Gnome, 90 | savefiles: crate::PortalSelect::Gtk, 91 | openfile_casefolder: crate::PortalSelect::Kde, 92 | } 93 | ); 94 | } 95 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod backends; 2 | mod config; 3 | mod protaltypes; 4 | use backends::*; 5 | use config::Config; 6 | use notify::EventKind; 7 | use protaltypes::{OpenFileOptions, SaveFileOptions, SaveFilesOptions, SelectedFiles}; 8 | use std::{error::Error, future::pending, sync::Arc}; 9 | use tokio::sync::Mutex; 10 | use zbus::{connection, fdo, interface, zvariant::ObjectPath}; 11 | 12 | use std::sync::OnceLock; 13 | 14 | use std::sync::LazyLock; 15 | 16 | use futures::{ 17 | SinkExt, StreamExt, 18 | channel::mpsc::{Receiver, channel}, 19 | }; 20 | use notify::{Event, RecommendedWatcher, RecursiveMode, Watcher}; 21 | use std::path::Path; 22 | 23 | static SETTING_CONFIG: LazyLock>> = 24 | LazyLock::new(|| Arc::new(Mutex::new(ProtalConfig::from(Config::config_from_file())))); 25 | 26 | async fn get_setting_config() -> ProtalConfig { 27 | let config = SETTING_CONFIG.lock().await; 28 | config.clone() 29 | } 30 | 31 | async fn update_setting_config() { 32 | let mut config = SETTING_CONFIG.lock().await; 33 | *config = ProtalConfig::from(Config::config_from_file()); 34 | } 35 | 36 | static SESSION: OnceLock = OnceLock::new(); 37 | 38 | async fn get_connection() -> zbus::Result { 39 | if let Some(cnx) = SESSION.get() { 40 | Ok(cnx.clone()) 41 | } else { 42 | let cnx = zbus::Connection::session().await?; 43 | SESSION.set(cnx.clone()).expect("Can't reset a OnceCell"); 44 | Ok(cnx) 45 | } 46 | } 47 | 48 | struct Shana; 49 | 50 | #[derive(PartialEq, Debug, Eq, Clone)] 51 | struct ProtalConfig { 52 | savefile: PortalSelect, 53 | openfile: PortalSelect, 54 | savefiles: PortalSelect, 55 | openfile_casefolder: PortalSelect, 56 | } 57 | 58 | impl PortalSelect { 59 | fn service_path(&self) -> &str { 60 | match self { 61 | PortalSelect::Kde => "org.freedesktop.impl.portal.desktop.kde", 62 | PortalSelect::Gnome => "org.gnome.Nautilus", 63 | PortalSelect::Lxqt => "org.freedesktop.impl.portal.desktop.lxqt", 64 | PortalSelect::Gtk => "org.freedesktop.impl.portal.desktop.gtk", 65 | PortalSelect::Other(path) => path, 66 | } 67 | } 68 | } 69 | 70 | #[interface(name = "org.freedesktop.impl.portal.FileChooser")] 71 | impl Shana { 72 | async fn open_file( 73 | &mut self, 74 | handle: ObjectPath<'_>, 75 | app_id: String, 76 | parent_window: String, 77 | title: String, 78 | options: OpenFileOptions, 79 | ) -> fdo::Result<(u32, SelectedFiles)> { 80 | let connection = get_connection().await?; 81 | let backendconfig = get_setting_config().await; 82 | let portal_select = if let Some(true) = options.directory { 83 | backendconfig.openfile_casefolder 84 | } else { 85 | backendconfig.openfile 86 | }; 87 | let portal = XdgDesktopFilePortalProxy::builder(&connection) 88 | .destination(portal_select.service_path())? 89 | .build() 90 | .await?; 91 | 92 | let output = portal 93 | .open_file(handle, app_id, parent_window, title, options) 94 | .await?; 95 | 96 | Ok(output) 97 | } 98 | 99 | async fn save_file( 100 | &mut self, 101 | handle: ObjectPath<'_>, 102 | app_id: String, 103 | parent_window: String, 104 | title: String, 105 | options: SaveFileOptions, 106 | ) -> fdo::Result<(u32, SelectedFiles)> { 107 | let connection = get_connection().await?; 108 | let backendconfig = get_setting_config().await; 109 | let portal = XdgDesktopFilePortalProxy::builder(&connection) 110 | .destination(backendconfig.savefile.service_path())? 111 | .build() 112 | .await?; 113 | 114 | let output = portal 115 | .save_file(handle, app_id, parent_window, title, options) 116 | .await?; 117 | Ok(output) 118 | } 119 | 120 | async fn save_files( 121 | &mut self, 122 | handle: ObjectPath<'_>, 123 | app_id: String, 124 | parent_window: String, 125 | title: String, 126 | options: SaveFilesOptions, 127 | ) -> fdo::Result<(u32, SelectedFiles)> { 128 | let connection = get_connection().await?; 129 | let backendconfig = get_setting_config().await; 130 | // INFO: only gtk have savefiles, so if not use gnome or gtk, all fallback to gtk 131 | let portal = XdgDesktopFilePortalProxy::builder(&connection) 132 | .destination(backendconfig.savefiles.service_path())? 133 | .build() 134 | .await?; 135 | let output = portal 136 | .save_files(handle, app_id, parent_window, title, options) 137 | .await?; 138 | Ok(output) 139 | } 140 | } 141 | 142 | fn async_watcher() -> notify::Result<(RecommendedWatcher, Receiver>)> { 143 | let (mut tx, rx) = channel(1); 144 | 145 | // Automatically select the best implementation for your platform. 146 | // You can also access each implementation directly e.g. INotifyWatcher. 147 | let watcher = RecommendedWatcher::new( 148 | move |res| { 149 | futures::executor::block_on(async { 150 | tx.send(res).await.unwrap(); 151 | }) 152 | }, 153 | notify::Config::default(), 154 | )?; 155 | 156 | Ok((watcher, rx)) 157 | } 158 | 159 | async fn async_watch>(path: P) -> notify::Result<()> { 160 | let (mut watcher, mut rx) = async_watcher()?; 161 | 162 | // Add a path to be watched. All files and directories at that path and 163 | // below will be monitored for changes. 164 | watcher.watch(path.as_ref(), RecursiveMode::Recursive)?; 165 | 166 | while let Some(res) = rx.next().await { 167 | match res { 168 | Ok(Event { 169 | kind: EventKind::Modify(_), 170 | .. 171 | }) 172 | | Ok(Event { 173 | kind: EventKind::Create(_), 174 | .. 175 | }) => { 176 | update_setting_config().await; 177 | } 178 | Err(e) => println!("watch error: {:?}", e), 179 | _ => {} 180 | } 181 | } 182 | 183 | Ok(()) 184 | } 185 | 186 | #[tokio::main] 187 | async fn main() -> Result<(), Box> { 188 | unsafe { std::env::set_var("RUST_LOG", "xdg-desktop-protal-shana=info") }; 189 | tracing_subscriber::fmt().init(); 190 | tracing::info!("Shana Start"); 191 | let _conn = connection::Builder::session()? 192 | .name("org.freedesktop.impl.portal.desktop.shana")? 193 | .serve_at("/org/freedesktop/portal/desktop", Shana)? 194 | .build() 195 | .await?; 196 | tokio::spawn(async move { 197 | let Ok(home) = std::env::var("HOME") else { 198 | return; 199 | }; 200 | let config_path = std::path::Path::new(home.as_str()) 201 | .join(".config") 202 | .join("xdg-desktop-portal-shana"); 203 | if let Err(e) = async_watch(config_path).await { 204 | tracing::info!("Maybe config file is not exist, create one :{e}"); 205 | } 206 | }); 207 | 208 | pending::<()>().await; 209 | Ok(()) 210 | } 211 | -------------------------------------------------------------------------------- /src/protaltypes.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | ffi::{CString, OsStr}, 3 | os::unix::ffi::OsStrExt, 4 | path::Path, 5 | }; 6 | 7 | use serde::{Deserialize, Serialize}; 8 | use serde_repr::Serialize_repr; 9 | use zbus::zvariant::{DeserializeDict, SerializeDict, Type}; 10 | 11 | /// A file name represented as a nul-terminated byte array. 12 | #[derive(Type, Debug, Default, PartialEq)] 13 | #[zvariant(signature = "ay")] 14 | pub struct FilePath(CString); 15 | 16 | impl AsRef for FilePath { 17 | fn as_ref(&self) -> &Path { 18 | OsStr::from_bytes(self.0.as_bytes()).as_ref() 19 | } 20 | } 21 | 22 | impl Serialize for FilePath { 23 | fn serialize(&self, serializer: S) -> Result 24 | where 25 | S: serde::Serializer, 26 | { 27 | serializer.serialize_bytes(self.0.as_bytes_with_nul()) 28 | } 29 | } 30 | 31 | impl<'de> Deserialize<'de> for FilePath { 32 | fn deserialize(deserializer: D) -> Result 33 | where 34 | D: serde::Deserializer<'de>, 35 | { 36 | let bytes = >::deserialize(deserializer)?; 37 | let c_string = CString::from_vec_with_nul(bytes) 38 | .map_err(|_| serde::de::Error::custom("Bytes are not nul-terminated"))?; 39 | 40 | Ok(Self(c_string)) 41 | } 42 | } 43 | 44 | // SelectedFiles 45 | #[derive(SerializeDict, DeserializeDict, Type, Debug, Default)] 46 | #[zvariant(signature = "dict")] 47 | pub struct SelectedFiles { 48 | pub uris: Vec, 49 | pub choices: Option>, 50 | pub current_filter: Option, 51 | // Only relevant for OpenFile 52 | pub writable: Option, 53 | } 54 | 55 | #[allow(dead_code)] 56 | impl SelectedFiles { 57 | pub fn from_path(path: Vec>) -> Self { 58 | Self { 59 | uris: path 60 | .iter() 61 | .map(url::Url::from_file_path) 62 | .filter_map(|urlunit| urlunit.ok()) 63 | .collect(), 64 | choices: None, 65 | current_filter: None, 66 | writable: None, 67 | } 68 | } 69 | } 70 | #[derive(Clone, Serialize, Deserialize, Type, Debug)] 71 | /// Presents the user with a choice to select from or as a checkbox. 72 | pub struct Choice(String, String, Vec<(String, String)>, String); 73 | 74 | #[derive(Clone, Serialize_repr, Deserialize, Debug, Type)] 75 | #[repr(u32)] 76 | pub enum FilterType { 77 | GlobPattern = 0, 78 | MimeType = 1, 79 | } 80 | 81 | #[derive(Clone, Serialize, Deserialize, Type, Debug)] 82 | pub struct FileFilter(String, Vec<(FilterType, String)>); 83 | 84 | #[allow(dead_code)] 85 | impl FileFilter { 86 | pub fn get_filters(&self) -> Vec<(FilterType, String)> { 87 | self.1.clone() 88 | } 89 | pub fn get_name(&self) -> String { 90 | self.0.clone() 91 | } 92 | } 93 | 94 | // filters contains all filters can only can select one at one time 95 | #[derive(SerializeDict, DeserializeDict, Type, Debug)] 96 | #[zvariant(signature = "dict")] 97 | pub struct OpenFileOptions { 98 | accept_label: Option, 99 | modal: Option, 100 | multiple: Option, 101 | pub directory: Option, 102 | filters: Option>, 103 | current_filter: Option, 104 | choices: Option>, 105 | current_folder: Option, 106 | } 107 | 108 | #[allow(dead_code)] 109 | impl OpenFileOptions { 110 | pub fn select_function(&self) -> SelectFunction { 111 | if let Some(true) = self.directory { 112 | SelectFunction::Folder { 113 | title: self.accept_label.clone().unwrap_or("OpenFold".to_string()), 114 | filters: self.filters.as_ref().unwrap_or(&vec![]).clone(), 115 | current_filter: self.current_filter.clone(), 116 | } 117 | } else { 118 | SelectFunction::File { 119 | title: self.accept_label.clone().unwrap_or("OpenFile".to_string()), 120 | filters: (self.filters.as_ref().unwrap_or(&vec![])).clone(), 121 | current_filter: self.current_filter.clone(), 122 | } 123 | } 124 | } 125 | } 126 | 127 | #[allow(dead_code)] 128 | pub enum SelectFunction { 129 | File { 130 | title: String, 131 | filters: Vec, 132 | current_filter: Option, 133 | }, 134 | Folder { 135 | title: String, 136 | filters: Vec, 137 | current_filter: Option, 138 | }, 139 | } 140 | 141 | // filters contains all filters can only can select one at one time 142 | #[derive(SerializeDict, DeserializeDict, Type, Debug)] 143 | #[zvariant(signature = "dict")] 144 | pub struct SaveFileOptions { 145 | accept_label: Option, 146 | modal: Option, 147 | multiple: Option, 148 | filters: Option>, 149 | current_filter: Option, 150 | choices: Option>, 151 | current_name: Option, 152 | current_folder: Option, 153 | current_file: Option, 154 | } 155 | 156 | #[derive(DeserializeDict, SerializeDict, Type, Debug)] 157 | #[zvariant(signature = "dict")] 158 | pub struct SaveFilesOptions { 159 | accept_label: Option, 160 | modal: Option, 161 | choices: Option>, 162 | current_folder: Option, 163 | files: Option>, 164 | } 165 | -------------------------------------------------------------------------------- /tools/shanatest/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /tools/shanatest/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "0.7.20" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "ashpd" 16 | version = "0.4.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "31688b40eb5d739049f721d8405c33d3796b3f51f2bea84421a542dafe397e41" 19 | dependencies = [ 20 | "async-std", 21 | "enumflags2", 22 | "futures-channel", 23 | "futures-util", 24 | "once_cell", 25 | "rand", 26 | "serde", 27 | "serde_repr", 28 | "url", 29 | "zbus", 30 | ] 31 | 32 | [[package]] 33 | name = "async-attributes" 34 | version = "1.1.2" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" 37 | dependencies = [ 38 | "quote", 39 | "syn 1.0.109", 40 | ] 41 | 42 | [[package]] 43 | name = "async-broadcast" 44 | version = "0.5.1" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" 47 | dependencies = [ 48 | "event-listener", 49 | "futures-core", 50 | ] 51 | 52 | [[package]] 53 | name = "async-channel" 54 | version = "1.8.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" 57 | dependencies = [ 58 | "concurrent-queue", 59 | "event-listener", 60 | "futures-core", 61 | ] 62 | 63 | [[package]] 64 | name = "async-executor" 65 | version = "1.5.1" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" 68 | dependencies = [ 69 | "async-lock", 70 | "async-task", 71 | "concurrent-queue", 72 | "fastrand", 73 | "futures-lite", 74 | "slab", 75 | ] 76 | 77 | [[package]] 78 | name = "async-fs" 79 | version = "1.6.0" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" 82 | dependencies = [ 83 | "async-lock", 84 | "autocfg", 85 | "blocking", 86 | "futures-lite", 87 | ] 88 | 89 | [[package]] 90 | name = "async-global-executor" 91 | version = "2.3.1" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" 94 | dependencies = [ 95 | "async-channel", 96 | "async-executor", 97 | "async-io", 98 | "async-lock", 99 | "blocking", 100 | "futures-lite", 101 | "once_cell", 102 | ] 103 | 104 | [[package]] 105 | name = "async-io" 106 | version = "1.13.0" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" 109 | dependencies = [ 110 | "async-lock", 111 | "autocfg", 112 | "cfg-if", 113 | "concurrent-queue", 114 | "futures-lite", 115 | "log", 116 | "parking", 117 | "polling", 118 | "rustix", 119 | "slab", 120 | "socket2", 121 | "waker-fn", 122 | ] 123 | 124 | [[package]] 125 | name = "async-lock" 126 | version = "2.7.0" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" 129 | dependencies = [ 130 | "event-listener", 131 | ] 132 | 133 | [[package]] 134 | name = "async-recursion" 135 | version = "1.0.4" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" 138 | dependencies = [ 139 | "proc-macro2", 140 | "quote", 141 | "syn 2.0.13", 142 | ] 143 | 144 | [[package]] 145 | name = "async-std" 146 | version = "1.12.0" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" 149 | dependencies = [ 150 | "async-attributes", 151 | "async-channel", 152 | "async-global-executor", 153 | "async-io", 154 | "async-lock", 155 | "crossbeam-utils", 156 | "futures-channel", 157 | "futures-core", 158 | "futures-io", 159 | "futures-lite", 160 | "gloo-timers", 161 | "kv-log-macro", 162 | "log", 163 | "memchr", 164 | "once_cell", 165 | "pin-project-lite", 166 | "pin-utils", 167 | "slab", 168 | "wasm-bindgen-futures", 169 | ] 170 | 171 | [[package]] 172 | name = "async-task" 173 | version = "4.4.0" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" 176 | 177 | [[package]] 178 | name = "async-trait" 179 | version = "0.1.68" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" 182 | dependencies = [ 183 | "proc-macro2", 184 | "quote", 185 | "syn 2.0.13", 186 | ] 187 | 188 | [[package]] 189 | name = "atomic-waker" 190 | version = "1.1.1" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" 193 | 194 | [[package]] 195 | name = "autocfg" 196 | version = "1.1.0" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 199 | 200 | [[package]] 201 | name = "bitflags" 202 | version = "1.3.2" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 205 | 206 | [[package]] 207 | name = "block-buffer" 208 | version = "0.10.4" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 211 | dependencies = [ 212 | "generic-array", 213 | ] 214 | 215 | [[package]] 216 | name = "blocking" 217 | version = "1.3.1" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" 220 | dependencies = [ 221 | "async-channel", 222 | "async-lock", 223 | "async-task", 224 | "atomic-waker", 225 | "fastrand", 226 | "futures-lite", 227 | "log", 228 | ] 229 | 230 | [[package]] 231 | name = "bumpalo" 232 | version = "3.12.0" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 235 | 236 | [[package]] 237 | name = "byteorder" 238 | version = "1.4.3" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 241 | 242 | [[package]] 243 | name = "cc" 244 | version = "1.0.79" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 247 | 248 | [[package]] 249 | name = "cfg-if" 250 | version = "1.0.0" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 253 | 254 | [[package]] 255 | name = "concurrent-queue" 256 | version = "2.2.0" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" 259 | dependencies = [ 260 | "crossbeam-utils", 261 | ] 262 | 263 | [[package]] 264 | name = "cpufeatures" 265 | version = "0.2.6" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" 268 | dependencies = [ 269 | "libc", 270 | ] 271 | 272 | [[package]] 273 | name = "crossbeam-utils" 274 | version = "0.8.15" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" 277 | dependencies = [ 278 | "cfg-if", 279 | ] 280 | 281 | [[package]] 282 | name = "crypto-common" 283 | version = "0.1.6" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 286 | dependencies = [ 287 | "generic-array", 288 | "typenum", 289 | ] 290 | 291 | [[package]] 292 | name = "ctor" 293 | version = "0.1.26" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" 296 | dependencies = [ 297 | "quote", 298 | "syn 1.0.109", 299 | ] 300 | 301 | [[package]] 302 | name = "derivative" 303 | version = "2.2.0" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 306 | dependencies = [ 307 | "proc-macro2", 308 | "quote", 309 | "syn 1.0.109", 310 | ] 311 | 312 | [[package]] 313 | name = "digest" 314 | version = "0.10.6" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 317 | dependencies = [ 318 | "block-buffer", 319 | "crypto-common", 320 | ] 321 | 322 | [[package]] 323 | name = "dirs" 324 | version = "4.0.0" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 327 | dependencies = [ 328 | "dirs-sys", 329 | ] 330 | 331 | [[package]] 332 | name = "dirs-sys" 333 | version = "0.3.7" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 336 | dependencies = [ 337 | "libc", 338 | "redox_users", 339 | "winapi", 340 | ] 341 | 342 | [[package]] 343 | name = "enumflags2" 344 | version = "0.7.6" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "0044ebdf7fbb2a772e0c0233a9d3173c5cd8af8ae7078d4c5188af44ffffaa4b" 347 | dependencies = [ 348 | "enumflags2_derive", 349 | "serde", 350 | ] 351 | 352 | [[package]] 353 | name = "enumflags2_derive" 354 | version = "0.7.6" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "9d2c772ccdbdfd1967b4f5d79d17c98ebf92009fdcc838db7aa434462f600c26" 357 | dependencies = [ 358 | "proc-macro2", 359 | "quote", 360 | "syn 2.0.13", 361 | ] 362 | 363 | [[package]] 364 | name = "errno" 365 | version = "0.3.1" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" 368 | dependencies = [ 369 | "errno-dragonfly", 370 | "libc", 371 | "windows-sys 0.48.0", 372 | ] 373 | 374 | [[package]] 375 | name = "errno-dragonfly" 376 | version = "0.1.2" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 379 | dependencies = [ 380 | "cc", 381 | "libc", 382 | ] 383 | 384 | [[package]] 385 | name = "event-listener" 386 | version = "2.5.3" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 389 | 390 | [[package]] 391 | name = "fastrand" 392 | version = "1.9.0" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 395 | dependencies = [ 396 | "instant", 397 | ] 398 | 399 | [[package]] 400 | name = "form_urlencoded" 401 | version = "1.1.0" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 404 | dependencies = [ 405 | "percent-encoding", 406 | ] 407 | 408 | [[package]] 409 | name = "futures-channel" 410 | version = "0.3.28" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" 413 | dependencies = [ 414 | "futures-core", 415 | ] 416 | 417 | [[package]] 418 | name = "futures-core" 419 | version = "0.3.28" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" 422 | 423 | [[package]] 424 | name = "futures-io" 425 | version = "0.3.28" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" 428 | 429 | [[package]] 430 | name = "futures-lite" 431 | version = "1.13.0" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" 434 | dependencies = [ 435 | "fastrand", 436 | "futures-core", 437 | "futures-io", 438 | "memchr", 439 | "parking", 440 | "pin-project-lite", 441 | "waker-fn", 442 | ] 443 | 444 | [[package]] 445 | name = "futures-macro" 446 | version = "0.3.28" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" 449 | dependencies = [ 450 | "proc-macro2", 451 | "quote", 452 | "syn 2.0.13", 453 | ] 454 | 455 | [[package]] 456 | name = "futures-sink" 457 | version = "0.3.28" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" 460 | 461 | [[package]] 462 | name = "futures-task" 463 | version = "0.3.28" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" 466 | 467 | [[package]] 468 | name = "futures-util" 469 | version = "0.3.28" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" 472 | dependencies = [ 473 | "futures-core", 474 | "futures-io", 475 | "futures-macro", 476 | "futures-sink", 477 | "futures-task", 478 | "memchr", 479 | "pin-project-lite", 480 | "pin-utils", 481 | "slab", 482 | ] 483 | 484 | [[package]] 485 | name = "generic-array" 486 | version = "0.14.7" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 489 | dependencies = [ 490 | "typenum", 491 | "version_check", 492 | ] 493 | 494 | [[package]] 495 | name = "getrandom" 496 | version = "0.2.9" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" 499 | dependencies = [ 500 | "cfg-if", 501 | "libc", 502 | "wasi", 503 | ] 504 | 505 | [[package]] 506 | name = "gloo-timers" 507 | version = "0.2.6" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" 510 | dependencies = [ 511 | "futures-channel", 512 | "futures-core", 513 | "js-sys", 514 | "wasm-bindgen", 515 | ] 516 | 517 | [[package]] 518 | name = "hashbrown" 519 | version = "0.12.3" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 522 | 523 | [[package]] 524 | name = "hermit-abi" 525 | version = "0.3.1" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" 528 | 529 | [[package]] 530 | name = "hex" 531 | version = "0.4.3" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 534 | 535 | [[package]] 536 | name = "idna" 537 | version = "0.3.0" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 540 | dependencies = [ 541 | "unicode-bidi", 542 | "unicode-normalization", 543 | ] 544 | 545 | [[package]] 546 | name = "indexmap" 547 | version = "1.9.3" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 550 | dependencies = [ 551 | "autocfg", 552 | "hashbrown", 553 | ] 554 | 555 | [[package]] 556 | name = "instant" 557 | version = "0.1.12" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 560 | dependencies = [ 561 | "cfg-if", 562 | ] 563 | 564 | [[package]] 565 | name = "io-lifetimes" 566 | version = "1.0.10" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" 569 | dependencies = [ 570 | "hermit-abi", 571 | "libc", 572 | "windows-sys 0.48.0", 573 | ] 574 | 575 | [[package]] 576 | name = "js-sys" 577 | version = "0.3.61" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" 580 | dependencies = [ 581 | "wasm-bindgen", 582 | ] 583 | 584 | [[package]] 585 | name = "kv-log-macro" 586 | version = "1.0.7" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" 589 | dependencies = [ 590 | "log", 591 | ] 592 | 593 | [[package]] 594 | name = "libc" 595 | version = "0.2.141" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" 598 | 599 | [[package]] 600 | name = "linux-raw-sys" 601 | version = "0.3.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" 604 | 605 | [[package]] 606 | name = "log" 607 | version = "0.4.17" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 610 | dependencies = [ 611 | "cfg-if", 612 | "value-bag", 613 | ] 614 | 615 | [[package]] 616 | name = "memchr" 617 | version = "2.5.0" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 620 | 621 | [[package]] 622 | name = "memoffset" 623 | version = "0.7.1" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" 626 | dependencies = [ 627 | "autocfg", 628 | ] 629 | 630 | [[package]] 631 | name = "nix" 632 | version = "0.26.2" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" 635 | dependencies = [ 636 | "bitflags", 637 | "cfg-if", 638 | "libc", 639 | "memoffset", 640 | "pin-utils", 641 | "static_assertions", 642 | ] 643 | 644 | [[package]] 645 | name = "once_cell" 646 | version = "1.17.1" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 649 | 650 | [[package]] 651 | name = "ordered-stream" 652 | version = "0.2.0" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 655 | dependencies = [ 656 | "futures-core", 657 | "pin-project-lite", 658 | ] 659 | 660 | [[package]] 661 | name = "parking" 662 | version = "2.1.0" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" 665 | 666 | [[package]] 667 | name = "percent-encoding" 668 | version = "2.2.0" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 671 | 672 | [[package]] 673 | name = "pin-project-lite" 674 | version = "0.2.9" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 677 | 678 | [[package]] 679 | name = "pin-utils" 680 | version = "0.1.0" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 683 | 684 | [[package]] 685 | name = "polling" 686 | version = "2.7.0" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "4be1c66a6add46bff50935c313dae30a5030cf8385c5206e8a95e9e9def974aa" 689 | dependencies = [ 690 | "autocfg", 691 | "bitflags", 692 | "cfg-if", 693 | "concurrent-queue", 694 | "libc", 695 | "log", 696 | "pin-project-lite", 697 | "windows-sys 0.48.0", 698 | ] 699 | 700 | [[package]] 701 | name = "ppv-lite86" 702 | version = "0.2.17" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 705 | 706 | [[package]] 707 | name = "proc-macro-crate" 708 | version = "1.3.1" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 711 | dependencies = [ 712 | "once_cell", 713 | "toml_edit", 714 | ] 715 | 716 | [[package]] 717 | name = "proc-macro2" 718 | version = "1.0.56" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" 721 | dependencies = [ 722 | "unicode-ident", 723 | ] 724 | 725 | [[package]] 726 | name = "quote" 727 | version = "1.0.26" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" 730 | dependencies = [ 731 | "proc-macro2", 732 | ] 733 | 734 | [[package]] 735 | name = "rand" 736 | version = "0.8.5" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 739 | dependencies = [ 740 | "libc", 741 | "rand_chacha", 742 | "rand_core", 743 | ] 744 | 745 | [[package]] 746 | name = "rand_chacha" 747 | version = "0.3.1" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 750 | dependencies = [ 751 | "ppv-lite86", 752 | "rand_core", 753 | ] 754 | 755 | [[package]] 756 | name = "rand_core" 757 | version = "0.6.4" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 760 | dependencies = [ 761 | "getrandom", 762 | ] 763 | 764 | [[package]] 765 | name = "redox_syscall" 766 | version = "0.2.16" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 769 | dependencies = [ 770 | "bitflags", 771 | ] 772 | 773 | [[package]] 774 | name = "redox_syscall" 775 | version = "0.3.5" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 778 | dependencies = [ 779 | "bitflags", 780 | ] 781 | 782 | [[package]] 783 | name = "redox_users" 784 | version = "0.4.3" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 787 | dependencies = [ 788 | "getrandom", 789 | "redox_syscall 0.2.16", 790 | "thiserror", 791 | ] 792 | 793 | [[package]] 794 | name = "regex" 795 | version = "1.7.3" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" 798 | dependencies = [ 799 | "aho-corasick", 800 | "memchr", 801 | "regex-syntax", 802 | ] 803 | 804 | [[package]] 805 | name = "regex-syntax" 806 | version = "0.6.29" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 809 | 810 | [[package]] 811 | name = "rustix" 812 | version = "0.37.11" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" 815 | dependencies = [ 816 | "bitflags", 817 | "errno", 818 | "io-lifetimes", 819 | "libc", 820 | "linux-raw-sys", 821 | "windows-sys 0.48.0", 822 | ] 823 | 824 | [[package]] 825 | name = "serde" 826 | version = "1.0.159" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" 829 | dependencies = [ 830 | "serde_derive", 831 | ] 832 | 833 | [[package]] 834 | name = "serde_derive" 835 | version = "1.0.159" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" 838 | dependencies = [ 839 | "proc-macro2", 840 | "quote", 841 | "syn 2.0.13", 842 | ] 843 | 844 | [[package]] 845 | name = "serde_repr" 846 | version = "0.1.12" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" 849 | dependencies = [ 850 | "proc-macro2", 851 | "quote", 852 | "syn 2.0.13", 853 | ] 854 | 855 | [[package]] 856 | name = "sha1" 857 | version = "0.10.5" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 860 | dependencies = [ 861 | "cfg-if", 862 | "cpufeatures", 863 | "digest", 864 | ] 865 | 866 | [[package]] 867 | name = "shanatest" 868 | version = "0.1.0" 869 | dependencies = [ 870 | "ashpd", 871 | "async-std", 872 | ] 873 | 874 | [[package]] 875 | name = "slab" 876 | version = "0.4.8" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" 879 | dependencies = [ 880 | "autocfg", 881 | ] 882 | 883 | [[package]] 884 | name = "socket2" 885 | version = "0.4.9" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 888 | dependencies = [ 889 | "libc", 890 | "winapi", 891 | ] 892 | 893 | [[package]] 894 | name = "static_assertions" 895 | version = "1.1.0" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 898 | 899 | [[package]] 900 | name = "syn" 901 | version = "1.0.109" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 904 | dependencies = [ 905 | "proc-macro2", 906 | "quote", 907 | "unicode-ident", 908 | ] 909 | 910 | [[package]] 911 | name = "syn" 912 | version = "2.0.13" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" 915 | dependencies = [ 916 | "proc-macro2", 917 | "quote", 918 | "unicode-ident", 919 | ] 920 | 921 | [[package]] 922 | name = "tempfile" 923 | version = "3.5.0" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" 926 | dependencies = [ 927 | "cfg-if", 928 | "fastrand", 929 | "redox_syscall 0.3.5", 930 | "rustix", 931 | "windows-sys 0.45.0", 932 | ] 933 | 934 | [[package]] 935 | name = "thiserror" 936 | version = "1.0.40" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" 939 | dependencies = [ 940 | "thiserror-impl", 941 | ] 942 | 943 | [[package]] 944 | name = "thiserror-impl" 945 | version = "1.0.40" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" 948 | dependencies = [ 949 | "proc-macro2", 950 | "quote", 951 | "syn 2.0.13", 952 | ] 953 | 954 | [[package]] 955 | name = "tinyvec" 956 | version = "1.6.0" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 959 | dependencies = [ 960 | "tinyvec_macros", 961 | ] 962 | 963 | [[package]] 964 | name = "tinyvec_macros" 965 | version = "0.1.1" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 968 | 969 | [[package]] 970 | name = "toml_datetime" 971 | version = "0.6.1" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" 974 | 975 | [[package]] 976 | name = "toml_edit" 977 | version = "0.19.8" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" 980 | dependencies = [ 981 | "indexmap", 982 | "toml_datetime", 983 | "winnow", 984 | ] 985 | 986 | [[package]] 987 | name = "tracing" 988 | version = "0.1.37" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 991 | dependencies = [ 992 | "cfg-if", 993 | "pin-project-lite", 994 | "tracing-attributes", 995 | "tracing-core", 996 | ] 997 | 998 | [[package]] 999 | name = "tracing-attributes" 1000 | version = "0.1.23" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 1003 | dependencies = [ 1004 | "proc-macro2", 1005 | "quote", 1006 | "syn 1.0.109", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "tracing-core" 1011 | version = "0.1.30" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1014 | dependencies = [ 1015 | "once_cell", 1016 | ] 1017 | 1018 | [[package]] 1019 | name = "typenum" 1020 | version = "1.16.0" 1021 | source = "registry+https://github.com/rust-lang/crates.io-index" 1022 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 1023 | 1024 | [[package]] 1025 | name = "uds_windows" 1026 | version = "1.0.2" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" 1029 | dependencies = [ 1030 | "tempfile", 1031 | "winapi", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "unicode-bidi" 1036 | version = "0.3.13" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 1039 | 1040 | [[package]] 1041 | name = "unicode-ident" 1042 | version = "1.0.8" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 1045 | 1046 | [[package]] 1047 | name = "unicode-normalization" 1048 | version = "0.1.22" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1051 | dependencies = [ 1052 | "tinyvec", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "url" 1057 | version = "2.3.1" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1060 | dependencies = [ 1061 | "form_urlencoded", 1062 | "idna", 1063 | "percent-encoding", 1064 | "serde", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "value-bag" 1069 | version = "1.0.0-alpha.9" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" 1072 | dependencies = [ 1073 | "ctor", 1074 | "version_check", 1075 | ] 1076 | 1077 | [[package]] 1078 | name = "version_check" 1079 | version = "0.9.4" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1082 | 1083 | [[package]] 1084 | name = "waker-fn" 1085 | version = "1.1.0" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" 1088 | 1089 | [[package]] 1090 | name = "wasi" 1091 | version = "0.11.0+wasi-snapshot-preview1" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1094 | 1095 | [[package]] 1096 | name = "wasm-bindgen" 1097 | version = "0.2.84" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" 1100 | dependencies = [ 1101 | "cfg-if", 1102 | "wasm-bindgen-macro", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "wasm-bindgen-backend" 1107 | version = "0.2.84" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" 1110 | dependencies = [ 1111 | "bumpalo", 1112 | "log", 1113 | "once_cell", 1114 | "proc-macro2", 1115 | "quote", 1116 | "syn 1.0.109", 1117 | "wasm-bindgen-shared", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "wasm-bindgen-futures" 1122 | version = "0.4.34" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" 1125 | dependencies = [ 1126 | "cfg-if", 1127 | "js-sys", 1128 | "wasm-bindgen", 1129 | "web-sys", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "wasm-bindgen-macro" 1134 | version = "0.2.84" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" 1137 | dependencies = [ 1138 | "quote", 1139 | "wasm-bindgen-macro-support", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "wasm-bindgen-macro-support" 1144 | version = "0.2.84" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" 1147 | dependencies = [ 1148 | "proc-macro2", 1149 | "quote", 1150 | "syn 1.0.109", 1151 | "wasm-bindgen-backend", 1152 | "wasm-bindgen-shared", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "wasm-bindgen-shared" 1157 | version = "0.2.84" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" 1160 | 1161 | [[package]] 1162 | name = "web-sys" 1163 | version = "0.3.61" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" 1166 | dependencies = [ 1167 | "js-sys", 1168 | "wasm-bindgen", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "winapi" 1173 | version = "0.3.9" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1176 | dependencies = [ 1177 | "winapi-i686-pc-windows-gnu", 1178 | "winapi-x86_64-pc-windows-gnu", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "winapi-i686-pc-windows-gnu" 1183 | version = "0.4.0" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1186 | 1187 | [[package]] 1188 | name = "winapi-x86_64-pc-windows-gnu" 1189 | version = "0.4.0" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1192 | 1193 | [[package]] 1194 | name = "windows-sys" 1195 | version = "0.45.0" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 1198 | dependencies = [ 1199 | "windows-targets 0.42.2", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "windows-sys" 1204 | version = "0.48.0" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1207 | dependencies = [ 1208 | "windows-targets 0.48.0", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "windows-targets" 1213 | version = "0.42.2" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 1216 | dependencies = [ 1217 | "windows_aarch64_gnullvm 0.42.2", 1218 | "windows_aarch64_msvc 0.42.2", 1219 | "windows_i686_gnu 0.42.2", 1220 | "windows_i686_msvc 0.42.2", 1221 | "windows_x86_64_gnu 0.42.2", 1222 | "windows_x86_64_gnullvm 0.42.2", 1223 | "windows_x86_64_msvc 0.42.2", 1224 | ] 1225 | 1226 | [[package]] 1227 | name = "windows-targets" 1228 | version = "0.48.0" 1229 | source = "registry+https://github.com/rust-lang/crates.io-index" 1230 | checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" 1231 | dependencies = [ 1232 | "windows_aarch64_gnullvm 0.48.0", 1233 | "windows_aarch64_msvc 0.48.0", 1234 | "windows_i686_gnu 0.48.0", 1235 | "windows_i686_msvc 0.48.0", 1236 | "windows_x86_64_gnu 0.48.0", 1237 | "windows_x86_64_gnullvm 0.48.0", 1238 | "windows_x86_64_msvc 0.48.0", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "windows_aarch64_gnullvm" 1243 | version = "0.42.2" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 1246 | 1247 | [[package]] 1248 | name = "windows_aarch64_gnullvm" 1249 | version = "0.48.0" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" 1252 | 1253 | [[package]] 1254 | name = "windows_aarch64_msvc" 1255 | version = "0.42.2" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 1258 | 1259 | [[package]] 1260 | name = "windows_aarch64_msvc" 1261 | version = "0.48.0" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" 1264 | 1265 | [[package]] 1266 | name = "windows_i686_gnu" 1267 | version = "0.42.2" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 1270 | 1271 | [[package]] 1272 | name = "windows_i686_gnu" 1273 | version = "0.48.0" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" 1276 | 1277 | [[package]] 1278 | name = "windows_i686_msvc" 1279 | version = "0.42.2" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 1282 | 1283 | [[package]] 1284 | name = "windows_i686_msvc" 1285 | version = "0.48.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" 1288 | 1289 | [[package]] 1290 | name = "windows_x86_64_gnu" 1291 | version = "0.42.2" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 1294 | 1295 | [[package]] 1296 | name = "windows_x86_64_gnu" 1297 | version = "0.48.0" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" 1300 | 1301 | [[package]] 1302 | name = "windows_x86_64_gnullvm" 1303 | version = "0.42.2" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 1306 | 1307 | [[package]] 1308 | name = "windows_x86_64_gnullvm" 1309 | version = "0.48.0" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" 1312 | 1313 | [[package]] 1314 | name = "windows_x86_64_msvc" 1315 | version = "0.42.2" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 1318 | 1319 | [[package]] 1320 | name = "windows_x86_64_msvc" 1321 | version = "0.48.0" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" 1324 | 1325 | [[package]] 1326 | name = "winnow" 1327 | version = "0.4.1" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" 1330 | dependencies = [ 1331 | "memchr", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "zbus" 1336 | version = "3.11.1" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "3dc29e76f558b2cb94190e8605ecfe77dd40f5df8c072951714b4b71a97f5848" 1339 | dependencies = [ 1340 | "async-broadcast", 1341 | "async-executor", 1342 | "async-fs", 1343 | "async-io", 1344 | "async-lock", 1345 | "async-recursion", 1346 | "async-task", 1347 | "async-trait", 1348 | "byteorder", 1349 | "derivative", 1350 | "dirs", 1351 | "enumflags2", 1352 | "event-listener", 1353 | "futures-core", 1354 | "futures-sink", 1355 | "futures-util", 1356 | "hex", 1357 | "nix", 1358 | "once_cell", 1359 | "ordered-stream", 1360 | "rand", 1361 | "serde", 1362 | "serde_repr", 1363 | "sha1", 1364 | "static_assertions", 1365 | "tracing", 1366 | "uds_windows", 1367 | "winapi", 1368 | "zbus_macros", 1369 | "zbus_names", 1370 | "zvariant", 1371 | ] 1372 | 1373 | [[package]] 1374 | name = "zbus_macros" 1375 | version = "3.11.1" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "62a80fd82c011cd08459eaaf1fd83d3090c1b61e6d5284360074a7475af3a85d" 1378 | dependencies = [ 1379 | "proc-macro-crate", 1380 | "proc-macro2", 1381 | "quote", 1382 | "regex", 1383 | "syn 1.0.109", 1384 | "zvariant_utils", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "zbus_names" 1389 | version = "2.5.0" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "f34f314916bd89bdb9934154627fab152f4f28acdda03e7c4c68181b214fe7e3" 1392 | dependencies = [ 1393 | "serde", 1394 | "static_assertions", 1395 | "zvariant", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "zvariant" 1400 | version = "3.12.0" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "46fe4914a985446d6fd287019b5fceccce38303d71407d9e6e711d44954a05d8" 1403 | dependencies = [ 1404 | "byteorder", 1405 | "enumflags2", 1406 | "libc", 1407 | "serde", 1408 | "static_assertions", 1409 | "url", 1410 | "zvariant_derive", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "zvariant_derive" 1415 | version = "3.12.0" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "34c20260af4b28b3275d6676c7e2a6be0d4332e8e0aba4616d34007fd84e462a" 1418 | dependencies = [ 1419 | "proc-macro-crate", 1420 | "proc-macro2", 1421 | "quote", 1422 | "syn 1.0.109", 1423 | "zvariant_utils", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "zvariant_utils" 1428 | version = "1.0.0" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "53b22993dbc4d128a17a3b6c92f1c63872dd67198537ee728d8b5d7c40640a8b" 1431 | dependencies = [ 1432 | "proc-macro2", 1433 | "quote", 1434 | "syn 1.0.109", 1435 | ] 1436 | -------------------------------------------------------------------------------- /tools/shanatest/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "shanatest" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | ashpd = { version = "0.4.0" } 10 | async-std = { version = "1.12.0", features = ["async-attributes","attributes"] } 11 | -------------------------------------------------------------------------------- /tools/shanatest/src/main.rs: -------------------------------------------------------------------------------- 1 | use ashpd::desktop::file_chooser::{Choice, FileFilter, OpenFileRequest, SaveFileRequest}; 2 | 3 | #[async_std::main] 4 | async fn main() -> ashpd::Result<()> { 5 | let files = OpenFileRequest::default() 6 | .title("open a file to read") 7 | .accept_label("read") 8 | .modal(true) 9 | .multiple(true) 10 | .choice( 11 | Choice::new("encoding", "Encoding", "latin15") 12 | .insert("utf8", "Unicode (UTF-8)") 13 | .insert("latin15", "Western"), 14 | ) 15 | // A trick to have a checkbox 16 | .choice(Choice::boolean("re-encode", "Re-encode", false)) 17 | .filter(FileFilter::new("SVG Image").mimetype("image/svg+xml")) 18 | .filter(FileFilter::new("JPEG Image").glob("*.jpg")) 19 | .current_filter(FileFilter::new("JPEG Image").glob("*.jpg")) 20 | .send() 21 | .await? 22 | .response()?; 23 | 24 | println!("{:#?}", files); 25 | 26 | let files = SaveFileRequest::default() 27 | .title("open a file to write") 28 | .accept_label("write") 29 | .current_name("image.jpg") 30 | .modal(true) 31 | //.filter(FileFilter::new("SVG Image").mimetype("image/svg+xml")) 32 | .filter(FileFilter::new("JPEG Image").glob("*.jpg")) 33 | .current_filter(FileFilter::new("JPEG Image").glob("*.jpg")) 34 | .send() 35 | .await? 36 | .response()?; 37 | 38 | println!("{:#?}", files); 39 | 40 | 41 | Ok(()) 42 | } 43 | --------------------------------------------------------------------------------