├── .github ├── FUNDING.yml ├── workflows │ ├── zizmor.yml │ ├── install.yml │ ├── nix.yml │ ├── simple.yml │ ├── git-registry.yml │ ├── buildjet.yml │ ├── target-dir.yml │ ├── coverage.yml │ ├── workspaces.yml │ ├── check-dist.yml │ ├── multi-job-cache.yml │ └── dependabot.yml └── dependabot.yaml ├── tests ├── tests │ ├── trybuild │ │ ├── empty_main.rs │ │ ├── fail_to_compile.rs │ │ └── fail_to_compile.stderr │ └── trybuild.rs ├── wasm-workspace │ ├── .cargo │ │ └── config.toml │ ├── crates │ │ ├── one │ │ │ ├── src │ │ │ │ └── main.rs │ │ │ └── Cargo.toml │ │ └── two │ │ │ ├── src │ │ │ └── main.rs │ │ │ └── Cargo.toml │ ├── Cargo.toml │ └── Cargo.lock ├── rust-toolchain │ └── .keep ├── Cargo.toml ├── src │ └── main.rs ├── flake.nix └── Cargo.lock ├── .gitignore ├── TODO.md ├── tsconfig.json ├── package.json ├── src ├── workspace.ts ├── utils.ts ├── restore.ts ├── save.ts ├── cleanup.ts └── config.ts ├── action.yml ├── CHANGELOG.md ├── LICENSE └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [Swatinem] 2 | -------------------------------------------------------------------------------- /tests/tests/trybuild/empty_main.rs: -------------------------------------------------------------------------------- 1 | fn main() {} 2 | -------------------------------------------------------------------------------- /tests/tests/trybuild/fail_to_compile.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | "foobar".foobar(); 3 | } 4 | -------------------------------------------------------------------------------- /tests/wasm-workspace/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-unknown-unknown" 3 | -------------------------------------------------------------------------------- /tests/wasm-workspace/crates/one/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | println!("Hello, world!"); 3 | } 4 | -------------------------------------------------------------------------------- /tests/wasm-workspace/crates/two/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | println!("Hello, world!"); 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | target/ 3 | src/*.js 4 | 5 | # Editors 6 | .idea/ 7 | 8 | # Mac 9 | .DS_Store 10 | -------------------------------------------------------------------------------- /tests/rust-toolchain/.keep: -------------------------------------------------------------------------------- 1 | the `rust-toolchain` directory will be globbed, 2 | and should not lead to any errors down the road 3 | -------------------------------------------------------------------------------- /tests/wasm-workspace/Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = [ 4 | "crates/one", 5 | "crates/two", 6 | ] 7 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | - better .cargo/bin handling: 2 | - get a list of all the files on "pre"/"restore" 3 | - move the files out of the way on "post"/"save" and move them back afterwards 4 | -------------------------------------------------------------------------------- /tests/wasm-workspace/crates/two/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | publish = false 3 | name = "wasm-two" 4 | version = "0.1.0" 5 | edition = "2021" 6 | 7 | [dependencies] 8 | clap = "4" 9 | -------------------------------------------------------------------------------- /tests/tests/trybuild.rs: -------------------------------------------------------------------------------- 1 | #[test] 2 | fn test_trybuild() { 3 | let t = trybuild::TestCases::new(); 4 | t.pass("tests/trybuild/empty_main.rs"); 5 | t.compile_fail("tests/trybuild/fail_to_compile.rs"); 6 | } 7 | -------------------------------------------------------------------------------- /tests/tests/trybuild/fail_to_compile.stderr: -------------------------------------------------------------------------------- 1 | error[E0599]: no method named `foobar` found for reference `&'static str` in the current scope 2 | --> tests/trybuild/fail_to_compile.rs:2:14 3 | | 4 | 2 | "foobar".foobar(); 5 | | ^^^^^^ method not found in `&'static str` 6 | -------------------------------------------------------------------------------- /tests/wasm-workspace/crates/one/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | publish = false 3 | name = "wasm-one" 4 | version = "0.1.0" 5 | edition = "2021" 6 | 7 | [dependencies] 8 | reqwest = "0.12" 9 | async-std = "1" 10 | tracing = "0.1" 11 | tracing-futures = "0.2" 12 | serde = "1" 13 | serde_json = "1" 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "noEmitOnError": false, 4 | "diagnostics": true, 5 | "lib": ["esnext"], 6 | 7 | "target": "es2020", 8 | 9 | "resolveJsonModule": true, 10 | "moduleResolution": "node", 11 | "module": "esnext", 12 | "esModuleInterop": true, 13 | 14 | "strict": true, 15 | "skipLibCheck": true, 16 | "noUnusedLocals": true, 17 | "noUnusedParameters": true, 18 | "noImplicitReturns": true 19 | }, 20 | "exclude": ["dist"] 21 | } 22 | -------------------------------------------------------------------------------- /tests/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | publish = false 3 | name = "rust-cache" 4 | version = "0.1.0" 5 | authors = ["Arpad Borsos "] 6 | edition = "2021" 7 | 8 | [dependencies] 9 | reqwest = "0.12.1" 10 | jsonpath_lib_polars_vendor = "0.0.1" 11 | watto = { git = "https://github.com/getsentry/watto", rev = "39ccb9add289c1f23c89f40506f4a80b2f4011b9", features = ["strings"] } 12 | 13 | [dev-dependencies] 14 | trybuild = "1" 15 | 16 | [target.'cfg(not(target_env = "msvc"))'.dependencies] 17 | tikv-jemallocator = "0.6.0" 18 | -------------------------------------------------------------------------------- /tests/src/main.rs: -------------------------------------------------------------------------------- 1 | #[cfg(not(target_env = "msvc"))] 2 | use tikv_jemallocator::Jemalloc; 3 | 4 | #[cfg(not(target_env = "msvc"))] 5 | #[global_allocator] 6 | static GLOBAL: Jemalloc = Jemalloc; 7 | 8 | fn main() { 9 | println!("Hello, world!"); 10 | } 11 | 12 | #[cfg(test)] 13 | fn some_fn(input: bool) -> usize { 14 | if input { 15 | 2 + 4 16 | } else { 17 | 3_usize.saturating_add(5) 18 | } 19 | } 20 | 21 | #[test] 22 | fn some_test() { 23 | assert_eq!(some_fn(true), 6); 24 | assert_eq!(some_fn(false), 8); 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/zizmor.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Actions Security Analysis with zizmor 🌈 2 | 3 | on: 4 | push: 5 | branches: ["main"] 6 | pull_request: 7 | branches: ["**"] 8 | 9 | permissions: {} 10 | 11 | jobs: 12 | zizmor: 13 | name: Run zizmor 🌈 14 | runs-on: ubuntu-latest 15 | permissions: 16 | security-events: write # for uploading results to the Security tab 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 20 | with: 21 | persist-credentials: false 22 | 23 | - name: Run zizmor 🌈 24 | uses: zizmorcore/zizmor-action@e639db99335bc9038abc0e066dfcd72e23d26fb4 # v0.3.0 25 | -------------------------------------------------------------------------------- /.github/workflows/install.yml: -------------------------------------------------------------------------------- 1 | name: install 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | install: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test `cargo install` on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 23 | with: 24 | persist-credentials: false 25 | 26 | - run: rustup toolchain install stable --profile minimal --no-self-update 27 | 28 | - uses: ./ 29 | 30 | - run: cargo install cargo-deny --locked 31 | -------------------------------------------------------------------------------- /.github/workflows/nix.yml: -------------------------------------------------------------------------------- 1 | name: nix 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | nix: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest] 14 | 15 | name: Test Nix on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | steps: 19 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 20 | with: 21 | persist-credentials: false 22 | 23 | - uses: cachix/install-nix-action@4e002c8ec80594ecd40e759629461e26c8abed15 # v31.9.0 24 | 25 | - uses: ./ 26 | with: 27 | workspaces: tests 28 | cmd-format: nix develop ./tests -c {0} 29 | 30 | - run: | 31 | nix develop -c cargo check 32 | nix develop -c cargo test 33 | working-directory: tests 34 | -------------------------------------------------------------------------------- /tests/flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs = { 3 | nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; 4 | flake-utils.url = "github:numtide/flake-utils"; 5 | rust-overlay = { 6 | url = "github:oxalica/rust-overlay"; 7 | inputs.nixpkgs.follows = "nixpkgs"; 8 | }; 9 | }; 10 | 11 | outputs = inputs @ { self, nixpkgs, flake-utils, rust-overlay, ... }: 12 | flake-utils.lib.eachDefaultSystem ( 13 | system: let 14 | overlays = [ (import rust-overlay) ]; 15 | pkgs = import nixpkgs { inherit system overlays; }; 16 | in { 17 | devShells.default = with pkgs; mkShell { 18 | buildInputs = [ 19 | autoconf 20 | gcc 21 | gnumake 22 | openssl 23 | pkg-config 24 | rust-bin.stable.latest.minimal 25 | ]; 26 | CARGO_TERM_COLOR = "always"; 27 | }; 28 | } 29 | ); 30 | } 31 | 32 | -------------------------------------------------------------------------------- /.github/workflows/simple.yml: -------------------------------------------------------------------------------- 1 | name: simple 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | simple: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test `cargo check/test/build` on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 23 | with: 24 | persist-credentials: false 25 | 26 | - run: rustup toolchain install stable --profile minimal --no-self-update 27 | 28 | - uses: ./ 29 | with: 30 | workspaces: tests 31 | 32 | - run: | 33 | cargo check 34 | cargo test 35 | cargo build --release 36 | working-directory: tests 37 | -------------------------------------------------------------------------------- /.github/workflows/git-registry.yml: -------------------------------------------------------------------------------- 1 | name: git-registry 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | git-registry: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test cargo "git" registry on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | CARGO_REGISTRIES_CRATES_IO_PROTOCOL: git 21 | 22 | steps: 23 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 24 | with: 25 | persist-credentials: false 26 | 27 | - run: rustup toolchain install stable --profile minimal --no-self-update 28 | 29 | - uses: ./ 30 | with: 31 | workspaces: tests 32 | 33 | - run: | 34 | cargo check 35 | cargo test 36 | working-directory: tests 37 | -------------------------------------------------------------------------------- /.github/workflows/buildjet.yml: -------------------------------------------------------------------------------- 1 | name: buildjet 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | buildjet: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test buildjet provider on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 23 | with: 24 | persist-credentials: false 25 | 26 | - run: rustup toolchain install stable --profile minimal --no-self-update 27 | 28 | - uses: ./ 29 | with: 30 | workspaces: tests 31 | cache-provider: buildjet 32 | 33 | - run: | 34 | cargo check 35 | cargo test 36 | cargo build --release 37 | working-directory: tests 38 | -------------------------------------------------------------------------------- /.github/workflows/target-dir.yml: -------------------------------------------------------------------------------- 1 | name: target-dir 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | target-dir: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test custom target-dir on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 23 | with: 24 | persist-credentials: false 25 | 26 | - run: rustup toolchain install stable --profile minimal --no-self-update 27 | 28 | # the `workspaces` option has the format `$workspace -> $target-dir` 29 | # and the `$target-dir` is relative to the `$workspace`. 30 | - uses: ./ 31 | with: 32 | workspaces: tests -> ../custom-target-dir 33 | 34 | - run: cargo test --manifest-path tests/Cargo.toml --target-dir custom-target-dir 35 | -------------------------------------------------------------------------------- /.github/workflows/coverage.yml: -------------------------------------------------------------------------------- 1 | name: coverage 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | coverage: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test `cargo-llvm-cov` on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 23 | with: 24 | persist-credentials: false 25 | 26 | - run: rustup toolchain install stable --profile minimal --component llvm-tools-preview --no-self-update 27 | 28 | - uses: taiki-e/install-action@d850aa816998e5cf15f67a78c7b933f2a5033f8a # v2.63.3 29 | with: 30 | tool: cargo-llvm-cov 31 | 32 | - uses: ./ 33 | with: 34 | workspaces: tests 35 | 36 | - run: cargo llvm-cov --all-features --workspace 37 | working-directory: tests 38 | -------------------------------------------------------------------------------- /.github/workflows/workspaces.yml: -------------------------------------------------------------------------------- 1 | name: workspaces 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | workspaces: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test multiple workspaces on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 23 | with: 24 | persist-credentials: false 25 | 26 | - run: rustup toolchain install stable --profile minimal --target wasm32-unknown-unknown --no-self-update 27 | 28 | - uses: ./ 29 | with: 30 | workspaces: | 31 | tests 32 | tests/wasm-workspace 33 | 34 | - name: cargo check (tests) 35 | working-directory: tests 36 | run: cargo check 37 | 38 | - name: cargo check (tests/wasm-workspace) 39 | working-directory: tests/wasm-workspace 40 | run: cargo check 41 | -------------------------------------------------------------------------------- /.github/workflows/check-dist.yml: -------------------------------------------------------------------------------- 1 | name: check dist/ 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | paths-ignore: 8 | - "**.md" 9 | pull_request: 10 | paths-ignore: 11 | - "**.md" 12 | workflow_dispatch: 13 | 14 | permissions: {} 15 | 16 | jobs: 17 | check-dist: 18 | if: github.repository == 'Swatinem/rust-cache' 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 22 | with: 23 | persist-credentials: false 24 | 25 | - name: Setup Node.js 20.x 26 | uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 27 | with: 28 | node-version: 20.x 29 | cache: npm 30 | 31 | - name: Install dependencies 32 | run: npm ci 33 | 34 | - name: Rebuild the dist/ directory 35 | run: npm run prepare 36 | 37 | - name: Compare the expected and actual dist/ directories 38 | run: | 39 | if [ "$(git diff dist/ | wc -l)" -gt "0" ]; then 40 | echo "Detected uncommitted changes after build. See status below:" 41 | git diff 42 | exit 1 43 | fi 44 | id: diff 45 | 46 | - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 47 | if: ${{ failure() && steps.diff.conclusion == 'failure' }} 48 | with: 49 | name: dist 50 | path: dist/ 51 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "rust-cache", 4 | "version": "2.8.2", 5 | "description": "A GitHub Action that implements smart caching for rust/cargo projects with sensible defaults.", 6 | "keywords": [ 7 | "actions", 8 | "rust", 9 | "cache" 10 | ], 11 | "author": "Arpad Borsos ", 12 | "license": "LGPL-3.0", 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/Swatinem/rust-cache.git" 16 | }, 17 | "bugs": { 18 | "url": "https://github.com/Swatinem/rust-cache/issues" 19 | }, 20 | "funding": { 21 | "url": "https://github.com/sponsors/Swatinem" 22 | }, 23 | "homepage": "https://github.com/Swatinem/rust-cache#readme", 24 | "dependencies": { 25 | "@actions/buildjet-cache": "npm:github-actions.cache-buildjet@0.2.0", 26 | "@actions/warpbuild-cache": "npm:github-actions.warp-cache@1.4.7", 27 | "@actions/cache": "^5.0.1", 28 | "@actions/core": "^2.0.1", 29 | "@actions/exec": "^2.0.0", 30 | "@actions/glob": "^0.5.0", 31 | "@actions/io": "^2.0.0", 32 | "smol-toml": "^1.5.2" 33 | }, 34 | "devDependencies": { 35 | "@types/node": "^25.0.2", 36 | "@vercel/ncc": "^0.38.4", 37 | "linefix": "^0.1.1", 38 | "typescript": "5.9.3" 39 | }, 40 | "scripts": { 41 | "prepare": "ncc build --target es2020 -o dist/restore src/restore.ts && ncc build --target es2020 -o dist/save src/save.ts && linefix dist" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/optimizing-pr-creation-version-updates#setting-up-a-cooldown-period-for-dependency-updates 2 | 3 | version: 2 4 | updates: 5 | - package-ecosystem: cargo 6 | directories: 7 | - tests 8 | - tests/wasm-workspace 9 | schedule: 10 | interval: weekly 11 | # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference#groups-- 12 | # 1 PR per week and group 13 | groups: 14 | cargo-major: 15 | update-types: ["major"] 16 | cargo-minor: 17 | update-types: ["minor"] 18 | cargo-patch: 19 | update-types: ["patch"] 20 | - package-ecosystem: github-actions 21 | directory: / 22 | schedule: 23 | interval: weekly 24 | groups: 25 | actions: 26 | # Combine all images of the last week 27 | patterns: ["*"] 28 | - package-ecosystem: npm 29 | directory: / 30 | schedule: 31 | interval: weekly 32 | groups: 33 | prd-major: 34 | dependency-type: "production" 35 | update-types: ["major"] 36 | prd-minor: 37 | dependency-type: "production" 38 | update-types: ["minor"] 39 | prd-patch: 40 | dependency-type: "production" 41 | update-types: ["patch"] 42 | dev-major: 43 | dependency-type: "development" 44 | update-types: ["major"] 45 | dev-minor: 46 | dependency-type: "development" 47 | update-types: ["minor"] 48 | dev-patch: 49 | dependency-type: "development" 50 | update-types: ["patch"] 51 | -------------------------------------------------------------------------------- /src/workspace.ts: -------------------------------------------------------------------------------- 1 | import * as core from "@actions/core"; 2 | import path from "path"; 3 | 4 | import { getCmdOutput } from "./utils"; 5 | 6 | const SAVE_TARGETS = new Set(["lib", "proc-macro"]); 7 | 8 | export class Workspace { 9 | constructor(public root: string, public target: string) {} 10 | 11 | async getPackages(cmdFormat: string, filter: (p: Meta["packages"][0]) => boolean, extraArgs?: string): Promise { 12 | const cmd = "cargo metadata --all-features --format-version 1" + (extraArgs ? ` ${extraArgs}` : ""); 13 | let packages: Packages = []; 14 | try { 15 | core.debug(`collecting metadata for "${this.root}"`); 16 | const meta: Meta = JSON.parse( 17 | await getCmdOutput(cmdFormat, cmd, { 18 | cwd: this.root, 19 | env: { ...process.env, "CARGO_ENCODED_RUSTFLAGS": "" }, 20 | }), 21 | ); 22 | core.debug(`workspace "${this.root}" has ${meta.packages.length} packages`); 23 | for (const pkg of meta.packages.filter(filter)) { 24 | const targets = pkg.targets.filter((t) => t.kind.some((kind) => SAVE_TARGETS.has(kind))).map((t) => t.name); 25 | packages.push({ name: pkg.name, version: pkg.version, targets, path: path.dirname(pkg.manifest_path) }); 26 | } 27 | } catch (err) { 28 | console.error(err); 29 | } 30 | return packages; 31 | } 32 | 33 | public async getPackagesOutsideWorkspaceRoot(cmdFormat: string): Promise { 34 | return await this.getPackages(cmdFormat, (pkg) => !pkg.manifest_path.startsWith(this.root)); 35 | } 36 | 37 | public async getWorkspaceMembers(cmdFormat: string): Promise { 38 | return await this.getPackages(cmdFormat, (_) => true, "--no-deps"); 39 | } 40 | } 41 | 42 | export interface PackageDefinition { 43 | name: string; 44 | version: string; 45 | path: string; 46 | targets: Array; 47 | } 48 | 49 | export type Packages = Array; 50 | 51 | interface Meta { 52 | packages: Array<{ 53 | name: string; 54 | version: string; 55 | manifest_path: string; 56 | targets: Array<{ kind: Array; name: string }>; 57 | }>; 58 | } 59 | -------------------------------------------------------------------------------- /.github/workflows/multi-job-cache.yml: -------------------------------------------------------------------------------- 1 | name: multi-job-cache 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: {} 6 | 7 | jobs: 8 | multi-job-cache-1: 9 | if: github.repository == 'Swatinem/rust-cache' 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-latest, macos-latest, windows-latest] 14 | 15 | name: Test multi-job cache (1) on ${{ matrix.os }} 16 | runs-on: ${{ matrix.os }} 17 | 18 | env: 19 | CARGO_TERM_COLOR: always 20 | 21 | steps: 22 | - name: checkout 23 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 24 | with: 25 | persist-credentials: false 26 | 27 | - name: install rust toolchain 28 | run: rustup toolchain install stable --profile minimal --target wasm32-unknown-unknown --no-self-update 29 | 30 | - name: cache 31 | uses: ./ 32 | with: 33 | workspaces: | 34 | tests 35 | add-job-id-key: "false" 36 | add-rust-environment-hash-key: "false" 37 | 38 | - name: cargo check (tests) 39 | working-directory: tests 40 | run: cargo check 41 | 42 | multi-job-cache-2: 43 | if: github.repository == 'Swatinem/rust-cache' 44 | strategy: 45 | fail-fast: false 46 | matrix: 47 | os: [ubuntu-latest, macos-latest, windows-latest] 48 | 49 | name: Test multi-job cache (2) on ${{ matrix.os }} 50 | runs-on: ${{ matrix.os }} 51 | 52 | env: 53 | CARGO_TERM_COLOR: always 54 | 55 | steps: 56 | - name: checkout 57 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 58 | with: 59 | persist-credentials: false 60 | 61 | - name: install rust toolchain 62 | run: rustup toolchain install stable --profile minimal --target wasm32-unknown-unknown --no-self-update 63 | 64 | - name: cache 65 | uses: ./ 66 | with: 67 | workspaces: | 68 | tests/wasm-workspace 69 | add-job-id-key: "false" 70 | add-rust-environment-hash-key: "false" 71 | 72 | - name: cargo check (tests/wasm-workspace) 73 | working-directory: tests/wasm-workspace 74 | run: cargo check 75 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as core from "@actions/core"; 2 | import * as exec from "@actions/exec"; 3 | import * as buildjetCache from "@actions/buildjet-cache"; 4 | import * as warpbuildCache from "@actions/warpbuild-cache"; 5 | import * as ghCache from "@actions/cache"; 6 | import fs from "fs"; 7 | 8 | export function reportError(e: any) { 9 | const { commandFailed } = e; 10 | if (commandFailed) { 11 | core.error(`Command failed: ${commandFailed.command}`); 12 | core.error(commandFailed.stderr); 13 | } else { 14 | core.error(`${e.stack}`); 15 | } 16 | } 17 | 18 | export async function getCmdOutput( 19 | cmdFormat: string, 20 | cmd: string, 21 | options: exec.ExecOptions = {}, 22 | ): Promise { 23 | cmd = cmdFormat.replace("{0}", cmd); 24 | let stdout = ""; 25 | let stderr = ""; 26 | try { 27 | await exec.exec(cmd, [], { 28 | silent: true, 29 | listeners: { 30 | stdout(data) { 31 | stdout += data.toString(); 32 | }, 33 | stderr(data) { 34 | stderr += data.toString(); 35 | }, 36 | }, 37 | ...options, 38 | }); 39 | } catch (e) { 40 | (e as any).commandFailed = { 41 | command: cmd, 42 | stderr, 43 | }; 44 | throw e; 45 | } 46 | return stdout; 47 | } 48 | 49 | export interface GhCache { 50 | isFeatureAvailable: typeof ghCache.isFeatureAvailable; 51 | restoreCache: typeof ghCache.restoreCache; 52 | saveCache: (paths: string[], key: string) => Promise; 53 | } 54 | 55 | export interface CacheProvider { 56 | name: string; 57 | cache: GhCache; 58 | } 59 | 60 | export function getCacheProvider(): CacheProvider { 61 | const cacheProvider = core.getInput("cache-provider"); 62 | let cache: GhCache; 63 | switch (cacheProvider) { 64 | case "github": 65 | cache = ghCache; 66 | break; 67 | case "buildjet": 68 | cache = buildjetCache; 69 | break; 70 | case "warpbuild": 71 | cache = warpbuildCache; 72 | break; 73 | default: 74 | throw new Error(`The \`cache-provider\` \`${cacheProvider}\` is not valid.`); 75 | } 76 | 77 | return { 78 | name: cacheProvider, 79 | cache: cache, 80 | }; 81 | } 82 | 83 | export async function exists(path: string) { 84 | try { 85 | await fs.promises.access(path); 86 | return true; 87 | } catch { 88 | return false; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/restore.ts: -------------------------------------------------------------------------------- 1 | import * as core from "@actions/core"; 2 | 3 | import { cleanTargetDir } from "./cleanup"; 4 | import { CacheConfig } from "./config"; 5 | import { getCacheProvider, reportError } from "./utils"; 6 | 7 | process.on("uncaughtException", (e) => { 8 | core.error(e.message); 9 | if (e.stack) { 10 | core.error(e.stack); 11 | } 12 | }); 13 | 14 | async function run() { 15 | const cacheProvider = getCacheProvider(); 16 | 17 | if (!cacheProvider.cache.isFeatureAvailable()) { 18 | setCacheHitOutput(false); 19 | return; 20 | } 21 | 22 | try { 23 | var cacheOnFailure = core.getInput("cache-on-failure").toLowerCase(); 24 | if (cacheOnFailure !== "true") { 25 | cacheOnFailure = "false"; 26 | } 27 | var lookupOnly = core.getInput("lookup-only").toLowerCase() === "true"; 28 | 29 | core.exportVariable("CACHE_ON_FAILURE", cacheOnFailure); 30 | core.exportVariable("CARGO_INCREMENTAL", 0); 31 | 32 | const config = await CacheConfig.new(); 33 | config.printInfo(cacheProvider); 34 | core.info(""); 35 | 36 | core.info(`... ${lookupOnly ? "Checking" : "Restoring"} cache ...`); 37 | const key = config.cacheKey; 38 | // Pass a copy of cachePaths to avoid mutating the original array as reported by: 39 | // https://github.com/actions/toolkit/pull/1378 40 | // TODO: remove this once the underlying bug is fixed. 41 | const restoreKey = await cacheProvider.cache.restoreCache(config.cachePaths.slice(), key, [config.restoreKey], { 42 | lookupOnly, 43 | }); 44 | if (restoreKey) { 45 | const match = restoreKey === key; 46 | core.info(`${lookupOnly ? "Found" : "Restored from"} cache key "${restoreKey}" full match: ${match}.`); 47 | if (!match) { 48 | // pre-clean the target directory on cache mismatch 49 | for (const workspace of config.workspaces) { 50 | try { 51 | await cleanTargetDir(workspace.target, [], true); 52 | } catch {} 53 | } 54 | 55 | // We restored the cache but it is not a full match. 56 | config.saveState(); 57 | } 58 | 59 | setCacheHitOutput(match); 60 | } else { 61 | core.info("No cache found."); 62 | config.saveState(); 63 | 64 | setCacheHitOutput(false); 65 | } 66 | } catch (e) { 67 | setCacheHitOutput(false); 68 | 69 | reportError(e); 70 | } 71 | process.exit(); 72 | } 73 | 74 | function setCacheHitOutput(cacheHit: boolean): void { 75 | core.setOutput("cache-hit", cacheHit.toString()); 76 | } 77 | 78 | run(); 79 | -------------------------------------------------------------------------------- /.github/workflows/dependabot.yml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#enabling-automerge-on-a-pull-request 2 | 3 | name: Dependabot Automation 4 | on: pull_request 5 | 6 | permissions: {} 7 | 8 | jobs: 9 | automerge: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: write # for pushing commits 13 | pull-requests: write # for merging PRs 14 | if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'Swatinem/rust-cache' 15 | steps: 16 | - name: Fetch metadata 17 | id: metadata 18 | uses: dependabot/fetch-metadata@08eff52bf64351f401fb50d4972fa95b9f2c2d1b # v2.4.0 19 | with: 20 | github-token: "${{ secrets.GITHUB_TOKEN }}" 21 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 22 | with: 23 | fetch-depth: 2 24 | persist-credentials: false 25 | if: steps.metadata.outputs.update-type == 'version-update:semver-patch' 26 | - name: Check if package-lock.json has been changed 27 | if: steps.metadata.outputs.update-type == 'version-update:semver-patch' 28 | id: npm 29 | env: 30 | PR_URL: ${{github.event.pull_request.html_url}} 31 | GH_TOKEN: ${{secrets.GITHUB_TOKEN}} 32 | run: | 33 | if ! git diff --quiet HEAD~1.. -- package-lock.json; then 34 | echo "changed=true" >> $GITHUB_OUTPUT 35 | echo "changed=true, checking out $PR_URL to allow amend" 36 | gh pr checkout "$PR_URL" 37 | fi 38 | - name: Setup node if necessary 39 | if: steps.npm.outputs.changed != '' 40 | uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 41 | with: 42 | node-version: 20.x 43 | cache: npm 44 | - name: Re-generate and commit dist/ if changed 45 | id: amend 46 | if: steps.npm.outputs.changed != '' 47 | run: | 48 | npm ci 49 | npm run prepare 50 | if ! git diff --quiet dist/*/index.js; then 51 | echo "dist/ changed, amending last commit" 52 | export $(git log -1 --pretty=format:'GIT_COMMITTER_NAME=%cn GIT_COMMITTER_EMAIL=%ce GIT_AUTHOR_NAME=%an GIT_AUTHOR_EMAIL=%ae') 53 | git fetch --unshallow 54 | echo "Before amend:" && git show --name-only --pretty= 55 | git commit --amend --no-edit --no-reset-author -- dist/*/index.js 56 | echo "After amend:" && git show --name-only --pretty= 57 | git push --force-with-lease origin HEAD 58 | echo "changed=true" >> $GITHUB_OUTPUT 59 | fi 60 | - name: Auto-merge Patch PRs 61 | if: steps.metadata.outputs.update-type == 'version-update:semver-patch' 62 | run: gh pr merge --auto --merge "$PR_URL" 63 | env: 64 | PR_URL: ${{github.event.pull_request.html_url}} 65 | GH_TOKEN: ${{secrets.GITHUB_TOKEN}} 66 | -------------------------------------------------------------------------------- /src/save.ts: -------------------------------------------------------------------------------- 1 | import * as core from "@actions/core"; 2 | import * as exec from "@actions/exec"; 3 | 4 | import { cleanBin, cleanGit, cleanRegistry, cleanTargetDir } from "./cleanup"; 5 | import { CacheConfig, isCacheUpToDate } from "./config"; 6 | import { getCacheProvider, reportError } from "./utils"; 7 | 8 | process.on("uncaughtException", (e) => { 9 | core.error(e.message); 10 | if (e.stack) { 11 | core.error(e.stack); 12 | } 13 | }); 14 | 15 | async function run() { 16 | const cacheProvider = getCacheProvider(); 17 | 18 | const save = core.getInput("save-if").toLowerCase() || "true"; 19 | 20 | if (!(cacheProvider.cache.isFeatureAvailable() && save === "true")) { 21 | return; 22 | } 23 | 24 | try { 25 | if (isCacheUpToDate()) { 26 | core.info(`Cache up-to-date.`); 27 | return; 28 | } 29 | 30 | const config = CacheConfig.fromState(); 31 | config.printInfo(cacheProvider); 32 | core.info(""); 33 | 34 | // TODO: remove this once https://github.com/actions/toolkit/pull/553 lands 35 | if (process.env["RUNNER_OS"] == "macOS") { 36 | await macOsWorkaround(); 37 | } 38 | 39 | const workspaceCrates = core.getInput("cache-workspace-crates").toLowerCase() || "false"; 40 | const allPackages = []; 41 | for (const workspace of config.workspaces) { 42 | const packages = await workspace.getPackagesOutsideWorkspaceRoot(config.cmdFormat); 43 | if (workspaceCrates === "true") { 44 | const wsMembers = await workspace.getWorkspaceMembers(config.cmdFormat); 45 | packages.push(...wsMembers); 46 | } 47 | allPackages.push(...packages); 48 | try { 49 | core.info(`... Cleaning ${workspace.target} ...`); 50 | await cleanTargetDir(workspace.target, packages); 51 | } catch (e) { 52 | core.debug(`${(e as any).stack}`); 53 | } 54 | } 55 | 56 | try { 57 | const crates = core.getInput("cache-all-crates").toLowerCase() || "false"; 58 | core.info(`... Cleaning cargo registry (cache-all-crates: ${crates}) ...`); 59 | await cleanRegistry(allPackages, crates !== "true"); 60 | } catch (e) { 61 | core.debug(`${(e as any).stack}`); 62 | } 63 | 64 | if (config.cacheBin) { 65 | try { 66 | core.info(`... Cleaning cargo/bin ...`); 67 | await cleanBin(config.cargoBins); 68 | } catch (e) { 69 | core.debug(`${(e as any).stack}`); 70 | } 71 | } 72 | 73 | try { 74 | core.info(`... Cleaning cargo git cache ...`); 75 | await cleanGit(allPackages); 76 | } catch (e) { 77 | core.debug(`${(e as any).stack}`); 78 | } 79 | 80 | core.info(`... Saving cache ...`); 81 | // Pass a copy of cachePaths to avoid mutating the original array as reported by: 82 | // https://github.com/actions/toolkit/pull/1378 83 | // TODO: remove this once the underlying bug is fixed. 84 | await cacheProvider.cache.saveCache(config.cachePaths.slice(), config.cacheKey); 85 | } catch (e) { 86 | reportError(e); 87 | } 88 | process.exit(); 89 | } 90 | 91 | run(); 92 | 93 | async function macOsWorkaround() { 94 | try { 95 | // Workaround for https://github.com/actions/cache/issues/403 96 | // Also see https://github.com/rust-lang/cargo/issues/8603 97 | await exec.exec("sudo", ["/usr/sbin/purge"], { silent: true }); 98 | } catch {} 99 | } 100 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: "Rust Cache" 2 | description: "A GitHub Action that implements smart caching for rust/cargo projects with sensible defaults." 3 | author: "Arpad Borsos " 4 | inputs: 5 | prefix-key: 6 | description: "The prefix cache key, this can be changed to start a new cache manually." 7 | required: false 8 | default: "v0-rust" 9 | shared-key: 10 | description: "A cache key that is used instead of the automatic `job`-based key, and is stable over multiple jobs." 11 | required: false 12 | key: 13 | description: "An additional cache key that is added alongside the automatic `job`-based cache key and can be used to further differentiate jobs." 14 | required: false 15 | add-job-id-key: 16 | description: "If the automatic `job`-based cache key should include the job id. Defaults to true." 17 | required: false 18 | default: "true" 19 | add-rust-environment-hash-key: 20 | description: "Weather the a hash of the rust environment should be included in the cache key. This includes a hash of all Cargo.toml/Cargo.lock files, rust-toolchain files, and .cargo/config.toml files (if present), as well as the specified 'env-vars'. Defaults to true." 21 | required: false 22 | default: "true" 23 | env-vars: 24 | description: "Additional environment variables to include in the cache key, separated by spaces." 25 | required: false 26 | workspaces: 27 | description: "Paths to multiple Cargo workspaces and their target directories, separated by newlines." 28 | required: false 29 | cache-directories: 30 | description: "Additional non workspace directories to be cached, separated by newlines." 31 | required: false 32 | cache-targets: 33 | description: "Determines whether workspace targets are cached. If `false`, only the cargo registry will be cached." 34 | required: false 35 | default: "true" 36 | cache-on-failure: 37 | description: "Cache even if the build fails. Defaults to false." 38 | required: false 39 | cache-all-crates: 40 | description: "Determines which crates are cached. If `true` all crates will be cached, otherwise only dependent crates will be cached." 41 | required: false 42 | default: "false" 43 | cache-workspace-crates: 44 | description: "Similar to cache-all-crates. If `true` the workspace crates will be cached." 45 | required: false 46 | default: "false" 47 | save-if: 48 | description: "Determiners whether the cache should be saved. If `false`, the cache is only restored." 49 | required: false 50 | default: "true" 51 | cache-provider: 52 | description: "Determines which provider to use for caching. Options are github, buildjet, or warpbuild. Defaults to github." 53 | required: false 54 | default: "github" 55 | cache-bin: 56 | description: "Determines whether to cache ${CARGO_HOME}/bin." 57 | required: false 58 | default: "true" 59 | lookup-only: 60 | description: "Check if a cache entry exists without downloading the cache" 61 | required: false 62 | default: "false" 63 | cmd-format: 64 | description: "A format string used to format commands to be run, i.e. `rustc` and `cargo`." 65 | required: false 66 | default: "{0}" 67 | outputs: 68 | cache-hit: 69 | description: "A boolean value that indicates an exact match was found." 70 | runs: 71 | using: "node20" 72 | main: "dist/restore/index.js" 73 | post: "dist/save/index.js" 74 | post-if: "success() || env.CACHE_ON_FAILURE == 'true'" 75 | branding: 76 | icon: "archive" 77 | color: "gray-dark" 78 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 2.8.2 4 | 5 | - Don't overwrite env for cargo-metadata call 6 | 7 | ## 2.8.1 8 | 9 | - Set empty `CARGO_ENCODED_RUSTFLAGS` when retrieving metadata 10 | - Various dependency updates 11 | 12 | ## 2.8.0 13 | 14 | - Add support for `warpbuild` cache provider 15 | - Add new `cache-workspace-crates` feature 16 | 17 | ## 2.7.8 18 | 19 | - Include CPU arch in the cache key 20 | 21 | ## 2.7.7 22 | 23 | - Also cache `cargo install` metadata 24 | 25 | ## 2.7.6 26 | 27 | - Allow opting out of caching $CARGO_HOME/bin 28 | - Add runner OS in cache key 29 | - Adds an option to do lookup-only of the cache 30 | 31 | ## 2.7.5 32 | 33 | - Support Cargo.lock format cargo-lock v4 34 | - Only run macOsWorkaround() on macOS 35 | 36 | ## 2.7.3 37 | 38 | - Work around upstream problem that causes cache saving to hang for minutes. 39 | 40 | ## 2.7.2 41 | 42 | - Only key by `Cargo.toml` and `Cargo.lock` files of workspace members. 43 | 44 | ## 2.7.1 45 | 46 | - Update toml parser to fix parsing errors. 47 | 48 | ## 2.7.0 49 | 50 | - Properly cache `trybuild` tests. 51 | 52 | ## 2.6.2 53 | 54 | - Fix `toml` parsing. 55 | 56 | ## 2.6.1 57 | 58 | - Fix hash contributions of `Cargo.lock`/`Cargo.toml` files. 59 | 60 | ## 2.6.0 61 | 62 | - Add "buildjet" as a second `cache-provider` backend. 63 | - Clean up sparse registry index. 64 | - Do not clean up src of `-sys` crates. 65 | - Remove `.cargo/credentials.toml` before saving. 66 | 67 | ## 2.5.1 68 | 69 | - Fix hash contribution of `Cargo.lock`. 70 | 71 | ## 2.5.0 72 | 73 | - feat: Rm workspace crates version before caching. 74 | - feat: Add hash of `.cargo/config.toml` to key. 75 | 76 | ## 2.4.0 77 | 78 | - Fix cache key stability. 79 | - Use 8 character hash components to reduce the key length, making it more readable. 80 | 81 | ## 2.3.0 82 | 83 | - Add `cache-all-crates` option, which enables caching of crates installed by workflows. 84 | - Add installed packages to cache key, so changes to workflows that install rust tools are detected and cached properly. 85 | - Fix cache restore failures due to upstream bug. 86 | - Fix `EISDIR` error due to globed directories. 87 | - Update runtime `@actions/cache`, `@actions/io` and dev `typescript` dependencies. 88 | - Update `npm run prepare` so it creates distribution files with the right line endings. 89 | 90 | ## 2.2.1 91 | 92 | - Update `@actions/cache` dependency to fix usage of `zstd` compression. 93 | 94 | ## 2.2.0 95 | 96 | - Add new `save-if` option to always restore, but only conditionally save the cache. 97 | 98 | ## 2.1.0 99 | 100 | - Only hash `Cargo.{lock,toml}` files in the configured workspace directories. 101 | 102 | ## 2.0.2 103 | 104 | - Avoid calling `cargo metadata` on pre-cleanup. 105 | - Added `prefix-key`, `cache-directories` and `cache-targets` options. 106 | 107 | ## 2.0.1 108 | 109 | - Primarily just updating dependencies to fix GitHub deprecation notices. 110 | 111 | ## 2.0.0 112 | 113 | - The action code was refactored to allow for caching multiple workspaces and 114 | different `target` directory layouts. 115 | - The `working-directory` and `target-dir` input options were replaced by a 116 | single `workspaces` option that has the form of `$workspace -> $target`. 117 | - Support for considering `env-vars` as part of the cache key. 118 | - The `sharedKey` input option was renamed to `shared-key` for consistency. 119 | 120 | ## 1.4.0 121 | 122 | - Clean both `debug` and `release` target directories. 123 | 124 | ## 1.3.0 125 | 126 | - Use Rust toolchain file as additional cache key. 127 | - Allow for a configurable target-dir. 128 | 129 | ## 1.2.0 130 | 131 | - Cache `~/.cargo/bin`. 132 | - Support for custom `$CARGO_HOME`. 133 | - Add a `cache-hit` output. 134 | - Add a new `sharedKey` option that overrides the automatic job-name based key. 135 | 136 | ## 1.1.0 137 | 138 | - Add a new `working-directory` input. 139 | - Support caching git dependencies. 140 | - Lots of other improvements. 141 | 142 | ## 1.0.2 143 | 144 | - Don’t prune targets that have a different name from the crate, but do prune targets from the workspace. 145 | 146 | ## 1.0.1 147 | 148 | - Improved logging output. 149 | - Make sure to consider `all-features` dependencies when pruning. 150 | - Work around macOS cache corruption. 151 | - Remove git-db cache for now. 152 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rust Cache Action 2 | 3 | A GitHub Action that implements smart caching for rust/cargo projects with 4 | sensible defaults. 5 | 6 | ## Example usage 7 | 8 | ```yaml 9 | - uses: actions/checkout@v5 10 | 11 | # selecting a toolchain either by action or manual `rustup` calls should happen 12 | # before the plugin, as the cache uses the current rustc version as its cache key 13 | - run: rustup toolchain install stable --profile minimal 14 | 15 | - uses: Swatinem/rust-cache@v2 16 | with: 17 | # The prefix cache key, this can be changed to start a new cache manually. 18 | # default: "v0-rust" 19 | prefix-key: "" 20 | 21 | # A cache key that is used instead of the automatic `job`-based key, 22 | # and is stable over multiple jobs. 23 | # default: empty 24 | shared-key: "" 25 | 26 | # An additional cache key that is added alongside the automatic `job`-based 27 | # cache key and can be used to further differentiate jobs. 28 | # default: empty 29 | key: "" 30 | 31 | # If the automatic `job`-based cache key should include the job id. 32 | # default: "true" 33 | add-job-id-key: "" 34 | 35 | # Weather the a hash of the rust environment should be included in the cache key. 36 | # This includes a hash of all Cargo.toml/Cargo.lock files, rust-toolchain files, 37 | # and .cargo/config.toml files (if present), as well as the specified 'env-vars'. 38 | # default: "true" 39 | add-rust-environment-hash-key: "" 40 | 41 | # A whitespace separated list of env-var *prefixes* who's value contributes 42 | # to the environment cache key. 43 | # The env-vars are matched by *prefix*, so the default `RUST` var will 44 | # match all of `RUSTC`, `RUSTUP_*`, `RUSTFLAGS`, `RUSTDOC_*`, etc. 45 | # default: "CARGO CC CFLAGS CXX CMAKE RUST" 46 | env-vars: "" 47 | 48 | # The cargo workspaces and target directory configuration. 49 | # These entries are separated by newlines and have the form 50 | # `$workspace -> $target`. The `$target` part is treated as a directory 51 | # relative to the `$workspace` and defaults to "target" if not explicitly given. 52 | # default: ". -> target" 53 | workspaces: "" 54 | 55 | # Additional non workspace directories to be cached, separated by newlines. 56 | cache-directories: "" 57 | 58 | # Determines whether workspace `target` directories are cached. 59 | # If `false`, only the cargo registry will be cached. 60 | # default: "true" 61 | cache-targets: "" 62 | 63 | # Determines if the cache should be saved even when the workflow has failed. 64 | # default: "false" 65 | cache-on-failure: "" 66 | 67 | # Determines which crates are cached. 68 | # If `true` all crates will be cached, otherwise only dependent crates will be cached. 69 | # Useful if additional crates are used for CI tooling. 70 | # default: "false" 71 | cache-all-crates: "" 72 | 73 | # Similar to cache-all-crates. 74 | # If `true` the workspace crates will be cached. 75 | # Useful if the workspace contains libraries that are only updated sporadically. 76 | # default: "false" 77 | cache-workspace-crates: "" 78 | 79 | # Determines whether the cache should be saved. 80 | # If `false`, the cache is only restored. 81 | # Useful for jobs where the matrix is additive e.g. additional Cargo features, 82 | # or when only runs from `master` should be saved to the cache. 83 | # default: "true" 84 | save-if: "" 85 | # To only cache runs from `master`: 86 | save-if: ${{ github.ref == 'refs/heads/master' }} 87 | 88 | # Determines whether the cache should be restored. 89 | # If `true` the cache key will be checked and the `cache-hit` output will be set 90 | # but the cache itself won't be restored 91 | # default: "false" 92 | lookup-only: "" 93 | 94 | # Specifies what to use as the backend providing cache 95 | # Can be set to "github", "buildjet", or "warpbuild" 96 | # default: "github" 97 | cache-provider: "" 98 | 99 | # Determines whether to cache the ~/.cargo/bin directory. 100 | # default: "true" 101 | cache-bin: "" 102 | 103 | # A format string used to format commands to be run, i.e. `rustc` and `cargo`. 104 | # Must contain exactly one occurance of `{0}`, which is the formatting fragment 105 | # that will be replaced with the `rustc` or `cargo` command. This is necessary 106 | # when using Nix or other setup that requires running these commands within a 107 | # specific shell, otherwise the system `rustc` and `cargo` will be run. 108 | # default: "{0}" 109 | cmd-format: "" 110 | # To run within a Nix shell (using the default dev shell of a flake in the repo root): 111 | cmd-format: nix develop -c {0} 112 | ``` 113 | 114 | Further examples are available in the [.github/workflows](./.github/workflows/) directory. 115 | 116 | ## Outputs 117 | 118 | **`cache-hit`** 119 | 120 | This is a boolean flag that will be set to `true` when there was an exact cache hit. 121 | 122 | ## Cache Effectiveness 123 | 124 | This action only caches the _dependencies_ of a crate, so it is more effective if 125 | the dependency / own code ratio is higher. 126 | 127 | It is also more effective for repositories with a `Cargo.lock` file. Library 128 | repositories with only a `Cargo.toml` file have limited benefits, as cargo will 129 | _always_ use the most up-to-date dependency versions, which may not be cached. 130 | 131 | Usage with Stable Rust is the most effective, as a cache is tied to the Rust version. 132 | Using it with Nightly Rust is less effective as it will throw away the cache every day, 133 | unless a specific nightly build is being pinned. 134 | 135 | ## Cache Details 136 | 137 | This action currently caches the following files/directories: 138 | 139 | - `~/.cargo` (installed binaries, the cargo registry, cache, and git dependencies) 140 | - `./target` (build artifacts of dependencies) 141 | 142 | This cache is automatically keyed by: 143 | 144 | - the github [`job_id`](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_id) 145 | (if `add-job-id-key` is `"true"`), 146 | - the rustc release / host / hash (for all installed toolchains when 147 | available), 148 | - the following values, if `add-rust-environment-hash-key` is `"true"`: 149 | - the value of some compiler-specific environment variables (eg. RUSTFLAGS, etc), and 150 | - a hash of all `Cargo.lock` / `Cargo.toml` files found anywhere in the repository (if present). 151 | - a hash of all `rust-toolchain` / `rust-toolchain.toml` files in the root of the repository (if present). 152 | - a hash of all `.cargo/config.toml` files in the root of the repository (if present). 153 | 154 | An additional input `key` can be provided if the builtin keys are not sufficient. 155 | 156 | Before being persisted, the cache is cleaned of: 157 | 158 | - Any files in `~/.cargo/bin` that were present before the action ran (for example `rustc`). 159 | - Dependencies that are no longer used. 160 | - Anything that is not a dependency. 161 | - Incremental build artifacts. 162 | - Any build artifacts with an `mtime` older than one week. 163 | 164 | In particular, the workspace crates themselves are not cached since doing so is 165 | [generally not effective](https://github.com/Swatinem/rust-cache/issues/37#issuecomment-944697938). 166 | For this reason, this action automatically sets `CARGO_INCREMENTAL=0` to disable 167 | incremental compilation, so that the Rust compiler doesn't waste time creating 168 | the additional artifacts required for incremental builds. 169 | 170 | The `~/.cargo/registry/src` directory is not cached since it is quicker for Cargo 171 | to recreate it from the compressed crate archives in `~/.cargo/registry/cache`. 172 | 173 | The action will try to restore from a previous `Cargo.lock` version as well, so 174 | lockfile updates should only re-build changed dependencies. 175 | 176 | The action invokes `cargo metadata` to determine the current set of dependencies. 177 | 178 | Additionally, the action automatically works around 179 | [cargo#8603](https://github.com/rust-lang/cargo/issues/8603) / 180 | [actions/cache#403](https://github.com/actions/cache/issues/403) which would 181 | otherwise corrupt the cache on macOS builds. 182 | 183 | ## Cache Limits and Control 184 | 185 | This specialized cache action is built on top of the upstream cache action 186 | maintained by GitHub. The same restrictions and limits apply, which are 187 | documented here: 188 | [Caching dependencies to speed up workflows](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows) 189 | 190 | In particular, caches are currently limited to 10 GB in total and exceeding that 191 | limit will cause eviction of older caches. 192 | 193 | Caches from base branches are available to PRs, but not across unrelated 194 | branches. 195 | 196 | The caches can be controlled using the [Cache API](https://docs.github.com/en/rest/actions/cache) 197 | which allows listing existing caches and manually removing entries. 198 | 199 | ## Debugging 200 | 201 | The action prints detailed information about which information it considers 202 | for its cache key, and it outputs more debug-only information about which 203 | cleanup steps it performs before persisting the cache. 204 | 205 | You can read up on how to [enable debug logging](https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging) 206 | to see those details as well as further details related to caching operations. 207 | 208 | ## Known issues 209 | 210 | - The cache cleaning process currently removes all the files from `~/.cargo/bin` 211 | that were present before the action ran (for example `rustc`), by default. 212 | This can be an issue on long-running self-hosted runners, where such state 213 | is expected to be preserved across runs. You can work around this by setting 214 | `cache-bin: "false"`. 215 | -------------------------------------------------------------------------------- /src/cleanup.ts: -------------------------------------------------------------------------------- 1 | import * as core from "@actions/core"; 2 | import * as io from "@actions/io"; 3 | import fs from "fs"; 4 | import path from "path"; 5 | 6 | import { CARGO_HOME } from "./config"; 7 | import { exists } from "./utils"; 8 | import { Packages } from "./workspace"; 9 | 10 | export async function cleanTargetDir(targetDir: string, packages: Packages, checkTimestamp = false) { 11 | core.debug(`cleaning target directory "${targetDir}"`); 12 | 13 | // remove all *files* from the profile directory 14 | let dir = await fs.promises.opendir(targetDir); 15 | for await (const dirent of dir) { 16 | if (dirent.isDirectory()) { 17 | let dirName = path.join(dir.path, dirent.name); 18 | // is it a profile dir, or a nested target dir? 19 | let isNestedTarget = 20 | (await exists(path.join(dirName, "CACHEDIR.TAG"))) || (await exists(path.join(dirName, ".rustc_info.json"))); 21 | 22 | try { 23 | if (isNestedTarget) { 24 | await cleanTargetDir(dirName, packages, checkTimestamp); 25 | } else { 26 | await cleanProfileTarget(dirName, packages, checkTimestamp); 27 | } 28 | } catch {} 29 | } else if (dirent.name !== "CACHEDIR.TAG") { 30 | await rm(dir.path, dirent); 31 | } 32 | } 33 | } 34 | 35 | async function cleanProfileTarget(profileDir: string, packages: Packages, checkTimestamp = false) { 36 | core.debug(`cleaning profile directory "${profileDir}"`); 37 | 38 | // Quite a few testing utility crates store compilation artifacts as nested 39 | // workspaces under `target/tests`. Notably, `target/tests/target` and 40 | // `target/tests/trybuild`. 41 | if (path.basename(profileDir) === "tests") { 42 | try { 43 | // https://github.com/vertexclique/kaos/blob/9876f6c890339741cc5be4b7cb9df72baa5a6d79/src/cargo.rs#L25 44 | // https://github.com/eupn/macrotest/blob/c4151a5f9f545942f4971980b5d264ebcd0b1d11/src/cargo.rs#L27 45 | cleanTargetDir(path.join(profileDir, "target"), packages, checkTimestamp); 46 | } catch {} 47 | try { 48 | // https://github.com/dtolnay/trybuild/blob/eec8ca6cb9b8f53d0caf1aa499d99df52cae8b40/src/cargo.rs#L50 49 | cleanTargetDir(path.join(profileDir, "trybuild"), packages, checkTimestamp); 50 | } catch {} 51 | 52 | // Delete everything else. 53 | await rmExcept(profileDir, new Set(["target", "trybuild"]), checkTimestamp); 54 | 55 | return; 56 | } 57 | 58 | let keepProfile = new Set(["build", ".fingerprint", "deps"]); 59 | await rmExcept(profileDir, keepProfile); 60 | 61 | const keepPkg = new Set(packages.map((p) => p.name)); 62 | await rmExcept(path.join(profileDir, "build"), keepPkg, checkTimestamp); 63 | await rmExcept(path.join(profileDir, ".fingerprint"), keepPkg, checkTimestamp); 64 | 65 | const keepDeps = new Set( 66 | packages.flatMap((p) => { 67 | const names = []; 68 | for (const n of [p.name, ...p.targets]) { 69 | const name = n.replace(/-/g, "_"); 70 | names.push(name, `lib${name}`); 71 | } 72 | return names; 73 | }), 74 | ); 75 | await rmExcept(path.join(profileDir, "deps"), keepDeps, checkTimestamp); 76 | } 77 | 78 | export async function getCargoBins(): Promise> { 79 | const bins = new Set(); 80 | try { 81 | const { installs }: { installs: { [key: string]: { bins: Array } } } = JSON.parse( 82 | await fs.promises.readFile(path.join(CARGO_HOME, ".crates2.json"), "utf8"), 83 | ); 84 | for (const pkg of Object.values(installs)) { 85 | for (const bin of pkg.bins) { 86 | bins.add(bin); 87 | } 88 | } 89 | } catch {} 90 | return bins; 91 | } 92 | 93 | /** 94 | * Clean the cargo bin directory, removing the binaries that existed 95 | * when the action started, as they were not created by the build. 96 | * 97 | * @param oldBins The binaries that existed when the action started. 98 | */ 99 | export async function cleanBin(oldBins: Array) { 100 | const bins = await getCargoBins(); 101 | 102 | for (const bin of oldBins) { 103 | bins.delete(bin); 104 | } 105 | 106 | const dir = await fs.promises.opendir(path.join(CARGO_HOME, "bin")); 107 | for await (const dirent of dir) { 108 | if (dirent.isFile() && !bins.has(dirent.name)) { 109 | await rm(dir.path, dirent); 110 | } 111 | } 112 | } 113 | 114 | export async function cleanRegistry(packages: Packages, crates = true) { 115 | // remove `.cargo/credentials.toml` 116 | try { 117 | const credentials = path.join(CARGO_HOME, ".cargo", "credentials.toml"); 118 | core.debug(`deleting "${credentials}"`); 119 | await fs.promises.unlink(credentials); 120 | } catch {} 121 | 122 | // `.cargo/registry/index` 123 | let pkgSet = new Set(packages.map((p) => p.name)); 124 | const indexDir = await fs.promises.opendir(path.join(CARGO_HOME, "registry", "index")); 125 | for await (const dirent of indexDir) { 126 | if (dirent.isDirectory()) { 127 | // eg `.cargo/registry/index/github.com-1ecc6299db9ec823` 128 | // or `.cargo/registry/index/index.crates.io-e139d0d48fed7772` 129 | const dirPath = path.join(indexDir.path, dirent.name); 130 | 131 | // for a git registry, we can remove `.cache`, as cargo will recreate it from git 132 | if (await exists(path.join(dirPath, ".git"))) { 133 | await rmRF(path.join(dirPath, ".cache")); 134 | } else { 135 | await cleanRegistryIndexCache(dirPath, pkgSet); 136 | } 137 | } 138 | } 139 | 140 | if (!crates) { 141 | core.debug("skipping registry cache and src cleanup"); 142 | return; 143 | } 144 | 145 | // `.cargo/registry/src` 146 | // Cargo usually re-creates these from the `.crate` cache below, 147 | // but for some reason that does not work for `-sys` crates that check timestamps 148 | // to decide if rebuilds are necessary. 149 | pkgSet = new Set(packages.filter((p) => p.name.endsWith("-sys")).map((p) => `${p.name}-${p.version}`)); 150 | const srcDir = await fs.promises.opendir(path.join(CARGO_HOME, "registry", "src")); 151 | for await (const dirent of srcDir) { 152 | if (dirent.isDirectory()) { 153 | // eg `.cargo/registry/src/github.com-1ecc6299db9ec823` 154 | // or `.cargo/registry/src/index.crates.io-e139d0d48fed7772` 155 | const dir = await fs.promises.opendir(path.join(srcDir.path, dirent.name)); 156 | for await (const dirent of dir) { 157 | if (dirent.isDirectory() && !pkgSet.has(dirent.name)) { 158 | await rmRF(path.join(dir.path, dirent.name)); 159 | } 160 | } 161 | } 162 | } 163 | 164 | // `.cargo/registry/cache` 165 | pkgSet = new Set(packages.map((p) => `${p.name}-${p.version}.crate`)); 166 | const cacheDir = await fs.promises.opendir(path.join(CARGO_HOME, "registry", "cache")); 167 | for await (const dirent of cacheDir) { 168 | if (dirent.isDirectory()) { 169 | // eg `.cargo/registry/cache/github.com-1ecc6299db9ec823` 170 | // or `.cargo/registry/cache/index.crates.io-e139d0d48fed7772` 171 | const dir = await fs.promises.opendir(path.join(cacheDir.path, dirent.name)); 172 | for await (const dirent of dir) { 173 | // here we check that the downloaded `.crate` matches one from our dependencies 174 | if (dirent.isFile() && !pkgSet.has(dirent.name)) { 175 | await rm(dir.path, dirent); 176 | } 177 | } 178 | } 179 | } 180 | } 181 | 182 | /// Recursively walks and cleans the index `.cache` 183 | async function cleanRegistryIndexCache(dirName: string, keepPkg: Set) { 184 | let dirIsEmpty = true; 185 | const cacheDir = await fs.promises.opendir(dirName); 186 | for await (const dirent of cacheDir) { 187 | if (dirent.isDirectory()) { 188 | if (await cleanRegistryIndexCache(path.join(dirName, dirent.name), keepPkg)) { 189 | await rm(dirName, dirent); 190 | } else { 191 | dirIsEmpty &&= false; 192 | } 193 | } else { 194 | if (keepPkg.has(dirent.name)) { 195 | dirIsEmpty &&= false; 196 | } else { 197 | await rm(dirName, dirent); 198 | } 199 | } 200 | } 201 | return dirIsEmpty; 202 | } 203 | 204 | export async function cleanGit(packages: Packages) { 205 | const coPath = path.join(CARGO_HOME, "git", "checkouts"); 206 | const dbPath = path.join(CARGO_HOME, "git", "db"); 207 | const repos = new Map>(); 208 | for (const p of packages) { 209 | if (!p.path.startsWith(coPath)) { 210 | continue; 211 | } 212 | const [repo, ref] = p.path.slice(coPath.length + 1).split(path.sep); 213 | const refs = repos.get(repo); 214 | if (refs) { 215 | refs.add(ref); 216 | } else { 217 | repos.set(repo, new Set([ref])); 218 | } 219 | } 220 | 221 | // we have to keep both the clone, and the checkout, removing either will 222 | // trigger a rebuild 223 | 224 | // clean the db 225 | try { 226 | let dir = await fs.promises.opendir(dbPath); 227 | for await (const dirent of dir) { 228 | if (!repos.has(dirent.name)) { 229 | await rm(dir.path, dirent); 230 | } 231 | } 232 | } catch {} 233 | 234 | // clean the checkouts 235 | try { 236 | let dir = await fs.promises.opendir(coPath); 237 | for await (const dirent of dir) { 238 | const refs = repos.get(dirent.name); 239 | if (!refs) { 240 | await rm(dir.path, dirent); 241 | continue; 242 | } 243 | if (!dirent.isDirectory()) { 244 | continue; 245 | } 246 | const refsDir = await fs.promises.opendir(path.join(dir.path, dirent.name)); 247 | for await (const dirent of refsDir) { 248 | if (!refs.has(dirent.name)) { 249 | await rm(refsDir.path, dirent); 250 | } 251 | } 252 | } 253 | } catch {} 254 | } 255 | 256 | const ONE_WEEK = 7 * 24 * 3600 * 1000; 257 | 258 | /** 259 | * Removes all files or directories in `dirName` matching some criteria. 260 | * 261 | * When the `checkTimestamp` flag is set, this will also remove anything older 262 | * than one week. 263 | * 264 | * Otherwise, it will remove everything that does not match any string in the 265 | * `keepPrefix` set. 266 | * The matching strips and trailing `-$hash` suffix. 267 | */ 268 | async function rmExcept(dirName: string, keepPrefix: Set, checkTimestamp = false) { 269 | const dir = await fs.promises.opendir(dirName); 270 | for await (const dirent of dir) { 271 | if (checkTimestamp) { 272 | const fileName = path.join(dir.path, dirent.name); 273 | const { mtime } = await fs.promises.stat(fileName); 274 | const isOutdated = Date.now() - mtime.getTime() > ONE_WEEK; 275 | 276 | if (isOutdated) { 277 | await rm(dir.path, dirent); 278 | } 279 | return; 280 | } 281 | 282 | let name = dirent.name; 283 | 284 | // strip the trailing hash 285 | const idx = name.lastIndexOf("-"); 286 | if (idx !== -1) { 287 | name = name.slice(0, idx); 288 | } 289 | 290 | if (!keepPrefix.has(name)) { 291 | await rm(dir.path, dirent); 292 | } 293 | } 294 | } 295 | 296 | async function rm(parent: string, dirent: fs.Dirent) { 297 | try { 298 | const fileName = path.join(parent, dirent.name); 299 | core.debug(`deleting "${fileName}"`); 300 | if (dirent.isFile()) { 301 | await fs.promises.unlink(fileName); 302 | } else if (dirent.isDirectory()) { 303 | await io.rmRF(fileName); 304 | } 305 | } catch {} 306 | } 307 | 308 | async function rmRF(dirName: string) { 309 | core.debug(`deleting "${dirName}"`); 310 | await io.rmRF(dirName); 311 | } 312 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import * as core from "@actions/core"; 2 | import * as glob from "@actions/glob"; 3 | import crypto from "crypto"; 4 | import fs from "fs/promises"; 5 | import { createReadStream } from "fs"; 6 | import { pipeline } from "stream/promises"; 7 | import os from "os"; 8 | import path from "path"; 9 | import * as toml from "smol-toml"; 10 | 11 | import { getCargoBins } from "./cleanup"; 12 | import { CacheProvider, exists, getCmdOutput } from "./utils"; 13 | import { Workspace } from "./workspace"; 14 | 15 | const HOME = os.homedir(); 16 | export const CARGO_HOME = process.env.CARGO_HOME || path.join(HOME, ".cargo"); 17 | 18 | const STATE_CONFIG = "RUST_CACHE_CONFIG"; 19 | const HASH_LENGTH = 8; 20 | 21 | export class CacheConfig { 22 | /** A format string for running commands */ 23 | public cmdFormat: string = ""; 24 | 25 | /** All the paths we want to cache */ 26 | public cachePaths: Array = []; 27 | /** The primary cache key */ 28 | public cacheKey = ""; 29 | /** The secondary (restore) key that only contains the prefix and environment */ 30 | public restoreKey = ""; 31 | 32 | /** Whether to cache CARGO_HOME/.bin */ 33 | public cacheBin: boolean = true; 34 | 35 | /** The workspace configurations */ 36 | public workspaces: Array = []; 37 | 38 | /** The cargo binaries present during main step */ 39 | public cargoBins: Array = []; 40 | 41 | /** The prefix portion of the cache key */ 42 | private keyPrefix = ""; 43 | /** The rust version considered for the cache key */ 44 | private keyRust: Array = []; 45 | /** The environment variables considered for the cache key */ 46 | private keyEnvs: Array = []; 47 | /** The files considered for the cache key */ 48 | private keyFiles: Array = []; 49 | 50 | private constructor() {} 51 | 52 | /** 53 | * Constructs a [`CacheConfig`] with all the paths and keys. 54 | * 55 | * This will read the action `input`s, and read and persist `state` as necessary. 56 | */ 57 | static async new(): Promise { 58 | const self = new CacheConfig(); 59 | 60 | let cmdFormat = core.getInput("cmd-format"); 61 | if (cmdFormat) { 62 | const placeholderMatches = cmdFormat.match(/\{0\}/g); 63 | if (!placeholderMatches || placeholderMatches.length !== 1) { 64 | cmdFormat = "{0}"; 65 | } 66 | } else { 67 | cmdFormat = "{0}"; 68 | } 69 | self.cmdFormat = cmdFormat; 70 | 71 | // Construct key prefix: 72 | // This uses either the `shared-key` input, 73 | // or the `key` input combined with the `job` key. 74 | 75 | let key = core.getInput("prefix-key") || "v0-rust"; 76 | 77 | const sharedKey = core.getInput("shared-key"); 78 | if (sharedKey) { 79 | key += `-${sharedKey}`; 80 | } else { 81 | const inputKey = core.getInput("key"); 82 | if (inputKey) { 83 | key += `-${inputKey}`; 84 | } 85 | 86 | const job = process.env.GITHUB_JOB; 87 | if ((job) && core.getInput("add-job-id-key").toLowerCase() == "true") { 88 | key += `-${job}`; 89 | } 90 | } 91 | 92 | // Add runner OS and CPU architecture to the key to avoid cross-contamination of cache 93 | const runnerOS = os.type(); 94 | const runnerArch = os.arch(); 95 | key += `-${runnerOS}-${runnerArch}`; 96 | 97 | self.keyPrefix = key; 98 | 99 | // Construct environment portion of the key: 100 | // This consists of a hash that considers the rust version 101 | // as well as all the environment variables as given by a default list 102 | // and the `env-vars` input. 103 | // The env vars are sorted, matched by prefix and hashed into the 104 | // resulting environment hash. 105 | 106 | let hasher = crypto.createHash("sha1"); 107 | const rustVersions = Array.from(await getRustVersions(cmdFormat)); 108 | // Doesn't matter how they're sorted, just as long as it's deterministic. 109 | rustVersions.sort(); 110 | 111 | for (const rustVersion of rustVersions) { 112 | const { release, host, "commit-hash": commitHash } = rustVersion; 113 | const keyRust = `${release} ${host} ${commitHash}`; 114 | hasher.update(keyRust); 115 | self.keyRust.push(keyRust); 116 | } 117 | 118 | // these prefixes should cover most of the compiler / rust / cargo keys 119 | const envPrefixes = ["CARGO", "CC", "CFLAGS", "CXX", "CMAKE", "RUST"]; 120 | envPrefixes.push(...core.getInput("env-vars").split(/\s+/).filter(Boolean)); 121 | 122 | // sort the available env vars so we have a more stable hash 123 | const keyEnvs = []; 124 | const envKeys = Object.keys(process.env); 125 | envKeys.sort((a, b) => a.localeCompare(b)); 126 | for (const key of envKeys) { 127 | const value = process.env[key]; 128 | if (envPrefixes.some((prefix) => key.startsWith(prefix)) && value) { 129 | hasher.update(`${key}=${value}`); 130 | keyEnvs.push(key); 131 | } 132 | } 133 | 134 | self.keyEnvs = keyEnvs; 135 | 136 | // Add job hash suffix if 'add-rust-environment-hash-key' is true 137 | if (core.getInput("add-rust-environment-hash-key").toLowerCase() == "true") { 138 | key += `-${digest(hasher)}`; 139 | } 140 | 141 | self.restoreKey = key; 142 | 143 | // Construct the lockfiles portion of the key: 144 | // This considers all the files found via globbing for various manifests 145 | // and lockfiles. 146 | 147 | self.cacheBin = core.getInput("cache-bin").toLowerCase() == "true"; 148 | 149 | // Constructs the workspace config and paths to restore: 150 | // The workspaces are given using a `$workspace -> $target` syntax. 151 | 152 | const workspaces: Array = []; 153 | const workspacesInput = core.getInput("workspaces") || "."; 154 | for (const workspace of workspacesInput.trim().split("\n")) { 155 | let [root, target = "target"] = workspace.split("->").map((s) => s.trim()); 156 | root = path.resolve(root); 157 | target = path.join(root, target); 158 | workspaces.push(new Workspace(root, target)); 159 | } 160 | self.workspaces = workspaces; 161 | 162 | // Add hash suffix of all rust environment lockfiles + manifests if 163 | // 'add-rust-environment-hash-key' is true 164 | if (core.getInput("add-rust-environment-hash-key").toLowerCase() == "true") { 165 | let keyFiles = await globFiles(".cargo/config.toml\nrust-toolchain\nrust-toolchain.toml"); 166 | const parsedKeyFiles = []; // keyFiles that are parsed, pre-processed and hashed 167 | 168 | hasher = crypto.createHash("sha1"); 169 | 170 | for (const workspace of workspaces) { 171 | const root = workspace.root; 172 | keyFiles.push( 173 | ...(await globFiles( 174 | `${root}/**/.cargo/config.toml\n${root}/**/rust-toolchain\n${root}/**/rust-toolchain.toml`, 175 | )), 176 | ); 177 | 178 | const workspaceMembers = await workspace.getWorkspaceMembers(cmdFormat); 179 | 180 | const cargo_manifests = sort_and_uniq(workspaceMembers.map((member) => path.join(member.path, "Cargo.toml"))); 181 | 182 | for (const cargo_manifest of cargo_manifests) { 183 | try { 184 | const content = await fs.readFile(cargo_manifest, { encoding: "utf8" }); 185 | // Use any since TomlPrimitive is not exposed 186 | const parsed = toml.parse(content) as { [key: string]: any }; 187 | 188 | if ("package" in parsed) { 189 | const pack = parsed.package; 190 | if ("version" in pack) { 191 | pack["version"] = "0.0.0"; 192 | } 193 | } 194 | 195 | for (const prefix of ["", "build-", "dev-"]) { 196 | const section_name = `${prefix}dependencies`; 197 | if (!(section_name in parsed)) { 198 | continue; 199 | } 200 | const deps = parsed[section_name]; 201 | 202 | for (const key of Object.keys(deps)) { 203 | const dep = deps[key]; 204 | 205 | try { 206 | if ("path" in dep) { 207 | dep.version = "0.0.0"; 208 | dep.path = ""; 209 | } 210 | } catch (_e) { 211 | // Not an object, probably a string (version), 212 | // continue. 213 | continue; 214 | } 215 | } 216 | } 217 | 218 | hasher.update(JSON.stringify(parsed)); 219 | 220 | parsedKeyFiles.push(cargo_manifest); 221 | } catch (e) { 222 | // Fallback to caching them as regular file 223 | core.warning(`Error parsing Cargo.toml manifest, fallback to caching entire file: ${e}`); 224 | keyFiles.push(cargo_manifest); 225 | } 226 | } 227 | 228 | const cargo_lock = path.join(workspace.root, "Cargo.lock"); 229 | if (await exists(cargo_lock)) { 230 | try { 231 | const content = await fs.readFile(cargo_lock, { encoding: "utf8" }); 232 | const parsed = toml.parse(content); 233 | 234 | if ((parsed.version !== 3 && parsed.version !== 4) || !("package" in parsed)) { 235 | // Fallback to caching them as regular file since this action 236 | // can only handle Cargo.lock format version 3 237 | core.warning("Unsupported Cargo.lock format, fallback to caching entire file"); 238 | keyFiles.push(cargo_lock); 239 | continue; 240 | } 241 | 242 | // Package without `[[package]].source` and `[[package]].checksum` 243 | // are the one with `path = "..."` to crates within the workspace. 244 | const packages = (parsed.package as any[]).filter((p: any) => "source" in p || "checksum" in p); 245 | 246 | hasher.update(JSON.stringify(packages)); 247 | 248 | parsedKeyFiles.push(cargo_lock); 249 | } catch (e) { 250 | // Fallback to caching them as regular file 251 | core.warning(`Error parsing Cargo.lock manifest, fallback to caching entire file: ${e}`); 252 | keyFiles.push(cargo_lock); 253 | } 254 | } 255 | } 256 | keyFiles = sort_and_uniq(keyFiles); 257 | 258 | for (const file of keyFiles) { 259 | await pipeline(createReadStream(file), hasher); 260 | } 261 | 262 | keyFiles.push(...parsedKeyFiles); 263 | self.keyFiles = sort_and_uniq(keyFiles); 264 | 265 | let lockHash = digest(hasher); 266 | key += `-${lockHash}`; 267 | } 268 | 269 | self.cacheKey = key; 270 | 271 | self.cachePaths = [path.join(CARGO_HOME, "registry"), path.join(CARGO_HOME, "git")]; 272 | if (self.cacheBin) { 273 | self.cachePaths = [ 274 | path.join(CARGO_HOME, "bin"), 275 | path.join(CARGO_HOME, ".crates.toml"), 276 | path.join(CARGO_HOME, ".crates2.json"), 277 | ...self.cachePaths, 278 | ]; 279 | } 280 | const cacheTargets = core.getInput("cache-targets").toLowerCase() || "true"; 281 | if (cacheTargets === "true") { 282 | self.cachePaths.push(...workspaces.map((ws) => ws.target)); 283 | } 284 | 285 | const cacheDirectories = core.getInput("cache-directories"); 286 | for (const dir of cacheDirectories.trim().split(/\s+/).filter(Boolean)) { 287 | self.cachePaths.push(dir); 288 | } 289 | 290 | const bins = await getCargoBins(); 291 | self.cargoBins = Array.from(bins.values()); 292 | 293 | return self; 294 | } 295 | 296 | /** 297 | * Reads and returns the cache config from the action `state`. 298 | * 299 | * @throws {Error} if the state is not present. 300 | * @returns {CacheConfig} the configuration. 301 | * @see {@link CacheConfig#saveState} 302 | * @see {@link CacheConfig#new} 303 | */ 304 | static fromState(): CacheConfig { 305 | const source = core.getState(STATE_CONFIG); 306 | if (!source) { 307 | throw new Error("Cache configuration not found in state"); 308 | } 309 | 310 | const self = new CacheConfig(); 311 | Object.assign(self, JSON.parse(source)); 312 | self.workspaces = self.workspaces.map((w: any) => new Workspace(w.root, w.target)); 313 | 314 | return self; 315 | } 316 | 317 | /** 318 | * Prints the configuration to the action log. 319 | */ 320 | printInfo(cacheProvider: CacheProvider) { 321 | core.startGroup("Cache Configuration"); 322 | core.info(`Cache Provider:`); 323 | core.info(` ${cacheProvider.name}`); 324 | core.info(`Workspaces:`); 325 | for (const workspace of this.workspaces) { 326 | core.info(` ${workspace.root}`); 327 | } 328 | core.info(`Cache Paths:`); 329 | for (const path of this.cachePaths) { 330 | core.info(` ${path}`); 331 | } 332 | core.info(`Restore Key:`); 333 | core.info(` ${this.restoreKey}`); 334 | core.info(`Cache Key:`); 335 | core.info(` ${this.cacheKey}`); 336 | core.info(`.. Prefix:`); 337 | core.info(` - ${this.keyPrefix}`); 338 | core.info(`.. Environment considered:`); 339 | core.info(` - Rust Versions:`); 340 | for (const rust of this.keyRust) { 341 | core.info(` - ${rust}`); 342 | } 343 | for (const env of this.keyEnvs) { 344 | core.info(` - ${env}`); 345 | } 346 | core.info(`.. Lockfiles considered:`); 347 | for (const file of this.keyFiles) { 348 | core.info(` - ${file}`); 349 | } 350 | core.endGroup(); 351 | } 352 | 353 | /** 354 | * Saves the configuration to the state store. 355 | * This is used to restore the configuration in the post action. 356 | */ 357 | saveState() { 358 | core.saveState(STATE_CONFIG, this); 359 | } 360 | } 361 | 362 | /** 363 | * Checks if the cache is up to date. 364 | * 365 | * @returns `true` if the cache is up to date, `false` otherwise. 366 | */ 367 | export function isCacheUpToDate(): boolean { 368 | return core.getState(STATE_CONFIG) === ""; 369 | } 370 | 371 | /** 372 | * Returns a hex digest of the given hasher truncated to `HASH_LENGTH`. 373 | * 374 | * @param hasher The hasher to digest. 375 | * @returns The hex digest. 376 | */ 377 | function digest(hasher: crypto.Hash): string { 378 | return hasher.digest("hex").substring(0, HASH_LENGTH); 379 | } 380 | 381 | interface RustVersion { 382 | host: string; 383 | release: string; 384 | "commit-hash": string; 385 | } 386 | 387 | async function getRustVersions(cmdFormat: string): Promise> { 388 | const versions = new Set(); 389 | 390 | versions.add(parseRustVersion(await getCmdOutput(cmdFormat, "rustc -vV"))); 391 | 392 | const stdout = await (async () => { 393 | try { 394 | return await getCmdOutput(cmdFormat, "rustup toolchain list --quiet"); 395 | } catch (e) { 396 | core.warning(`Error running rustup toolchain list, falling back to default toolchain only: ${e}`); 397 | return undefined; 398 | } 399 | })(); 400 | if (stdout !== undefined) { 401 | for (const toolchain of stdout.split(/[\n\r]+/)) { 402 | const trimmed = toolchain.trim(); 403 | if (!trimmed) { 404 | continue; 405 | } 406 | versions.add(parseRustVersion(await getCmdOutput(cmdFormat, `rustup run ${toolchain} rustc -vV`))); 407 | } 408 | } 409 | return versions; 410 | } 411 | 412 | function parseRustVersion(stdout: string): RustVersion { 413 | const splits = stdout 414 | .split(/[\n\r]+/) 415 | .filter(Boolean) 416 | .map((s) => s.split(":").map((s) => s.trim())) 417 | .filter((s) => s.length === 2); 418 | return Object.fromEntries(splits); 419 | } 420 | 421 | async function globFiles(pattern: string): Promise { 422 | const globber = await glob.create(pattern, { 423 | followSymbolicLinks: false, 424 | }); 425 | // fs.stat resolve the symbolic link and returns stat for the 426 | // file it pointed to, so isFile would make sure the resolved 427 | // file is actually a regular file. 428 | const files = []; 429 | for (const file of await globber.glob()) { 430 | const stats = await fs.stat(file); 431 | if (stats.isFile()) { 432 | files.push(file); 433 | } 434 | } 435 | return files; 436 | } 437 | 438 | function sort_and_uniq(a: string[]) { 439 | return a 440 | .sort((a, b) => a.localeCompare(b)) 441 | .reduce((accumulator: string[], currentValue: string) => { 442 | const len = accumulator.length; 443 | // If accumulator is empty or its last element != currentValue 444 | // Since array is already sorted, elements with the same value 445 | // are grouped together to be continugous in space. 446 | // 447 | // If currentValue != last element, then it must be unique. 448 | if (len == 0 || accumulator[len - 1].localeCompare(currentValue) != 0) { 449 | accumulator.push(currentValue); 450 | } 451 | return accumulator; 452 | }, []); 453 | } 454 | -------------------------------------------------------------------------------- /tests/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "allocator-api2" 22 | version = "0.2.21" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 25 | 26 | [[package]] 27 | name = "atomic-waker" 28 | version = "1.1.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 31 | 32 | [[package]] 33 | name = "backtrace" 34 | version = "0.3.75" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 37 | dependencies = [ 38 | "addr2line", 39 | "cfg-if", 40 | "libc", 41 | "miniz_oxide", 42 | "object", 43 | "rustc-demangle", 44 | "windows-targets 0.52.6", 45 | ] 46 | 47 | [[package]] 48 | name = "base64" 49 | version = "0.22.1" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 52 | 53 | [[package]] 54 | name = "bitflags" 55 | version = "2.9.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 58 | 59 | [[package]] 60 | name = "bumpalo" 61 | version = "3.19.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 64 | 65 | [[package]] 66 | name = "bytes" 67 | version = "1.10.1" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 70 | 71 | [[package]] 72 | name = "cc" 73 | version = "1.2.32" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" 76 | dependencies = [ 77 | "shlex", 78 | ] 79 | 80 | [[package]] 81 | name = "cfg-if" 82 | version = "1.0.1" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 85 | 86 | [[package]] 87 | name = "core-foundation" 88 | version = "0.9.4" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 91 | dependencies = [ 92 | "core-foundation-sys", 93 | "libc", 94 | ] 95 | 96 | [[package]] 97 | name = "core-foundation-sys" 98 | version = "0.8.7" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 101 | 102 | [[package]] 103 | name = "displaydoc" 104 | version = "0.2.5" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 107 | dependencies = [ 108 | "proc-macro2", 109 | "quote", 110 | "syn", 111 | ] 112 | 113 | [[package]] 114 | name = "encoding_rs" 115 | version = "0.8.35" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 118 | dependencies = [ 119 | "cfg-if", 120 | ] 121 | 122 | [[package]] 123 | name = "equivalent" 124 | version = "1.0.2" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 127 | 128 | [[package]] 129 | name = "errno" 130 | version = "0.3.13" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 133 | dependencies = [ 134 | "libc", 135 | "windows-sys 0.60.2", 136 | ] 137 | 138 | [[package]] 139 | name = "fastrand" 140 | version = "2.3.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 143 | 144 | [[package]] 145 | name = "fnv" 146 | version = "1.0.7" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 149 | 150 | [[package]] 151 | name = "foldhash" 152 | version = "0.1.5" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 155 | 156 | [[package]] 157 | name = "foreign-types" 158 | version = "0.3.2" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 161 | dependencies = [ 162 | "foreign-types-shared", 163 | ] 164 | 165 | [[package]] 166 | name = "foreign-types-shared" 167 | version = "0.1.1" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 170 | 171 | [[package]] 172 | name = "form_urlencoded" 173 | version = "1.2.1" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 176 | dependencies = [ 177 | "percent-encoding", 178 | ] 179 | 180 | [[package]] 181 | name = "futures-channel" 182 | version = "0.3.31" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 185 | dependencies = [ 186 | "futures-core", 187 | ] 188 | 189 | [[package]] 190 | name = "futures-core" 191 | version = "0.3.31" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 194 | 195 | [[package]] 196 | name = "futures-sink" 197 | version = "0.3.31" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 200 | 201 | [[package]] 202 | name = "futures-task" 203 | version = "0.3.31" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 206 | 207 | [[package]] 208 | name = "futures-util" 209 | version = "0.3.31" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 212 | dependencies = [ 213 | "futures-core", 214 | "futures-task", 215 | "pin-project-lite", 216 | "pin-utils", 217 | ] 218 | 219 | [[package]] 220 | name = "getrandom" 221 | version = "0.2.16" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 224 | dependencies = [ 225 | "cfg-if", 226 | "libc", 227 | "wasi 0.11.1+wasi-snapshot-preview1", 228 | ] 229 | 230 | [[package]] 231 | name = "getrandom" 232 | version = "0.3.3" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 235 | dependencies = [ 236 | "cfg-if", 237 | "libc", 238 | "r-efi", 239 | "wasi 0.14.2+wasi-0.2.4", 240 | ] 241 | 242 | [[package]] 243 | name = "gimli" 244 | version = "0.31.1" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 247 | 248 | [[package]] 249 | name = "glob" 250 | version = "0.3.3" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 253 | 254 | [[package]] 255 | name = "h2" 256 | version = "0.4.12" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 259 | dependencies = [ 260 | "atomic-waker", 261 | "bytes", 262 | "fnv", 263 | "futures-core", 264 | "futures-sink", 265 | "http", 266 | "indexmap", 267 | "slab", 268 | "tokio", 269 | "tokio-util", 270 | "tracing", 271 | ] 272 | 273 | [[package]] 274 | name = "hashbrown" 275 | version = "0.15.5" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 278 | dependencies = [ 279 | "allocator-api2", 280 | "equivalent", 281 | "foldhash", 282 | ] 283 | 284 | [[package]] 285 | name = "http" 286 | version = "1.3.1" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 289 | dependencies = [ 290 | "bytes", 291 | "fnv", 292 | "itoa", 293 | ] 294 | 295 | [[package]] 296 | name = "http-body" 297 | version = "1.0.1" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 300 | dependencies = [ 301 | "bytes", 302 | "http", 303 | ] 304 | 305 | [[package]] 306 | name = "http-body-util" 307 | version = "0.1.3" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 310 | dependencies = [ 311 | "bytes", 312 | "futures-core", 313 | "http", 314 | "http-body", 315 | "pin-project-lite", 316 | ] 317 | 318 | [[package]] 319 | name = "httparse" 320 | version = "1.10.1" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 323 | 324 | [[package]] 325 | name = "hyper" 326 | version = "1.6.0" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 329 | dependencies = [ 330 | "bytes", 331 | "futures-channel", 332 | "futures-util", 333 | "h2", 334 | "http", 335 | "http-body", 336 | "httparse", 337 | "itoa", 338 | "pin-project-lite", 339 | "smallvec", 340 | "tokio", 341 | "want", 342 | ] 343 | 344 | [[package]] 345 | name = "hyper-rustls" 346 | version = "0.27.7" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 349 | dependencies = [ 350 | "http", 351 | "hyper", 352 | "hyper-util", 353 | "rustls", 354 | "rustls-pki-types", 355 | "tokio", 356 | "tokio-rustls", 357 | "tower-service", 358 | ] 359 | 360 | [[package]] 361 | name = "hyper-tls" 362 | version = "0.6.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 365 | dependencies = [ 366 | "bytes", 367 | "http-body-util", 368 | "hyper", 369 | "hyper-util", 370 | "native-tls", 371 | "tokio", 372 | "tokio-native-tls", 373 | "tower-service", 374 | ] 375 | 376 | [[package]] 377 | name = "hyper-util" 378 | version = "0.1.16" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 381 | dependencies = [ 382 | "base64", 383 | "bytes", 384 | "futures-channel", 385 | "futures-core", 386 | "futures-util", 387 | "http", 388 | "http-body", 389 | "hyper", 390 | "ipnet", 391 | "libc", 392 | "percent-encoding", 393 | "pin-project-lite", 394 | "socket2", 395 | "system-configuration", 396 | "tokio", 397 | "tower-service", 398 | "tracing", 399 | "windows-registry", 400 | ] 401 | 402 | [[package]] 403 | name = "icu_collections" 404 | version = "2.0.0" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 407 | dependencies = [ 408 | "displaydoc", 409 | "potential_utf", 410 | "yoke", 411 | "zerofrom", 412 | "zerovec", 413 | ] 414 | 415 | [[package]] 416 | name = "icu_locale_core" 417 | version = "2.0.0" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 420 | dependencies = [ 421 | "displaydoc", 422 | "litemap", 423 | "tinystr", 424 | "writeable", 425 | "zerovec", 426 | ] 427 | 428 | [[package]] 429 | name = "icu_normalizer" 430 | version = "2.0.0" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 433 | dependencies = [ 434 | "displaydoc", 435 | "icu_collections", 436 | "icu_normalizer_data", 437 | "icu_properties", 438 | "icu_provider", 439 | "smallvec", 440 | "zerovec", 441 | ] 442 | 443 | [[package]] 444 | name = "icu_normalizer_data" 445 | version = "2.0.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 448 | 449 | [[package]] 450 | name = "icu_properties" 451 | version = "2.0.1" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 454 | dependencies = [ 455 | "displaydoc", 456 | "icu_collections", 457 | "icu_locale_core", 458 | "icu_properties_data", 459 | "icu_provider", 460 | "potential_utf", 461 | "zerotrie", 462 | "zerovec", 463 | ] 464 | 465 | [[package]] 466 | name = "icu_properties_data" 467 | version = "2.0.1" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 470 | 471 | [[package]] 472 | name = "icu_provider" 473 | version = "2.0.0" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 476 | dependencies = [ 477 | "displaydoc", 478 | "icu_locale_core", 479 | "stable_deref_trait", 480 | "tinystr", 481 | "writeable", 482 | "yoke", 483 | "zerofrom", 484 | "zerotrie", 485 | "zerovec", 486 | ] 487 | 488 | [[package]] 489 | name = "idna" 490 | version = "1.0.3" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 493 | dependencies = [ 494 | "idna_adapter", 495 | "smallvec", 496 | "utf8_iter", 497 | ] 498 | 499 | [[package]] 500 | name = "idna_adapter" 501 | version = "1.2.1" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 504 | dependencies = [ 505 | "icu_normalizer", 506 | "icu_properties", 507 | ] 508 | 509 | [[package]] 510 | name = "indexmap" 511 | version = "2.10.0" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 514 | dependencies = [ 515 | "equivalent", 516 | "hashbrown", 517 | ] 518 | 519 | [[package]] 520 | name = "io-uring" 521 | version = "0.7.9" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 524 | dependencies = [ 525 | "bitflags", 526 | "cfg-if", 527 | "libc", 528 | ] 529 | 530 | [[package]] 531 | name = "ipnet" 532 | version = "2.11.0" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 535 | 536 | [[package]] 537 | name = "iri-string" 538 | version = "0.7.8" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 541 | dependencies = [ 542 | "memchr", 543 | "serde", 544 | ] 545 | 546 | [[package]] 547 | name = "itoa" 548 | version = "1.0.15" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 551 | 552 | [[package]] 553 | name = "js-sys" 554 | version = "0.3.77" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 557 | dependencies = [ 558 | "once_cell", 559 | "wasm-bindgen", 560 | ] 561 | 562 | [[package]] 563 | name = "jsonpath_lib_polars_vendor" 564 | version = "0.0.1" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "f4bd9354947622f7471ff713eacaabdb683ccb13bba4edccaab9860abf480b7d" 567 | dependencies = [ 568 | "log", 569 | "serde", 570 | "serde_json", 571 | ] 572 | 573 | [[package]] 574 | name = "leb128" 575 | version = "0.2.5" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" 578 | 579 | [[package]] 580 | name = "libc" 581 | version = "0.2.175" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 584 | 585 | [[package]] 586 | name = "linux-raw-sys" 587 | version = "0.9.4" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 590 | 591 | [[package]] 592 | name = "litemap" 593 | version = "0.8.0" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 596 | 597 | [[package]] 598 | name = "log" 599 | version = "0.4.27" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 602 | 603 | [[package]] 604 | name = "memchr" 605 | version = "2.7.5" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 608 | 609 | [[package]] 610 | name = "mime" 611 | version = "0.3.17" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 614 | 615 | [[package]] 616 | name = "miniz_oxide" 617 | version = "0.8.9" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 620 | dependencies = [ 621 | "adler2", 622 | ] 623 | 624 | [[package]] 625 | name = "mio" 626 | version = "1.0.4" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 629 | dependencies = [ 630 | "libc", 631 | "wasi 0.11.1+wasi-snapshot-preview1", 632 | "windows-sys 0.59.0", 633 | ] 634 | 635 | [[package]] 636 | name = "native-tls" 637 | version = "0.2.14" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 640 | dependencies = [ 641 | "libc", 642 | "log", 643 | "openssl", 644 | "openssl-probe", 645 | "openssl-sys", 646 | "schannel", 647 | "security-framework", 648 | "security-framework-sys", 649 | "tempfile", 650 | ] 651 | 652 | [[package]] 653 | name = "object" 654 | version = "0.36.7" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 657 | dependencies = [ 658 | "memchr", 659 | ] 660 | 661 | [[package]] 662 | name = "once_cell" 663 | version = "1.21.3" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 666 | 667 | [[package]] 668 | name = "openssl" 669 | version = "0.10.73" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 672 | dependencies = [ 673 | "bitflags", 674 | "cfg-if", 675 | "foreign-types", 676 | "libc", 677 | "once_cell", 678 | "openssl-macros", 679 | "openssl-sys", 680 | ] 681 | 682 | [[package]] 683 | name = "openssl-macros" 684 | version = "0.1.1" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 687 | dependencies = [ 688 | "proc-macro2", 689 | "quote", 690 | "syn", 691 | ] 692 | 693 | [[package]] 694 | name = "openssl-probe" 695 | version = "0.1.6" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 698 | 699 | [[package]] 700 | name = "openssl-sys" 701 | version = "0.9.109" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 704 | dependencies = [ 705 | "cc", 706 | "libc", 707 | "pkg-config", 708 | "vcpkg", 709 | ] 710 | 711 | [[package]] 712 | name = "percent-encoding" 713 | version = "2.3.1" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 716 | 717 | [[package]] 718 | name = "pin-project-lite" 719 | version = "0.2.16" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 722 | 723 | [[package]] 724 | name = "pin-utils" 725 | version = "0.1.0" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 728 | 729 | [[package]] 730 | name = "pkg-config" 731 | version = "0.3.32" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 734 | 735 | [[package]] 736 | name = "potential_utf" 737 | version = "0.1.2" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 740 | dependencies = [ 741 | "zerovec", 742 | ] 743 | 744 | [[package]] 745 | name = "proc-macro2" 746 | version = "1.0.97" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" 749 | dependencies = [ 750 | "unicode-ident", 751 | ] 752 | 753 | [[package]] 754 | name = "quote" 755 | version = "1.0.40" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 758 | dependencies = [ 759 | "proc-macro2", 760 | ] 761 | 762 | [[package]] 763 | name = "r-efi" 764 | version = "5.3.0" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 767 | 768 | [[package]] 769 | name = "reqwest" 770 | version = "0.12.23" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 773 | dependencies = [ 774 | "base64", 775 | "bytes", 776 | "encoding_rs", 777 | "futures-core", 778 | "h2", 779 | "http", 780 | "http-body", 781 | "http-body-util", 782 | "hyper", 783 | "hyper-rustls", 784 | "hyper-tls", 785 | "hyper-util", 786 | "js-sys", 787 | "log", 788 | "mime", 789 | "native-tls", 790 | "percent-encoding", 791 | "pin-project-lite", 792 | "rustls-pki-types", 793 | "serde", 794 | "serde_json", 795 | "serde_urlencoded", 796 | "sync_wrapper", 797 | "tokio", 798 | "tokio-native-tls", 799 | "tower", 800 | "tower-http", 801 | "tower-service", 802 | "url", 803 | "wasm-bindgen", 804 | "wasm-bindgen-futures", 805 | "web-sys", 806 | ] 807 | 808 | [[package]] 809 | name = "ring" 810 | version = "0.17.14" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 813 | dependencies = [ 814 | "cc", 815 | "cfg-if", 816 | "getrandom 0.2.16", 817 | "libc", 818 | "untrusted", 819 | "windows-sys 0.52.0", 820 | ] 821 | 822 | [[package]] 823 | name = "rust-cache" 824 | version = "0.1.0" 825 | dependencies = [ 826 | "jsonpath_lib_polars_vendor", 827 | "reqwest", 828 | "tikv-jemallocator", 829 | "trybuild", 830 | "watto", 831 | ] 832 | 833 | [[package]] 834 | name = "rustc-demangle" 835 | version = "0.1.26" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 838 | 839 | [[package]] 840 | name = "rustix" 841 | version = "1.0.8" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 844 | dependencies = [ 845 | "bitflags", 846 | "errno", 847 | "libc", 848 | "linux-raw-sys", 849 | "windows-sys 0.60.2", 850 | ] 851 | 852 | [[package]] 853 | name = "rustls" 854 | version = "0.23.31" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" 857 | dependencies = [ 858 | "once_cell", 859 | "rustls-pki-types", 860 | "rustls-webpki", 861 | "subtle", 862 | "zeroize", 863 | ] 864 | 865 | [[package]] 866 | name = "rustls-pki-types" 867 | version = "1.12.0" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 870 | dependencies = [ 871 | "zeroize", 872 | ] 873 | 874 | [[package]] 875 | name = "rustls-webpki" 876 | version = "0.103.4" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" 879 | dependencies = [ 880 | "ring", 881 | "rustls-pki-types", 882 | "untrusted", 883 | ] 884 | 885 | [[package]] 886 | name = "rustversion" 887 | version = "1.0.22" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 890 | 891 | [[package]] 892 | name = "ryu" 893 | version = "1.0.20" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 896 | 897 | [[package]] 898 | name = "schannel" 899 | version = "0.1.27" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 902 | dependencies = [ 903 | "windows-sys 0.59.0", 904 | ] 905 | 906 | [[package]] 907 | name = "security-framework" 908 | version = "2.11.1" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 911 | dependencies = [ 912 | "bitflags", 913 | "core-foundation", 914 | "core-foundation-sys", 915 | "libc", 916 | "security-framework-sys", 917 | ] 918 | 919 | [[package]] 920 | name = "security-framework-sys" 921 | version = "2.14.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 924 | dependencies = [ 925 | "core-foundation-sys", 926 | "libc", 927 | ] 928 | 929 | [[package]] 930 | name = "serde" 931 | version = "1.0.219" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 934 | dependencies = [ 935 | "serde_derive", 936 | ] 937 | 938 | [[package]] 939 | name = "serde_derive" 940 | version = "1.0.219" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 943 | dependencies = [ 944 | "proc-macro2", 945 | "quote", 946 | "syn", 947 | ] 948 | 949 | [[package]] 950 | name = "serde_json" 951 | version = "1.0.142" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" 954 | dependencies = [ 955 | "indexmap", 956 | "itoa", 957 | "memchr", 958 | "ryu", 959 | "serde", 960 | ] 961 | 962 | [[package]] 963 | name = "serde_spanned" 964 | version = "1.0.0" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 967 | dependencies = [ 968 | "serde", 969 | ] 970 | 971 | [[package]] 972 | name = "serde_urlencoded" 973 | version = "0.7.1" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 976 | dependencies = [ 977 | "form_urlencoded", 978 | "itoa", 979 | "ryu", 980 | "serde", 981 | ] 982 | 983 | [[package]] 984 | name = "shlex" 985 | version = "1.3.0" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 988 | 989 | [[package]] 990 | name = "slab" 991 | version = "0.4.11" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 994 | 995 | [[package]] 996 | name = "smallvec" 997 | version = "1.15.1" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1000 | 1001 | [[package]] 1002 | name = "socket2" 1003 | version = "0.6.0" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1006 | dependencies = [ 1007 | "libc", 1008 | "windows-sys 0.59.0", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "stable_deref_trait" 1013 | version = "1.2.0" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1016 | 1017 | [[package]] 1018 | name = "subtle" 1019 | version = "2.6.1" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1022 | 1023 | [[package]] 1024 | name = "syn" 1025 | version = "2.0.105" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" 1028 | dependencies = [ 1029 | "proc-macro2", 1030 | "quote", 1031 | "unicode-ident", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "sync_wrapper" 1036 | version = "1.0.2" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1039 | dependencies = [ 1040 | "futures-core", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "synstructure" 1045 | version = "0.13.2" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1048 | dependencies = [ 1049 | "proc-macro2", 1050 | "quote", 1051 | "syn", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "system-configuration" 1056 | version = "0.6.1" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1059 | dependencies = [ 1060 | "bitflags", 1061 | "core-foundation", 1062 | "system-configuration-sys", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "system-configuration-sys" 1067 | version = "0.6.0" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 1070 | dependencies = [ 1071 | "core-foundation-sys", 1072 | "libc", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "target-triple" 1077 | version = "0.1.4" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" 1080 | 1081 | [[package]] 1082 | name = "tempfile" 1083 | version = "3.20.0" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 1086 | dependencies = [ 1087 | "fastrand", 1088 | "getrandom 0.3.3", 1089 | "once_cell", 1090 | "rustix", 1091 | "windows-sys 0.59.0", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "termcolor" 1096 | version = "1.4.1" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1099 | dependencies = [ 1100 | "winapi-util", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "thiserror" 1105 | version = "2.0.14" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" 1108 | dependencies = [ 1109 | "thiserror-impl", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "thiserror-impl" 1114 | version = "2.0.14" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" 1117 | dependencies = [ 1118 | "proc-macro2", 1119 | "quote", 1120 | "syn", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "tikv-jemalloc-sys" 1125 | version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" 1128 | dependencies = [ 1129 | "cc", 1130 | "libc", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "tikv-jemallocator" 1135 | version = "0.6.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" 1138 | dependencies = [ 1139 | "libc", 1140 | "tikv-jemalloc-sys", 1141 | ] 1142 | 1143 | [[package]] 1144 | name = "tinystr" 1145 | version = "0.8.1" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1148 | dependencies = [ 1149 | "displaydoc", 1150 | "zerovec", 1151 | ] 1152 | 1153 | [[package]] 1154 | name = "tokio" 1155 | version = "1.47.1" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 1158 | dependencies = [ 1159 | "backtrace", 1160 | "bytes", 1161 | "io-uring", 1162 | "libc", 1163 | "mio", 1164 | "pin-project-lite", 1165 | "slab", 1166 | "socket2", 1167 | "windows-sys 0.59.0", 1168 | ] 1169 | 1170 | [[package]] 1171 | name = "tokio-native-tls" 1172 | version = "0.3.1" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1175 | dependencies = [ 1176 | "native-tls", 1177 | "tokio", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "tokio-rustls" 1182 | version = "0.26.2" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 1185 | dependencies = [ 1186 | "rustls", 1187 | "tokio", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "tokio-util" 1192 | version = "0.7.16" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 1195 | dependencies = [ 1196 | "bytes", 1197 | "futures-core", 1198 | "futures-sink", 1199 | "pin-project-lite", 1200 | "tokio", 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "toml" 1205 | version = "0.9.5" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" 1208 | dependencies = [ 1209 | "indexmap", 1210 | "serde", 1211 | "serde_spanned", 1212 | "toml_datetime", 1213 | "toml_parser", 1214 | "toml_writer", 1215 | "winnow", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "toml_datetime" 1220 | version = "0.7.0" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 1223 | dependencies = [ 1224 | "serde", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "toml_parser" 1229 | version = "1.0.2" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" 1232 | dependencies = [ 1233 | "winnow", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "toml_writer" 1238 | version = "1.0.2" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 1241 | 1242 | [[package]] 1243 | name = "tower" 1244 | version = "0.5.2" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1247 | dependencies = [ 1248 | "futures-core", 1249 | "futures-util", 1250 | "pin-project-lite", 1251 | "sync_wrapper", 1252 | "tokio", 1253 | "tower-layer", 1254 | "tower-service", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "tower-http" 1259 | version = "0.6.6" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 1262 | dependencies = [ 1263 | "bitflags", 1264 | "bytes", 1265 | "futures-util", 1266 | "http", 1267 | "http-body", 1268 | "iri-string", 1269 | "pin-project-lite", 1270 | "tower", 1271 | "tower-layer", 1272 | "tower-service", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "tower-layer" 1277 | version = "0.3.3" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1280 | 1281 | [[package]] 1282 | name = "tower-service" 1283 | version = "0.3.3" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1286 | 1287 | [[package]] 1288 | name = "tracing" 1289 | version = "0.1.41" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1292 | dependencies = [ 1293 | "pin-project-lite", 1294 | "tracing-core", 1295 | ] 1296 | 1297 | [[package]] 1298 | name = "tracing-core" 1299 | version = "0.1.34" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 1302 | dependencies = [ 1303 | "once_cell", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "try-lock" 1308 | version = "0.2.5" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1311 | 1312 | [[package]] 1313 | name = "trybuild" 1314 | version = "1.0.110" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "32e257d7246e7a9fd015fb0b28b330a8d4142151a33f03e6a497754f4b1f6a8e" 1317 | dependencies = [ 1318 | "glob", 1319 | "serde", 1320 | "serde_derive", 1321 | "serde_json", 1322 | "target-triple", 1323 | "termcolor", 1324 | "toml", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "unicode-ident" 1329 | version = "1.0.18" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1332 | 1333 | [[package]] 1334 | name = "untrusted" 1335 | version = "0.9.0" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1338 | 1339 | [[package]] 1340 | name = "url" 1341 | version = "2.5.4" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1344 | dependencies = [ 1345 | "form_urlencoded", 1346 | "idna", 1347 | "percent-encoding", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "utf8_iter" 1352 | version = "1.0.4" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1355 | 1356 | [[package]] 1357 | name = "vcpkg" 1358 | version = "0.2.15" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1361 | 1362 | [[package]] 1363 | name = "want" 1364 | version = "0.3.1" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1367 | dependencies = [ 1368 | "try-lock", 1369 | ] 1370 | 1371 | [[package]] 1372 | name = "wasi" 1373 | version = "0.11.1+wasi-snapshot-preview1" 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" 1375 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1376 | 1377 | [[package]] 1378 | name = "wasi" 1379 | version = "0.14.2+wasi-0.2.4" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1382 | dependencies = [ 1383 | "wit-bindgen-rt", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "wasm-bindgen" 1388 | version = "0.2.100" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1391 | dependencies = [ 1392 | "cfg-if", 1393 | "once_cell", 1394 | "rustversion", 1395 | "wasm-bindgen-macro", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "wasm-bindgen-backend" 1400 | version = "0.2.100" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1403 | dependencies = [ 1404 | "bumpalo", 1405 | "log", 1406 | "proc-macro2", 1407 | "quote", 1408 | "syn", 1409 | "wasm-bindgen-shared", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "wasm-bindgen-futures" 1414 | version = "0.4.50" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1417 | dependencies = [ 1418 | "cfg-if", 1419 | "js-sys", 1420 | "once_cell", 1421 | "wasm-bindgen", 1422 | "web-sys", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "wasm-bindgen-macro" 1427 | version = "0.2.100" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1430 | dependencies = [ 1431 | "quote", 1432 | "wasm-bindgen-macro-support", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "wasm-bindgen-macro-support" 1437 | version = "0.2.100" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1440 | dependencies = [ 1441 | "proc-macro2", 1442 | "quote", 1443 | "syn", 1444 | "wasm-bindgen-backend", 1445 | "wasm-bindgen-shared", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "wasm-bindgen-shared" 1450 | version = "0.2.100" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1453 | dependencies = [ 1454 | "unicode-ident", 1455 | ] 1456 | 1457 | [[package]] 1458 | name = "watto" 1459 | version = "0.2.0" 1460 | source = "git+https://github.com/getsentry/watto?rev=39ccb9add289c1f23c89f40506f4a80b2f4011b9#39ccb9add289c1f23c89f40506f4a80b2f4011b9" 1461 | dependencies = [ 1462 | "hashbrown", 1463 | "leb128", 1464 | "thiserror", 1465 | ] 1466 | 1467 | [[package]] 1468 | name = "web-sys" 1469 | version = "0.3.77" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1472 | dependencies = [ 1473 | "js-sys", 1474 | "wasm-bindgen", 1475 | ] 1476 | 1477 | [[package]] 1478 | name = "winapi-util" 1479 | version = "0.1.9" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 1482 | dependencies = [ 1483 | "windows-sys 0.59.0", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "windows-link" 1488 | version = "0.1.3" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1491 | 1492 | [[package]] 1493 | name = "windows-registry" 1494 | version = "0.5.3" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 1497 | dependencies = [ 1498 | "windows-link", 1499 | "windows-result", 1500 | "windows-strings", 1501 | ] 1502 | 1503 | [[package]] 1504 | name = "windows-result" 1505 | version = "0.3.4" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 1508 | dependencies = [ 1509 | "windows-link", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "windows-strings" 1514 | version = "0.4.2" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 1517 | dependencies = [ 1518 | "windows-link", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "windows-sys" 1523 | version = "0.52.0" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1526 | dependencies = [ 1527 | "windows-targets 0.52.6", 1528 | ] 1529 | 1530 | [[package]] 1531 | name = "windows-sys" 1532 | version = "0.59.0" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1535 | dependencies = [ 1536 | "windows-targets 0.52.6", 1537 | ] 1538 | 1539 | [[package]] 1540 | name = "windows-sys" 1541 | version = "0.60.2" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1544 | dependencies = [ 1545 | "windows-targets 0.53.3", 1546 | ] 1547 | 1548 | [[package]] 1549 | name = "windows-targets" 1550 | version = "0.52.6" 1551 | source = "registry+https://github.com/rust-lang/crates.io-index" 1552 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1553 | dependencies = [ 1554 | "windows_aarch64_gnullvm 0.52.6", 1555 | "windows_aarch64_msvc 0.52.6", 1556 | "windows_i686_gnu 0.52.6", 1557 | "windows_i686_gnullvm 0.52.6", 1558 | "windows_i686_msvc 0.52.6", 1559 | "windows_x86_64_gnu 0.52.6", 1560 | "windows_x86_64_gnullvm 0.52.6", 1561 | "windows_x86_64_msvc 0.52.6", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "windows-targets" 1566 | version = "0.53.3" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 1569 | dependencies = [ 1570 | "windows-link", 1571 | "windows_aarch64_gnullvm 0.53.0", 1572 | "windows_aarch64_msvc 0.53.0", 1573 | "windows_i686_gnu 0.53.0", 1574 | "windows_i686_gnullvm 0.53.0", 1575 | "windows_i686_msvc 0.53.0", 1576 | "windows_x86_64_gnu 0.53.0", 1577 | "windows_x86_64_gnullvm 0.53.0", 1578 | "windows_x86_64_msvc 0.53.0", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "windows_aarch64_gnullvm" 1583 | version = "0.52.6" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1586 | 1587 | [[package]] 1588 | name = "windows_aarch64_gnullvm" 1589 | version = "0.53.0" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 1592 | 1593 | [[package]] 1594 | name = "windows_aarch64_msvc" 1595 | version = "0.52.6" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1598 | 1599 | [[package]] 1600 | name = "windows_aarch64_msvc" 1601 | version = "0.53.0" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 1604 | 1605 | [[package]] 1606 | name = "windows_i686_gnu" 1607 | version = "0.52.6" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1610 | 1611 | [[package]] 1612 | name = "windows_i686_gnu" 1613 | version = "0.53.0" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 1616 | 1617 | [[package]] 1618 | name = "windows_i686_gnullvm" 1619 | version = "0.52.6" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1622 | 1623 | [[package]] 1624 | name = "windows_i686_gnullvm" 1625 | version = "0.53.0" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 1628 | 1629 | [[package]] 1630 | name = "windows_i686_msvc" 1631 | version = "0.52.6" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1634 | 1635 | [[package]] 1636 | name = "windows_i686_msvc" 1637 | version = "0.53.0" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 1640 | 1641 | [[package]] 1642 | name = "windows_x86_64_gnu" 1643 | version = "0.52.6" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1646 | 1647 | [[package]] 1648 | name = "windows_x86_64_gnu" 1649 | version = "0.53.0" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 1652 | 1653 | [[package]] 1654 | name = "windows_x86_64_gnullvm" 1655 | version = "0.52.6" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1658 | 1659 | [[package]] 1660 | name = "windows_x86_64_gnullvm" 1661 | version = "0.53.0" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 1664 | 1665 | [[package]] 1666 | name = "windows_x86_64_msvc" 1667 | version = "0.52.6" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1670 | 1671 | [[package]] 1672 | name = "windows_x86_64_msvc" 1673 | version = "0.53.0" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 1676 | 1677 | [[package]] 1678 | name = "winnow" 1679 | version = "0.7.12" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 1682 | 1683 | [[package]] 1684 | name = "wit-bindgen-rt" 1685 | version = "0.39.0" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 1688 | dependencies = [ 1689 | "bitflags", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "writeable" 1694 | version = "0.6.1" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 1697 | 1698 | [[package]] 1699 | name = "yoke" 1700 | version = "0.8.0" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 1703 | dependencies = [ 1704 | "serde", 1705 | "stable_deref_trait", 1706 | "yoke-derive", 1707 | "zerofrom", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "yoke-derive" 1712 | version = "0.8.0" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 1715 | dependencies = [ 1716 | "proc-macro2", 1717 | "quote", 1718 | "syn", 1719 | "synstructure", 1720 | ] 1721 | 1722 | [[package]] 1723 | name = "zerofrom" 1724 | version = "0.1.6" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 1727 | dependencies = [ 1728 | "zerofrom-derive", 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "zerofrom-derive" 1733 | version = "0.1.6" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 1736 | dependencies = [ 1737 | "proc-macro2", 1738 | "quote", 1739 | "syn", 1740 | "synstructure", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "zeroize" 1745 | version = "1.8.1" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 1748 | 1749 | [[package]] 1750 | name = "zerotrie" 1751 | version = "0.2.2" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 1754 | dependencies = [ 1755 | "displaydoc", 1756 | "yoke", 1757 | "zerofrom", 1758 | ] 1759 | 1760 | [[package]] 1761 | name = "zerovec" 1762 | version = "0.11.4" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 1765 | dependencies = [ 1766 | "yoke", 1767 | "zerofrom", 1768 | "zerovec-derive", 1769 | ] 1770 | 1771 | [[package]] 1772 | name = "zerovec-derive" 1773 | version = "0.11.1" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 1776 | dependencies = [ 1777 | "proc-macro2", 1778 | "quote", 1779 | "syn", 1780 | ] 1781 | -------------------------------------------------------------------------------- /tests/wasm-workspace/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "anstream" 22 | version = "0.6.20" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 25 | dependencies = [ 26 | "anstyle", 27 | "anstyle-parse", 28 | "anstyle-query", 29 | "anstyle-wincon", 30 | "colorchoice", 31 | "is_terminal_polyfill", 32 | "utf8parse", 33 | ] 34 | 35 | [[package]] 36 | name = "anstyle" 37 | version = "1.0.11" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 40 | 41 | [[package]] 42 | name = "anstyle-parse" 43 | version = "0.2.7" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 46 | dependencies = [ 47 | "utf8parse", 48 | ] 49 | 50 | [[package]] 51 | name = "anstyle-query" 52 | version = "1.1.4" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 55 | dependencies = [ 56 | "windows-sys 0.60.2", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-wincon" 61 | version = "3.0.10" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 64 | dependencies = [ 65 | "anstyle", 66 | "once_cell_polyfill", 67 | "windows-sys 0.60.2", 68 | ] 69 | 70 | [[package]] 71 | name = "async-channel" 72 | version = "1.9.0" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" 75 | dependencies = [ 76 | "concurrent-queue", 77 | "event-listener 2.5.3", 78 | "futures-core", 79 | ] 80 | 81 | [[package]] 82 | name = "async-channel" 83 | version = "2.5.0" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" 86 | dependencies = [ 87 | "concurrent-queue", 88 | "event-listener-strategy", 89 | "futures-core", 90 | "pin-project-lite", 91 | ] 92 | 93 | [[package]] 94 | name = "async-executor" 95 | version = "1.13.2" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 98 | dependencies = [ 99 | "async-task", 100 | "concurrent-queue", 101 | "fastrand", 102 | "futures-lite", 103 | "pin-project-lite", 104 | "slab", 105 | ] 106 | 107 | [[package]] 108 | name = "async-global-executor" 109 | version = "2.4.1" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" 112 | dependencies = [ 113 | "async-channel 2.5.0", 114 | "async-executor", 115 | "async-io", 116 | "async-lock", 117 | "blocking", 118 | "futures-lite", 119 | "once_cell", 120 | ] 121 | 122 | [[package]] 123 | name = "async-io" 124 | version = "2.5.0" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 127 | dependencies = [ 128 | "async-lock", 129 | "cfg-if", 130 | "concurrent-queue", 131 | "futures-io", 132 | "futures-lite", 133 | "parking", 134 | "polling", 135 | "rustix", 136 | "slab", 137 | "windows-sys 0.60.2", 138 | ] 139 | 140 | [[package]] 141 | name = "async-lock" 142 | version = "3.4.1" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 145 | dependencies = [ 146 | "event-listener 5.4.1", 147 | "event-listener-strategy", 148 | "pin-project-lite", 149 | ] 150 | 151 | [[package]] 152 | name = "async-std" 153 | version = "1.13.1" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" 156 | dependencies = [ 157 | "async-channel 1.9.0", 158 | "async-global-executor", 159 | "async-io", 160 | "async-lock", 161 | "crossbeam-utils", 162 | "futures-channel", 163 | "futures-core", 164 | "futures-io", 165 | "futures-lite", 166 | "gloo-timers", 167 | "kv-log-macro", 168 | "log", 169 | "memchr", 170 | "once_cell", 171 | "pin-project-lite", 172 | "pin-utils", 173 | "slab", 174 | "wasm-bindgen-futures", 175 | ] 176 | 177 | [[package]] 178 | name = "async-task" 179 | version = "4.7.1" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 182 | 183 | [[package]] 184 | name = "atomic-waker" 185 | version = "1.1.2" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 188 | 189 | [[package]] 190 | name = "backtrace" 191 | version = "0.3.75" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 194 | dependencies = [ 195 | "addr2line", 196 | "cfg-if", 197 | "libc", 198 | "miniz_oxide", 199 | "object", 200 | "rustc-demangle", 201 | "windows-targets 0.52.6", 202 | ] 203 | 204 | [[package]] 205 | name = "base64" 206 | version = "0.22.1" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 209 | 210 | [[package]] 211 | name = "bitflags" 212 | version = "2.9.1" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 215 | 216 | [[package]] 217 | name = "blocking" 218 | version = "1.6.2" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" 221 | dependencies = [ 222 | "async-channel 2.5.0", 223 | "async-task", 224 | "futures-io", 225 | "futures-lite", 226 | "piper", 227 | ] 228 | 229 | [[package]] 230 | name = "bumpalo" 231 | version = "3.19.0" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 234 | 235 | [[package]] 236 | name = "bytes" 237 | version = "1.10.1" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 240 | 241 | [[package]] 242 | name = "cc" 243 | version = "1.2.32" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" 246 | dependencies = [ 247 | "shlex", 248 | ] 249 | 250 | [[package]] 251 | name = "cfg-if" 252 | version = "1.0.1" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 255 | 256 | [[package]] 257 | name = "clap" 258 | version = "4.5.45" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" 261 | dependencies = [ 262 | "clap_builder", 263 | ] 264 | 265 | [[package]] 266 | name = "clap_builder" 267 | version = "4.5.44" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" 270 | dependencies = [ 271 | "anstream", 272 | "anstyle", 273 | "clap_lex", 274 | "strsim", 275 | ] 276 | 277 | [[package]] 278 | name = "clap_lex" 279 | version = "0.7.5" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" 282 | 283 | [[package]] 284 | name = "colorchoice" 285 | version = "1.0.4" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 288 | 289 | [[package]] 290 | name = "concurrent-queue" 291 | version = "2.5.0" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 294 | dependencies = [ 295 | "crossbeam-utils", 296 | ] 297 | 298 | [[package]] 299 | name = "core-foundation" 300 | version = "0.9.4" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 303 | dependencies = [ 304 | "core-foundation-sys", 305 | "libc", 306 | ] 307 | 308 | [[package]] 309 | name = "core-foundation-sys" 310 | version = "0.8.7" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 313 | 314 | [[package]] 315 | name = "crossbeam-utils" 316 | version = "0.8.21" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 319 | 320 | [[package]] 321 | name = "displaydoc" 322 | version = "0.2.5" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 325 | dependencies = [ 326 | "proc-macro2", 327 | "quote", 328 | "syn", 329 | ] 330 | 331 | [[package]] 332 | name = "encoding_rs" 333 | version = "0.8.35" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 336 | dependencies = [ 337 | "cfg-if", 338 | ] 339 | 340 | [[package]] 341 | name = "equivalent" 342 | version = "1.0.2" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 345 | 346 | [[package]] 347 | name = "errno" 348 | version = "0.3.13" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 351 | dependencies = [ 352 | "libc", 353 | "windows-sys 0.60.2", 354 | ] 355 | 356 | [[package]] 357 | name = "event-listener" 358 | version = "2.5.3" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 361 | 362 | [[package]] 363 | name = "event-listener" 364 | version = "5.4.1" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 367 | dependencies = [ 368 | "concurrent-queue", 369 | "parking", 370 | "pin-project-lite", 371 | ] 372 | 373 | [[package]] 374 | name = "event-listener-strategy" 375 | version = "0.5.4" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 378 | dependencies = [ 379 | "event-listener 5.4.1", 380 | "pin-project-lite", 381 | ] 382 | 383 | [[package]] 384 | name = "fastrand" 385 | version = "2.3.0" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 388 | 389 | [[package]] 390 | name = "fnv" 391 | version = "1.0.7" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 394 | 395 | [[package]] 396 | name = "foreign-types" 397 | version = "0.3.2" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 400 | dependencies = [ 401 | "foreign-types-shared", 402 | ] 403 | 404 | [[package]] 405 | name = "foreign-types-shared" 406 | version = "0.1.1" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 409 | 410 | [[package]] 411 | name = "form_urlencoded" 412 | version = "1.2.1" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 415 | dependencies = [ 416 | "percent-encoding", 417 | ] 418 | 419 | [[package]] 420 | name = "futures-channel" 421 | version = "0.3.31" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 424 | dependencies = [ 425 | "futures-core", 426 | ] 427 | 428 | [[package]] 429 | name = "futures-core" 430 | version = "0.3.31" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 433 | 434 | [[package]] 435 | name = "futures-io" 436 | version = "0.3.31" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 439 | 440 | [[package]] 441 | name = "futures-lite" 442 | version = "2.6.1" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 445 | dependencies = [ 446 | "fastrand", 447 | "futures-core", 448 | "futures-io", 449 | "parking", 450 | "pin-project-lite", 451 | ] 452 | 453 | [[package]] 454 | name = "futures-sink" 455 | version = "0.3.31" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 458 | 459 | [[package]] 460 | name = "futures-task" 461 | version = "0.3.31" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 464 | 465 | [[package]] 466 | name = "futures-util" 467 | version = "0.3.31" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 470 | dependencies = [ 471 | "futures-core", 472 | "futures-task", 473 | "pin-project-lite", 474 | "pin-utils", 475 | ] 476 | 477 | [[package]] 478 | name = "getrandom" 479 | version = "0.2.16" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 482 | dependencies = [ 483 | "cfg-if", 484 | "libc", 485 | "wasi 0.11.1+wasi-snapshot-preview1", 486 | ] 487 | 488 | [[package]] 489 | name = "getrandom" 490 | version = "0.3.3" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 493 | dependencies = [ 494 | "cfg-if", 495 | "libc", 496 | "r-efi", 497 | "wasi 0.14.2+wasi-0.2.4", 498 | ] 499 | 500 | [[package]] 501 | name = "gimli" 502 | version = "0.31.1" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 505 | 506 | [[package]] 507 | name = "gloo-timers" 508 | version = "0.3.0" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" 511 | dependencies = [ 512 | "futures-channel", 513 | "futures-core", 514 | "js-sys", 515 | "wasm-bindgen", 516 | ] 517 | 518 | [[package]] 519 | name = "h2" 520 | version = "0.4.12" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 523 | dependencies = [ 524 | "atomic-waker", 525 | "bytes", 526 | "fnv", 527 | "futures-core", 528 | "futures-sink", 529 | "http", 530 | "indexmap", 531 | "slab", 532 | "tokio", 533 | "tokio-util", 534 | "tracing", 535 | ] 536 | 537 | [[package]] 538 | name = "hashbrown" 539 | version = "0.15.5" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 542 | 543 | [[package]] 544 | name = "hermit-abi" 545 | version = "0.5.2" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" 548 | 549 | [[package]] 550 | name = "http" 551 | version = "1.3.1" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 554 | dependencies = [ 555 | "bytes", 556 | "fnv", 557 | "itoa", 558 | ] 559 | 560 | [[package]] 561 | name = "http-body" 562 | version = "1.0.1" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 565 | dependencies = [ 566 | "bytes", 567 | "http", 568 | ] 569 | 570 | [[package]] 571 | name = "http-body-util" 572 | version = "0.1.3" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 575 | dependencies = [ 576 | "bytes", 577 | "futures-core", 578 | "http", 579 | "http-body", 580 | "pin-project-lite", 581 | ] 582 | 583 | [[package]] 584 | name = "httparse" 585 | version = "1.10.1" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 588 | 589 | [[package]] 590 | name = "hyper" 591 | version = "1.6.0" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 594 | dependencies = [ 595 | "bytes", 596 | "futures-channel", 597 | "futures-util", 598 | "h2", 599 | "http", 600 | "http-body", 601 | "httparse", 602 | "itoa", 603 | "pin-project-lite", 604 | "smallvec", 605 | "tokio", 606 | "want", 607 | ] 608 | 609 | [[package]] 610 | name = "hyper-rustls" 611 | version = "0.27.7" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 614 | dependencies = [ 615 | "http", 616 | "hyper", 617 | "hyper-util", 618 | "rustls", 619 | "rustls-pki-types", 620 | "tokio", 621 | "tokio-rustls", 622 | "tower-service", 623 | ] 624 | 625 | [[package]] 626 | name = "hyper-tls" 627 | version = "0.6.0" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 630 | dependencies = [ 631 | "bytes", 632 | "http-body-util", 633 | "hyper", 634 | "hyper-util", 635 | "native-tls", 636 | "tokio", 637 | "tokio-native-tls", 638 | "tower-service", 639 | ] 640 | 641 | [[package]] 642 | name = "hyper-util" 643 | version = "0.1.16" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 646 | dependencies = [ 647 | "base64", 648 | "bytes", 649 | "futures-channel", 650 | "futures-core", 651 | "futures-util", 652 | "http", 653 | "http-body", 654 | "hyper", 655 | "ipnet", 656 | "libc", 657 | "percent-encoding", 658 | "pin-project-lite", 659 | "socket2", 660 | "system-configuration", 661 | "tokio", 662 | "tower-service", 663 | "tracing", 664 | "windows-registry", 665 | ] 666 | 667 | [[package]] 668 | name = "icu_collections" 669 | version = "2.0.0" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 672 | dependencies = [ 673 | "displaydoc", 674 | "potential_utf", 675 | "yoke", 676 | "zerofrom", 677 | "zerovec", 678 | ] 679 | 680 | [[package]] 681 | name = "icu_locale_core" 682 | version = "2.0.0" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 685 | dependencies = [ 686 | "displaydoc", 687 | "litemap", 688 | "tinystr", 689 | "writeable", 690 | "zerovec", 691 | ] 692 | 693 | [[package]] 694 | name = "icu_normalizer" 695 | version = "2.0.0" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 698 | dependencies = [ 699 | "displaydoc", 700 | "icu_collections", 701 | "icu_normalizer_data", 702 | "icu_properties", 703 | "icu_provider", 704 | "smallvec", 705 | "zerovec", 706 | ] 707 | 708 | [[package]] 709 | name = "icu_normalizer_data" 710 | version = "2.0.0" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 713 | 714 | [[package]] 715 | name = "icu_properties" 716 | version = "2.0.1" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 719 | dependencies = [ 720 | "displaydoc", 721 | "icu_collections", 722 | "icu_locale_core", 723 | "icu_properties_data", 724 | "icu_provider", 725 | "potential_utf", 726 | "zerotrie", 727 | "zerovec", 728 | ] 729 | 730 | [[package]] 731 | name = "icu_properties_data" 732 | version = "2.0.1" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 735 | 736 | [[package]] 737 | name = "icu_provider" 738 | version = "2.0.0" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 741 | dependencies = [ 742 | "displaydoc", 743 | "icu_locale_core", 744 | "stable_deref_trait", 745 | "tinystr", 746 | "writeable", 747 | "yoke", 748 | "zerofrom", 749 | "zerotrie", 750 | "zerovec", 751 | ] 752 | 753 | [[package]] 754 | name = "idna" 755 | version = "1.0.3" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 758 | dependencies = [ 759 | "idna_adapter", 760 | "smallvec", 761 | "utf8_iter", 762 | ] 763 | 764 | [[package]] 765 | name = "idna_adapter" 766 | version = "1.2.1" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 769 | dependencies = [ 770 | "icu_normalizer", 771 | "icu_properties", 772 | ] 773 | 774 | [[package]] 775 | name = "indexmap" 776 | version = "2.10.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 779 | dependencies = [ 780 | "equivalent", 781 | "hashbrown", 782 | ] 783 | 784 | [[package]] 785 | name = "io-uring" 786 | version = "0.7.9" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 789 | dependencies = [ 790 | "bitflags", 791 | "cfg-if", 792 | "libc", 793 | ] 794 | 795 | [[package]] 796 | name = "ipnet" 797 | version = "2.11.0" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 800 | 801 | [[package]] 802 | name = "iri-string" 803 | version = "0.7.8" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 806 | dependencies = [ 807 | "memchr", 808 | "serde", 809 | ] 810 | 811 | [[package]] 812 | name = "is_terminal_polyfill" 813 | version = "1.70.1" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 816 | 817 | [[package]] 818 | name = "itoa" 819 | version = "1.0.15" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 822 | 823 | [[package]] 824 | name = "js-sys" 825 | version = "0.3.77" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 828 | dependencies = [ 829 | "once_cell", 830 | "wasm-bindgen", 831 | ] 832 | 833 | [[package]] 834 | name = "kv-log-macro" 835 | version = "1.0.7" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" 838 | dependencies = [ 839 | "log", 840 | ] 841 | 842 | [[package]] 843 | name = "libc" 844 | version = "0.2.175" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 847 | 848 | [[package]] 849 | name = "linux-raw-sys" 850 | version = "0.9.4" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 853 | 854 | [[package]] 855 | name = "litemap" 856 | version = "0.8.0" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 859 | 860 | [[package]] 861 | name = "log" 862 | version = "0.4.27" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 865 | dependencies = [ 866 | "value-bag", 867 | ] 868 | 869 | [[package]] 870 | name = "memchr" 871 | version = "2.7.5" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 874 | 875 | [[package]] 876 | name = "mime" 877 | version = "0.3.17" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 880 | 881 | [[package]] 882 | name = "miniz_oxide" 883 | version = "0.8.9" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 886 | dependencies = [ 887 | "adler2", 888 | ] 889 | 890 | [[package]] 891 | name = "mio" 892 | version = "1.0.4" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 895 | dependencies = [ 896 | "libc", 897 | "wasi 0.11.1+wasi-snapshot-preview1", 898 | "windows-sys 0.59.0", 899 | ] 900 | 901 | [[package]] 902 | name = "native-tls" 903 | version = "0.2.14" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 906 | dependencies = [ 907 | "libc", 908 | "log", 909 | "openssl", 910 | "openssl-probe", 911 | "openssl-sys", 912 | "schannel", 913 | "security-framework", 914 | "security-framework-sys", 915 | "tempfile", 916 | ] 917 | 918 | [[package]] 919 | name = "object" 920 | version = "0.36.7" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 923 | dependencies = [ 924 | "memchr", 925 | ] 926 | 927 | [[package]] 928 | name = "once_cell" 929 | version = "1.21.3" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 932 | 933 | [[package]] 934 | name = "once_cell_polyfill" 935 | version = "1.70.1" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 938 | 939 | [[package]] 940 | name = "openssl" 941 | version = "0.10.73" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 944 | dependencies = [ 945 | "bitflags", 946 | "cfg-if", 947 | "foreign-types", 948 | "libc", 949 | "once_cell", 950 | "openssl-macros", 951 | "openssl-sys", 952 | ] 953 | 954 | [[package]] 955 | name = "openssl-macros" 956 | version = "0.1.1" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 959 | dependencies = [ 960 | "proc-macro2", 961 | "quote", 962 | "syn", 963 | ] 964 | 965 | [[package]] 966 | name = "openssl-probe" 967 | version = "0.1.6" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 970 | 971 | [[package]] 972 | name = "openssl-sys" 973 | version = "0.9.109" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 976 | dependencies = [ 977 | "cc", 978 | "libc", 979 | "pkg-config", 980 | "vcpkg", 981 | ] 982 | 983 | [[package]] 984 | name = "parking" 985 | version = "2.2.1" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 988 | 989 | [[package]] 990 | name = "percent-encoding" 991 | version = "2.3.1" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 994 | 995 | [[package]] 996 | name = "pin-project" 997 | version = "1.1.10" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 1000 | dependencies = [ 1001 | "pin-project-internal", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "pin-project-internal" 1006 | version = "1.1.10" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 1009 | dependencies = [ 1010 | "proc-macro2", 1011 | "quote", 1012 | "syn", 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "pin-project-lite" 1017 | version = "0.2.16" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1020 | 1021 | [[package]] 1022 | name = "pin-utils" 1023 | version = "0.1.0" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1026 | 1027 | [[package]] 1028 | name = "piper" 1029 | version = "0.2.4" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 1032 | dependencies = [ 1033 | "atomic-waker", 1034 | "fastrand", 1035 | "futures-io", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "pkg-config" 1040 | version = "0.3.32" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1043 | 1044 | [[package]] 1045 | name = "polling" 1046 | version = "3.10.0" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" 1049 | dependencies = [ 1050 | "cfg-if", 1051 | "concurrent-queue", 1052 | "hermit-abi", 1053 | "pin-project-lite", 1054 | "rustix", 1055 | "windows-sys 0.60.2", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "potential_utf" 1060 | version = "0.1.2" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 1063 | dependencies = [ 1064 | "zerovec", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "proc-macro2" 1069 | version = "1.0.97" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" 1072 | dependencies = [ 1073 | "unicode-ident", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "quote" 1078 | version = "1.0.40" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1081 | dependencies = [ 1082 | "proc-macro2", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "r-efi" 1087 | version = "5.3.0" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1090 | 1091 | [[package]] 1092 | name = "reqwest" 1093 | version = "0.12.23" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 1096 | dependencies = [ 1097 | "base64", 1098 | "bytes", 1099 | "encoding_rs", 1100 | "futures-core", 1101 | "h2", 1102 | "http", 1103 | "http-body", 1104 | "http-body-util", 1105 | "hyper", 1106 | "hyper-rustls", 1107 | "hyper-tls", 1108 | "hyper-util", 1109 | "js-sys", 1110 | "log", 1111 | "mime", 1112 | "native-tls", 1113 | "percent-encoding", 1114 | "pin-project-lite", 1115 | "rustls-pki-types", 1116 | "serde", 1117 | "serde_json", 1118 | "serde_urlencoded", 1119 | "sync_wrapper", 1120 | "tokio", 1121 | "tokio-native-tls", 1122 | "tower", 1123 | "tower-http", 1124 | "tower-service", 1125 | "url", 1126 | "wasm-bindgen", 1127 | "wasm-bindgen-futures", 1128 | "web-sys", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "ring" 1133 | version = "0.17.14" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1136 | dependencies = [ 1137 | "cc", 1138 | "cfg-if", 1139 | "getrandom 0.2.16", 1140 | "libc", 1141 | "untrusted", 1142 | "windows-sys 0.52.0", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "rustc-demangle" 1147 | version = "0.1.26" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1150 | 1151 | [[package]] 1152 | name = "rustix" 1153 | version = "1.0.8" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 1156 | dependencies = [ 1157 | "bitflags", 1158 | "errno", 1159 | "libc", 1160 | "linux-raw-sys", 1161 | "windows-sys 0.60.2", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "rustls" 1166 | version = "0.23.31" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" 1169 | dependencies = [ 1170 | "once_cell", 1171 | "rustls-pki-types", 1172 | "rustls-webpki", 1173 | "subtle", 1174 | "zeroize", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "rustls-pki-types" 1179 | version = "1.12.0" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1182 | dependencies = [ 1183 | "zeroize", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "rustls-webpki" 1188 | version = "0.103.4" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" 1191 | dependencies = [ 1192 | "ring", 1193 | "rustls-pki-types", 1194 | "untrusted", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "rustversion" 1199 | version = "1.0.22" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1202 | 1203 | [[package]] 1204 | name = "ryu" 1205 | version = "1.0.20" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1208 | 1209 | [[package]] 1210 | name = "schannel" 1211 | version = "0.1.27" 1212 | source = "registry+https://github.com/rust-lang/crates.io-index" 1213 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1214 | dependencies = [ 1215 | "windows-sys 0.59.0", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "security-framework" 1220 | version = "2.11.1" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1223 | dependencies = [ 1224 | "bitflags", 1225 | "core-foundation", 1226 | "core-foundation-sys", 1227 | "libc", 1228 | "security-framework-sys", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "security-framework-sys" 1233 | version = "2.14.0" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1236 | dependencies = [ 1237 | "core-foundation-sys", 1238 | "libc", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "serde" 1243 | version = "1.0.219" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1246 | dependencies = [ 1247 | "serde_derive", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "serde_derive" 1252 | version = "1.0.219" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1255 | dependencies = [ 1256 | "proc-macro2", 1257 | "quote", 1258 | "syn", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "serde_json" 1263 | version = "1.0.142" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" 1266 | dependencies = [ 1267 | "itoa", 1268 | "memchr", 1269 | "ryu", 1270 | "serde", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "serde_urlencoded" 1275 | version = "0.7.1" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1278 | dependencies = [ 1279 | "form_urlencoded", 1280 | "itoa", 1281 | "ryu", 1282 | "serde", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "shlex" 1287 | version = "1.3.0" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1290 | 1291 | [[package]] 1292 | name = "slab" 1293 | version = "0.4.11" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1296 | 1297 | [[package]] 1298 | name = "smallvec" 1299 | version = "1.15.1" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1302 | 1303 | [[package]] 1304 | name = "socket2" 1305 | version = "0.6.0" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1308 | dependencies = [ 1309 | "libc", 1310 | "windows-sys 0.59.0", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "stable_deref_trait" 1315 | version = "1.2.0" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1318 | 1319 | [[package]] 1320 | name = "strsim" 1321 | version = "0.11.1" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1324 | 1325 | [[package]] 1326 | name = "subtle" 1327 | version = "2.6.1" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1330 | 1331 | [[package]] 1332 | name = "syn" 1333 | version = "2.0.105" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" 1336 | dependencies = [ 1337 | "proc-macro2", 1338 | "quote", 1339 | "unicode-ident", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "sync_wrapper" 1344 | version = "1.0.2" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1347 | dependencies = [ 1348 | "futures-core", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "synstructure" 1353 | version = "0.13.2" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1356 | dependencies = [ 1357 | "proc-macro2", 1358 | "quote", 1359 | "syn", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "system-configuration" 1364 | version = "0.6.1" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1367 | dependencies = [ 1368 | "bitflags", 1369 | "core-foundation", 1370 | "system-configuration-sys", 1371 | ] 1372 | 1373 | [[package]] 1374 | name = "system-configuration-sys" 1375 | version = "0.6.0" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 1378 | dependencies = [ 1379 | "core-foundation-sys", 1380 | "libc", 1381 | ] 1382 | 1383 | [[package]] 1384 | name = "tempfile" 1385 | version = "3.20.0" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 1388 | dependencies = [ 1389 | "fastrand", 1390 | "getrandom 0.3.3", 1391 | "once_cell", 1392 | "rustix", 1393 | "windows-sys 0.59.0", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "tinystr" 1398 | version = "0.8.1" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1401 | dependencies = [ 1402 | "displaydoc", 1403 | "zerovec", 1404 | ] 1405 | 1406 | [[package]] 1407 | name = "tokio" 1408 | version = "1.47.1" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 1411 | dependencies = [ 1412 | "backtrace", 1413 | "bytes", 1414 | "io-uring", 1415 | "libc", 1416 | "mio", 1417 | "pin-project-lite", 1418 | "slab", 1419 | "socket2", 1420 | "windows-sys 0.59.0", 1421 | ] 1422 | 1423 | [[package]] 1424 | name = "tokio-native-tls" 1425 | version = "0.3.1" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1428 | dependencies = [ 1429 | "native-tls", 1430 | "tokio", 1431 | ] 1432 | 1433 | [[package]] 1434 | name = "tokio-rustls" 1435 | version = "0.26.2" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 1438 | dependencies = [ 1439 | "rustls", 1440 | "tokio", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "tokio-util" 1445 | version = "0.7.16" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 1448 | dependencies = [ 1449 | "bytes", 1450 | "futures-core", 1451 | "futures-sink", 1452 | "pin-project-lite", 1453 | "tokio", 1454 | ] 1455 | 1456 | [[package]] 1457 | name = "tower" 1458 | version = "0.5.2" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1461 | dependencies = [ 1462 | "futures-core", 1463 | "futures-util", 1464 | "pin-project-lite", 1465 | "sync_wrapper", 1466 | "tokio", 1467 | "tower-layer", 1468 | "tower-service", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "tower-http" 1473 | version = "0.6.6" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 1476 | dependencies = [ 1477 | "bitflags", 1478 | "bytes", 1479 | "futures-util", 1480 | "http", 1481 | "http-body", 1482 | "iri-string", 1483 | "pin-project-lite", 1484 | "tower", 1485 | "tower-layer", 1486 | "tower-service", 1487 | ] 1488 | 1489 | [[package]] 1490 | name = "tower-layer" 1491 | version = "0.3.3" 1492 | source = "registry+https://github.com/rust-lang/crates.io-index" 1493 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1494 | 1495 | [[package]] 1496 | name = "tower-service" 1497 | version = "0.3.3" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1500 | 1501 | [[package]] 1502 | name = "tracing" 1503 | version = "0.1.41" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1506 | dependencies = [ 1507 | "pin-project-lite", 1508 | "tracing-attributes", 1509 | "tracing-core", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "tracing-attributes" 1514 | version = "0.1.30" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 1517 | dependencies = [ 1518 | "proc-macro2", 1519 | "quote", 1520 | "syn", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "tracing-core" 1525 | version = "0.1.34" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 1528 | dependencies = [ 1529 | "once_cell", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "tracing-futures" 1534 | version = "0.2.5" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 1537 | dependencies = [ 1538 | "pin-project", 1539 | "tracing", 1540 | ] 1541 | 1542 | [[package]] 1543 | name = "try-lock" 1544 | version = "0.2.5" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1547 | 1548 | [[package]] 1549 | name = "unicode-ident" 1550 | version = "1.0.18" 1551 | source = "registry+https://github.com/rust-lang/crates.io-index" 1552 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1553 | 1554 | [[package]] 1555 | name = "untrusted" 1556 | version = "0.9.0" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1559 | 1560 | [[package]] 1561 | name = "url" 1562 | version = "2.5.4" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1565 | dependencies = [ 1566 | "form_urlencoded", 1567 | "idna", 1568 | "percent-encoding", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "utf8_iter" 1573 | version = "1.0.4" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1576 | 1577 | [[package]] 1578 | name = "utf8parse" 1579 | version = "0.2.2" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1582 | 1583 | [[package]] 1584 | name = "value-bag" 1585 | version = "1.11.1" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" 1588 | 1589 | [[package]] 1590 | name = "vcpkg" 1591 | version = "0.2.15" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1594 | 1595 | [[package]] 1596 | name = "want" 1597 | version = "0.3.1" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1600 | dependencies = [ 1601 | "try-lock", 1602 | ] 1603 | 1604 | [[package]] 1605 | name = "wasi" 1606 | version = "0.11.1+wasi-snapshot-preview1" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1609 | 1610 | [[package]] 1611 | name = "wasi" 1612 | version = "0.14.2+wasi-0.2.4" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1615 | dependencies = [ 1616 | "wit-bindgen-rt", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "wasm-bindgen" 1621 | version = "0.2.100" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1624 | dependencies = [ 1625 | "cfg-if", 1626 | "once_cell", 1627 | "rustversion", 1628 | "wasm-bindgen-macro", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "wasm-bindgen-backend" 1633 | version = "0.2.100" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1636 | dependencies = [ 1637 | "bumpalo", 1638 | "log", 1639 | "proc-macro2", 1640 | "quote", 1641 | "syn", 1642 | "wasm-bindgen-shared", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "wasm-bindgen-futures" 1647 | version = "0.4.50" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1650 | dependencies = [ 1651 | "cfg-if", 1652 | "js-sys", 1653 | "once_cell", 1654 | "wasm-bindgen", 1655 | "web-sys", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "wasm-bindgen-macro" 1660 | version = "0.2.100" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1663 | dependencies = [ 1664 | "quote", 1665 | "wasm-bindgen-macro-support", 1666 | ] 1667 | 1668 | [[package]] 1669 | name = "wasm-bindgen-macro-support" 1670 | version = "0.2.100" 1671 | source = "registry+https://github.com/rust-lang/crates.io-index" 1672 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1673 | dependencies = [ 1674 | "proc-macro2", 1675 | "quote", 1676 | "syn", 1677 | "wasm-bindgen-backend", 1678 | "wasm-bindgen-shared", 1679 | ] 1680 | 1681 | [[package]] 1682 | name = "wasm-bindgen-shared" 1683 | version = "0.2.100" 1684 | source = "registry+https://github.com/rust-lang/crates.io-index" 1685 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1686 | dependencies = [ 1687 | "unicode-ident", 1688 | ] 1689 | 1690 | [[package]] 1691 | name = "wasm-one" 1692 | version = "0.1.0" 1693 | dependencies = [ 1694 | "async-std", 1695 | "reqwest", 1696 | "serde", 1697 | "serde_json", 1698 | "tracing", 1699 | "tracing-futures", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "wasm-two" 1704 | version = "0.1.0" 1705 | dependencies = [ 1706 | "clap", 1707 | ] 1708 | 1709 | [[package]] 1710 | name = "web-sys" 1711 | version = "0.3.77" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1714 | dependencies = [ 1715 | "js-sys", 1716 | "wasm-bindgen", 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "windows-link" 1721 | version = "0.1.3" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1724 | 1725 | [[package]] 1726 | name = "windows-registry" 1727 | version = "0.5.3" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 1730 | dependencies = [ 1731 | "windows-link", 1732 | "windows-result", 1733 | "windows-strings", 1734 | ] 1735 | 1736 | [[package]] 1737 | name = "windows-result" 1738 | version = "0.3.4" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 1741 | dependencies = [ 1742 | "windows-link", 1743 | ] 1744 | 1745 | [[package]] 1746 | name = "windows-strings" 1747 | version = "0.4.2" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 1750 | dependencies = [ 1751 | "windows-link", 1752 | ] 1753 | 1754 | [[package]] 1755 | name = "windows-sys" 1756 | version = "0.52.0" 1757 | source = "registry+https://github.com/rust-lang/crates.io-index" 1758 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1759 | dependencies = [ 1760 | "windows-targets 0.52.6", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "windows-sys" 1765 | version = "0.59.0" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1768 | dependencies = [ 1769 | "windows-targets 0.52.6", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "windows-sys" 1774 | version = "0.60.2" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1777 | dependencies = [ 1778 | "windows-targets 0.53.3", 1779 | ] 1780 | 1781 | [[package]] 1782 | name = "windows-targets" 1783 | version = "0.52.6" 1784 | source = "registry+https://github.com/rust-lang/crates.io-index" 1785 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1786 | dependencies = [ 1787 | "windows_aarch64_gnullvm 0.52.6", 1788 | "windows_aarch64_msvc 0.52.6", 1789 | "windows_i686_gnu 0.52.6", 1790 | "windows_i686_gnullvm 0.52.6", 1791 | "windows_i686_msvc 0.52.6", 1792 | "windows_x86_64_gnu 0.52.6", 1793 | "windows_x86_64_gnullvm 0.52.6", 1794 | "windows_x86_64_msvc 0.52.6", 1795 | ] 1796 | 1797 | [[package]] 1798 | name = "windows-targets" 1799 | version = "0.53.3" 1800 | source = "registry+https://github.com/rust-lang/crates.io-index" 1801 | checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 1802 | dependencies = [ 1803 | "windows-link", 1804 | "windows_aarch64_gnullvm 0.53.0", 1805 | "windows_aarch64_msvc 0.53.0", 1806 | "windows_i686_gnu 0.53.0", 1807 | "windows_i686_gnullvm 0.53.0", 1808 | "windows_i686_msvc 0.53.0", 1809 | "windows_x86_64_gnu 0.53.0", 1810 | "windows_x86_64_gnullvm 0.53.0", 1811 | "windows_x86_64_msvc 0.53.0", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "windows_aarch64_gnullvm" 1816 | version = "0.52.6" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1819 | 1820 | [[package]] 1821 | name = "windows_aarch64_gnullvm" 1822 | version = "0.53.0" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 1825 | 1826 | [[package]] 1827 | name = "windows_aarch64_msvc" 1828 | version = "0.52.6" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1831 | 1832 | [[package]] 1833 | name = "windows_aarch64_msvc" 1834 | version = "0.53.0" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 1837 | 1838 | [[package]] 1839 | name = "windows_i686_gnu" 1840 | version = "0.52.6" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1843 | 1844 | [[package]] 1845 | name = "windows_i686_gnu" 1846 | version = "0.53.0" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 1849 | 1850 | [[package]] 1851 | name = "windows_i686_gnullvm" 1852 | version = "0.52.6" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1855 | 1856 | [[package]] 1857 | name = "windows_i686_gnullvm" 1858 | version = "0.53.0" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 1861 | 1862 | [[package]] 1863 | name = "windows_i686_msvc" 1864 | version = "0.52.6" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1867 | 1868 | [[package]] 1869 | name = "windows_i686_msvc" 1870 | version = "0.53.0" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 1873 | 1874 | [[package]] 1875 | name = "windows_x86_64_gnu" 1876 | version = "0.52.6" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1879 | 1880 | [[package]] 1881 | name = "windows_x86_64_gnu" 1882 | version = "0.53.0" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 1885 | 1886 | [[package]] 1887 | name = "windows_x86_64_gnullvm" 1888 | version = "0.52.6" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1891 | 1892 | [[package]] 1893 | name = "windows_x86_64_gnullvm" 1894 | version = "0.53.0" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 1897 | 1898 | [[package]] 1899 | name = "windows_x86_64_msvc" 1900 | version = "0.52.6" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1903 | 1904 | [[package]] 1905 | name = "windows_x86_64_msvc" 1906 | version = "0.53.0" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 1909 | 1910 | [[package]] 1911 | name = "wit-bindgen-rt" 1912 | version = "0.39.0" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 1915 | dependencies = [ 1916 | "bitflags", 1917 | ] 1918 | 1919 | [[package]] 1920 | name = "writeable" 1921 | version = "0.6.1" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 1924 | 1925 | [[package]] 1926 | name = "yoke" 1927 | version = "0.8.0" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 1930 | dependencies = [ 1931 | "serde", 1932 | "stable_deref_trait", 1933 | "yoke-derive", 1934 | "zerofrom", 1935 | ] 1936 | 1937 | [[package]] 1938 | name = "yoke-derive" 1939 | version = "0.8.0" 1940 | source = "registry+https://github.com/rust-lang/crates.io-index" 1941 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 1942 | dependencies = [ 1943 | "proc-macro2", 1944 | "quote", 1945 | "syn", 1946 | "synstructure", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "zerofrom" 1951 | version = "0.1.6" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 1954 | dependencies = [ 1955 | "zerofrom-derive", 1956 | ] 1957 | 1958 | [[package]] 1959 | name = "zerofrom-derive" 1960 | version = "0.1.6" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 1963 | dependencies = [ 1964 | "proc-macro2", 1965 | "quote", 1966 | "syn", 1967 | "synstructure", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "zeroize" 1972 | version = "1.8.1" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 1975 | 1976 | [[package]] 1977 | name = "zerotrie" 1978 | version = "0.2.2" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 1981 | dependencies = [ 1982 | "displaydoc", 1983 | "yoke", 1984 | "zerofrom", 1985 | ] 1986 | 1987 | [[package]] 1988 | name = "zerovec" 1989 | version = "0.11.4" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 1992 | dependencies = [ 1993 | "yoke", 1994 | "zerofrom", 1995 | "zerovec-derive", 1996 | ] 1997 | 1998 | [[package]] 1999 | name = "zerovec-derive" 2000 | version = "0.11.1" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2003 | dependencies = [ 2004 | "proc-macro2", 2005 | "quote", 2006 | "syn", 2007 | ] 2008 | --------------------------------------------------------------------------------