diff --git a/.cargo/config-portable.toml b/.cargo/config-portable.toml new file mode 100644 index 0000000..8f60b0a --- /dev/null +++ b/.cargo/config-portable.toml @@ -0,0 +1,14 @@ +# inspired by https://curiouscoding.nl/posts/release-flow/#avx2 + +# .cargo/config-portable.toml +[target.x86_64-unknown-linux-gnu] +rustflags = ["-C", "target-cpu=x86-64-v3", "-C", "target-feature=+avx2"] + +[target.aarch64-unknown-linux-gnu] +rustflags = ["-C", "target-cpu=neoverse-n1"] + +[target.aarch64-apple-darwin] +rustflags = ["-C", "target-cpu=apple-a14"] + +[target.x86_64-apple-darwin] +rustflags = ["-C", "target-cpu=x86-64-v3", "-C", "target-feature=+avx2"] diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..cb7e64c --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,4 @@ +# taken from https://curiouscoding.nl/posts/release-flow/#avx2 +[build] +# By default, we want maximum performance rather than portability. +rustflags = ["-C", "target-cpu=native"] diff --git a/.github/build-setup.yml b/.github/build-setup.yml new file mode 100644 index 0000000..e916387 --- /dev/null +++ b/.github/build-setup.yml @@ -0,0 +1,19 @@ +- name: Use portable Cargo config for CI builds + shell: bash + run: | + set -euo pipefail + cp .cargo/config-portable.toml .cargo/config.toml + +- name: Force AVX2 for x86_64 (via RUSTFLAGS) + if: contains(join(matrix.targets, ','), 'x86_64-') + shell: bash + run: | + set -euo pipefail + echo 'RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+avx2' >> "$GITHUB_ENV" + +- name: Show effective x86_64 rustflags (proof) + if: contains(join(matrix.targets, ','), 'x86_64-') + shell: bash + run: | + set -euo pipefail + echo "RUSTFLAGS=${RUSTFLAGS-}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f6b098f..6dc7e9d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -# This file was autogenerated by dist: https://opensource.axo.dev/cargo-dist/ +# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist # # Copyright 2022-2024, axodotdev # SPDX-License-Identifier: MIT or Apache-2.0 @@ -47,7 +47,7 @@ on: jobs: # Run 'dist plan' (or host) to determine what tasks we need to do plan: - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" outputs: val: ${{ steps.plan.outputs.manifest }} tag: ${{ !github.event.pull_request && github.ref_name || '' }} @@ -56,16 +56,17 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: + persist-credentials: false submodules: recursive - name: Install dist # we specify bash to get pipefail; it guards against the `curl` command # failing. otherwise `sh` won't catch that `curl` returned non-0 shell: bash - run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.24.1/cargo-dist-installer.sh | sh" + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.31.0/cargo-dist-installer.sh | sh" - name: Cache dist - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: cargo-dist-cache path: ~/.cargo/bin/dist @@ -81,7 +82,7 @@ jobs: cat plan-dist-manifest.json echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT" - name: "Upload dist-manifest.json" - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: artifacts-plan-dist-manifest path: plan-dist-manifest.json @@ -107,6 +108,7 @@ jobs: # - N "local" tasks that build each platform's binaries and platform-specific installers matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }} runs-on: ${{ matrix.runner }} + container: ${{ matrix.container && matrix.container.image || null }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json @@ -114,14 +116,39 @@ jobs: - name: enable windows longpaths run: | git config --global core.longpaths true - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: + persist-credentials: false submodules: recursive + - name: Install Rust non-interactively if not already installed + if: ${{ matrix.container }} + run: | + if ! command -v cargo > /dev/null 2>&1; then + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + fi + - name: "Use portable Cargo config for CI builds" + run: | + set -euo pipefail + cp .cargo/config-portable.toml .cargo/config.toml + shell: "bash" + - name: "Force AVX2 for x86_64 (via RUSTFLAGS)" + if: "contains(join(matrix.targets, ','), 'x86_64-')" + run: | + set -euo pipefail + echo 'RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+avx2' >> "$GITHUB_ENV" + shell: "bash" + - name: "Show effective x86_64 rustflags (proof)" + if: "contains(join(matrix.targets, ','), 'x86_64-')" + run: | + set -euo pipefail + echo "RUSTFLAGS=${RUSTFLAGS-}" + shell: "bash" - name: Install dist - run: ${{ matrix.install_dist }} + run: ${{ matrix.install_dist.run }} # Get the dist-manifest - name: Fetch local artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: artifacts-* path: target/distrib/ @@ -143,12 +170,12 @@ jobs: run: | # Parse out what we just built and upload it to scratch storage echo "paths<> "$GITHUB_OUTPUT" - jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT" + dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" cp dist-manifest.json "$BUILD_MANIFEST_NAME" - name: "Upload artifacts" - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: artifacts-build-local-${{ join(matrix.targets, '_') }} path: | @@ -160,23 +187,24 @@ jobs: needs: - plan - build-local-artifacts - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: + persist-credentials: false submodules: recursive - name: Install cached dist - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: cargo-dist-cache path: ~/.cargo/bin/ - run: chmod +x ~/.cargo/bin/dist # Get all the local artifacts for the global tasks to use (for e.g. checksums) - name: Fetch local artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: artifacts-* path: target/distrib/ @@ -194,7 +222,7 @@ jobs: cp dist-manifest.json "$BUILD_MANIFEST_NAME" - name: "Upload artifacts" - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: artifacts-build-global path: | @@ -206,26 +234,27 @@ jobs: - plan - build-local-artifacts - build-global-artifacts - # Only run if we're "publishing", and only if local and global didn't fail (skipped is fine) - if: ${{ always() && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} + # Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine) + if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" outputs: val: ${{ steps.host.outputs.manifest }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: + persist-credentials: false submodules: recursive - name: Install cached dist - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: cargo-dist-cache path: ~/.cargo/bin/ - run: chmod +x ~/.cargo/bin/dist # Fetch artifacts from scratch-storage - name: Fetch artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: artifacts-* path: target/distrib/ @@ -238,14 +267,14 @@ jobs: cat dist-manifest.json echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" - name: "Upload dist-manifest.json" - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: # Overwrite the previous copy name: artifacts-dist-manifest path: dist-manifest.json # Create a GitHub Release while uploading all files to it - name: "Download GitHub Artifacts" - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: artifacts-* path: artifacts @@ -274,10 +303,11 @@ jobs: # still allowing individual publish jobs to skip themselves (for prereleases). # "host" however must run to completion, no skipping allowed! if: ${{ always() && needs.host.result == 'success' }} - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: + persist-credentials: false submodules: recursive diff --git a/.github/workflows/sanitize-cargo.yml b/.github/workflows/sanitize-cargo.yml new file mode 100644 index 0000000..b9722db --- /dev/null +++ b/.github/workflows/sanitize-cargo.yml @@ -0,0 +1,38 @@ +name: Sanitize Cargo +on: + push: + branches: + - main + +permissions: + "contents": "write" + +jobs: + sanitize_cargo_file: + if: "contains(github.event.head_commit.message, '[do_tag]')" + runs-on: ubuntu-latest + # This is optional; it exposes the plan to your job as an environment variable + #env: + # PLAN: ${{ inputs.plan }} + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.PAT_TOK }} + - uses: dtolnay/rust-toolchain@stable + - name: Install cargo-sanitize + run: | + cargo install cargo-sanitize + - name: Sanitize Cargo.toml file + run: | + cp Cargo.toml Cargo.toml.cs_orig + cargo-sanitize -i Cargo.toml.cs_orig -o Cargo.toml + - name: Tag and push new commit + run: | + export VERSION_TAG=`cargo read-manifest | jq ".version" | tr -d '"'` + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add Cargo.toml.cs_orig + git add Cargo.toml + git commit -m "create sanitized release" + git tag --force -a v${VERSION_TAG} -m "version ${VERSION_TAG}" + git push --force origin v${VERSION_TAG} diff --git a/.gitignore b/.gitignore index 088ba6b..1c0a2c9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,14 @@ Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk + +# Local cargo config (contains dev-only [patch] overrides) +# .cargo/config.toml +radtk/ +gencode_v49/ +gencode_v49_new/ +piscem-cpp/ +sshash/ +sample_quant_new/ +sample_quant/ + diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 34a485a..0000000 --- a/.gitmodules +++ /dev/null @@ -1,8 +0,0 @@ -[submodule "cuttlefish"] - path = cuttlefish - url = https://github.com/COMBINE-lab/cuttlefish.git - branch = develop -[submodule "piscem-cpp"] - path = piscem-cpp - url = https://github.com/COMBINE-lab/piscem-cpp.git - branch = dev diff --git a/Cargo.lock b/Cargo.lock index 8284e23..28aa0dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,27 +1,70 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "ambassador" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8184c5d23ba3829fb1e93388d776c3469cd9f4162af65250490b4f22d3ecf614" +dependencies = [ + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -34,49 +77,95 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arbitrary-chunks" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad8689a486416c401ea15715a4694de30054248ec627edbf31f49cb64ee4086" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bgzip" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64fd8980fb64af5951bc05de7772b598150a6f7eac42ec17f73e8489915f99b" +dependencies = [ + "flate2", + "log", + "rayon", + "thiserror 1.0.69", +] + +[[package]] +name = "binout" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "222fb4925a15bea6a68075021910e03d6aa2d04951d71ff1d956190a551d738f" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "bitm" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31468ea4a856000d83cb61960dfdc2980ecd96b15b61321c8c76cc96aea6e688" +dependencies = [ + "dyn_size_of", +] [[package]] name = "block-buffer" @@ -87,20 +176,79 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-pseudorand" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2097358495d244a0643746f4d13eedba4608137008cf9dec54e53a3b700115a6" +dependencies = [ + "chiapos-chacha8", + "nanorand", +] + +[[package]] +name = "bon" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d13a61f2963b88eef9c1be03df65d42f6996dfeac1054870d950fcf66686f83" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d314cc62af2b6b0c65780555abb4d02a03dd3b799cd42419044f0c38d99738c0" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.117", +] + [[package]] name = "buffer-redux" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e8acf87c5b9f5897cd3ebb9a327f420e0cae9dd4e5c1d2e36f2c84c571a58f1" +checksum = "431a9cc8d7efa49bc326729264537f5e60affce816c66edf434350778c9f4f54" dependencies = [ "memchr", ] +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + [[package]] name = "bytecount" -version = "0.6.8" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bzip2" @@ -112,37 +260,133 @@ dependencies = [ "libc", ] +[[package]] +name = "bzip2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +dependencies = [ + "bzip2-sys", +] + [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" -version = "1.2.1" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cf1-rs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b524c5080e7ce00133150adeae6c63817a36fdf398788f183dd83cadf264c995" +dependencies = [ + "ahash", + "anyhow", + "bon", + "clap", + "crossbeam-channel", + "itoa", + "libc", + "needletail", + "nohash-hasher", + "ph", + "rayon", + "serde", + "serde_json", + "simd-minimizers", + "tracing", + "tracing-subscriber", + "voracious_radix_sort", + "xxhash-rust", +] + [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + +[[package]] +name = "chiapos-chacha8" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f8be573a85f6c2bc1b8e43834c07e32f95e489b914bf856c0549c3c269cd0a" +dependencies = [ + "rayon", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] [[package]] name = "clap" -version = "4.5.21" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" dependencies = [ "clap_builder", "clap_derive", @@ -150,9 +394,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" dependencies = [ "anstream", "anstyle", @@ -163,672 +407,2719 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "clap_lex" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" - -[[package]] -name = "cmake" -version = "0.1.52" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" -dependencies = [ - "cc", -] +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] -name = "cpufeatures" -version = "0.2.16" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "libc", + "bytes", + "memchr", ] [[package]] -name = "crc32fast" -version = "1.4.2" +name = "common_traits" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "13e7c3f277f252af0ff02a8558072a39dadf0a38a21ce24e2bb8be08b55d8db4" dependencies = [ - "cfg-if", + "anyhow", + "half", + "impl-tools", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "console" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" dependencies = [ - "generic-array", - "typenum", + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.61.2", ] [[package]] -name = "digest" -version = "0.10.7" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "block-buffer", - "crypto-common", + "libc", ] [[package]] -name = "errno" -version = "0.3.9" +name = "cpufeatures" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", - "windows-sys 0.52.0", ] [[package]] -name = "flate2" -version = "1.0.35" +name = "crc32fast" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ - "crc32fast", - "miniz_oxide", + "cfg-if", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "criterion" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ - "typenum", - "version_check", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", ] [[package]] -name = "heck" +name = "criterion-plot" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] [[package]] -name = "hermit-abi" -version = "0.3.9" +name = "crossbeam" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] [[package]] -name = "hex" -version = "0.4.3" +name = "crossbeam-channel" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] [[package]] -name = "itoa" -version = "1.0.14" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "crossbeam-queue" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "libc" -version = "0.2.166" +name = "crossbeam-utils" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "log" -version = "0.4.22" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] [[package]] -name = "lzma-sys" -version = "0.1.20" +name = "darling" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "cc", - "libc", - "pkg-config", + "darling_core", + "darling_macro", ] [[package]] -name = "matchers" -version = "0.1.0" +name = "darling_core" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ - "regex-automata 0.1.10", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "darling_macro" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] [[package]] -name = "miniz_oxide" -version = "0.8.0" +name = "dashmap" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ - "adler2", + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", ] [[package]] -name = "needletail" -version = "0.5.1" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db05a5ab397f64070d8c998fa0fbb84e484b81f95752af317dac183a82d9295d" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "buffer-redux", - "bytecount", - "bzip2", - "flate2", - "memchr", - "xz2", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "derive_setters" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "b7e6f6fa1f03c14ae082120b84b3c7fbd7b8588d924cf2d7c3daf9afd49df8b9" dependencies = [ - "overload", - "winapi", + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "hermit-abi", - "libc", + "block-buffer", + "crypto-common", ] [[package]] -name = "once_cell" -version = "1.20.2" +name = "dsi-progress-logger" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "cc2f08728b2005dd95f078e2d775a91b5339839833057b6404b58f47e6ee6ac5" +dependencies = [ + "log", + "num-format", + "pluralizer", + "sysinfo", +] [[package]] -name = "overload" -version = "0.1.1" +name = "dyn_size_of" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "4a742b95783b1f45b900129082cbc47717b6a77ee8d17eea70a8ea62462f5de3" [[package]] -name = "pin-project-lite" -version = "0.2.15" +name = "either" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "piscem" -version = "0.10.4" -dependencies = [ - "anyhow", - "clap", - "cmake", - "num_cpus", - "prepare_fasta", - "tracing", - "tracing-subscriber", -] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] -name = "pkg-config" -version = "0.3.31" +name = "ensure_simd" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "c45a25613230d2ee8b1b68510f44ed8d765b6ef9a597d9ad5489e3d0ddfdc61d" [[package]] -name = "prepare_fasta" -version = "0.1.0" +name = "enum-as-inner" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2c44a55de0fea1622a4098ba1c17515f5e01620f7e5f32614d4a63f6e5d1cc" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "anyhow", - "clap", - "flate2", - "hex", - "needletail", - "serde_json", - "sha2", + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] -name = "proc-macro2" -version = "1.0.92" +name = "env_filter" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" dependencies = [ - "unicode-ident", + "log", + "regex", ] [[package]] -name = "quote" -version = "1.0.37" +name = "env_logger" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" dependencies = [ - "proc-macro2", + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", ] [[package]] -name = "regex" -version = "1.11.1" +name = "epserde" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "a441aa9a006660c0e6d0de7fe400f1f0f8c7e62a010bdb06671af32b16846508" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "anyhow", + "bitflags", + "common_traits", + "epserde-derive", + "mem_dbg 0.4.0", + "mmap-rs", + "sealed", + "thiserror 2.0.18", + "xxhash-rust", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "epserde-derive" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "0f0abf4e914634a1b4bb35f55d648bb6c7d180b50f599c3864411d07d277194a" dependencies = [ - "regex-syntax 0.6.29", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] -name = "regex-automata" -version = "0.4.9" +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "fallible-iterator" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] -name = "regex-syntax" -version = "0.8.5" +name = "fastrand" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] -name = "rustix" -version = "0.38.41" +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "crc32fast", + "miniz_oxide", + "zlib-rs", ] [[package]] -name = "ryu" -version = "1.0.18" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "serde" -version = "1.0.215" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" -dependencies = [ - "serde_derive", -] +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "serde_derive" -version = "1.0.215" +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "proc-macro2", - "quote", - "syn", + "typenum", + "version_check", ] [[package]] -name = "serde_json" -version = "1.0.133" +name = "getrandom" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", + "cfg-if", + "libc", + "r-efi", + "wasip2", ] [[package]] -name = "sha2" -version = "0.10.8" +name = "getrandom" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" dependencies = [ "cfg-if", - "cpufeatures", - "digest", - "sha2-asm", + "libc", + "r-efi", + "rand_core 0.10.0", + "wasip2", + "wasip3", ] [[package]] -name = "sha2-asm" -version = "0.6.4" +name = "half" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b845214d6175804686b2bd482bcffe96651bb2d1200742b712003504a2dac1ab" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ - "cc", + "cfg-if", + "crunchy", + "zerocopy", ] [[package]] -name = "sharded-slab" -version = "0.1.7" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "lazy_static", + "foldhash 0.1.5", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] [[package]] -name = "smallvec" -version = "1.13.2" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "strsim" -version = "0.11.1" +name = "hermit-abi" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] -name = "syn" -version = "2.0.89" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "terminal_size" -version = "0.4.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef" -dependencies = [ - "rustix", - "windows-sys 0.59.0", -] +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] -name = "thread_local" -version = "1.1.8" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "tracing" -version = "0.1.40" +name = "impl-tools" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "0ae314a99afb5821e2fda288387546d4a04aace674551e854e6216b892ec3208" dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", + "autocfg", + "impl-tools-lib", + "proc-macro-error2", + "syn 2.0.117", ] [[package]] -name = "tracing-attributes" -version = "0.1.28" +name = "impl-tools-lib" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "ab699036df31c1f7d3561bfa6e9cb9bc3bb0fd2e2cd9bf121c31cb961d049ddf" dependencies = [ + "proc-macro-error2", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] -name = "tracing-core" -version = "0.1.33" +name = "indexmap" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ - "once_cell", - "valuable", + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] -name = "tracing-log" -version = "0.2.0" +name = "indicatif" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" dependencies = [ - "log", - "once_cell", - "tracing-core", + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", ] [[package]] -name = "tracing-subscriber" -version = "0.3.18" +name = "is-terminal" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", + "hermit-abi", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "typenum" -version = "1.17.0" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] -name = "unicode-ident" -version = "1.0.14" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] [[package]] -name = "utf8parse" -version = "0.2.2" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] [[package]] -name = "valuable" -version = "0.1.0" +name = "itoa" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] -name = "version_check" -version = "0.9.5" +name = "jiff" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "b3e3d65f018c6ae946ab16e80944b97096ed73c35b221d1c478a6c81d8f57940" +dependencies = [ + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-sys 0.61.2", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "jiff-static" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "a17c2b211d863c7fde02cbea8a3c1a439b98e109286554f2860bdded7ff83818" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "jiff-tzdb" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "jiff-tzdb-platform" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] [[package]] -name = "windows-sys" -version = "0.52.0" +name = "jobserver" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "windows-targets", + "getrandom 0.3.4", + "libc", ] [[package]] -name = "windows-sys" -version = "0.59.0" +name = "js-sys" +version = "0.3.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f4eacb0641a310445a4c513f2a5e23e19952e269c6a38887254d5f837a305506" dependencies = [ - "windows-targets", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "windows-targets" -version = "0.52.6" +name = "lambert_w" +version = "1.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "f5f0846ee4f0299ca4c5b9ca06ff55cf88b3430a763bf591474cc734479c9b24" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "num-complex", + "num-traits", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] -name = "windows_i686_gnu" -version = "0.52.6" +name = "lender" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "aeed4888de4544bf3ba2e111326978dbcc37f57bf2c7d6a6a78ed6c01f77ef93" +dependencies = [ + "aliasable", + "fallible-iterator", + "lender-derive", + "maybe-dangling", + "stable_try_trait_v2", +] [[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" +name = "lender-derive" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "d074a297c82222d442171bad4f392fef93d35fb31e24a115f605a0c907ce0af9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] -name = "windows_i686_msvc" -version = "0.52.6" +name = "libc" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" +name = "liblzma" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "a631d2b24be269775ba8f7789a6afa1ac228346a20c9e87dbbbe4975a79fd764" +dependencies = [ + "liblzma-sys", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "liblzma-sys" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efdadf1a99aceff34553de1461674ab6ac7e7f0843ae9875e339f4a14eb43475" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "libmimalloc-sys" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" +dependencies = [ + "cc", + "libc", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "linux-raw-sys" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "xz2" -version = "0.1.7" +name = "lock_api" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "lzma-sys", + "scopeguard", ] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "maybe-dangling" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59dbb09ed53f8e4f314e353dc6c1853ae5b4c480a668a422657804a544ea9f65" + +[[package]] +name = "mem_dbg" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728cc9dc97593cd22f7bc81fbef70a2d391d7a9a855e7d658b653318124a6cf0" +dependencies = [ + "bitflags", + "mem_dbg-derive 0.2.1", +] + +[[package]] +name = "mem_dbg" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef3b1b6f145e29e92dc3d18245560275569e34bcde7f53262cb25b49f084166" +dependencies = [ + "bitflags", + "hashbrown 0.16.1", + "mem_dbg-derive 0.3.0", + "mmap-rs", +] + +[[package]] +name = "mem_dbg-derive" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84f40c93b0508d5565db79a814d02d5b2545967205ce44be211592aafa34d6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mem_dbg-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8390caa039976e204779bd54284d813fba2625f14d1f7ff568a2ea14646539" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "mimalloc" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mmap-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ecce9d566cb9234ae3db9e249c8b55665feaaf32b0859ff1e27e310d2beb3d8" +dependencies = [ + "bitflags", + "combine", + "libc", + "mach2", + "nix", + "sysctl", + "thiserror 2.0.18", + "widestring", + "windows 0.48.0", +] + +[[package]] +name = "nanorand" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729eb334247daa1803e0a094d0a5c55711b85571179f5ec6e53eccfdf7008958" + +[[package]] +name = "needletail" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa22e1ae8bce4ecf257e2475ef2046026caea08d66b1848d073fe7bc77e4351" +dependencies = [ + "buffer-redux", + "bytecount", + "bzip2 0.4.4", + "flate2", + "liblzma", + "memchr", + "zstd", +] + +[[package]] +name = "niffler" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d3115cc93dac9fabdfd25f7d4fda51ad4a959fb4667d39af20f70bddfb3574" +dependencies = [ + "bgzip", + "bzip2 0.5.2", + "cfg-if", + "flate2", + "liblzma", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec", + "itoa", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "packed-seq" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dabfead55492c45dbd560d8f057d45a701e78412f4a97a043583b7d745ce899" +dependencies = [ + "cfg-if", + "ensure_simd", + "mem_dbg 0.3.4", + "rand 0.9.2", + "wide", +] + +[[package]] +name = "paraseq" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8bd9a3e86bdab599f10d07e7d7531b7363e1d50b502856c0fb0b3efc532e65" +dependencies = [ + "anyhow", + "crossbeam-channel", + "either", + "env_logger", + "itertools 0.14.0", + "log", + "memchr", + "niffler", + "num_cpus", + "parking_lot", + "smallvec", + "thiserror 2.0.18", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "partition" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "947f833aaa585cf12b8ec7c0476c98784c49f33b861376ffc84ed92adebf2aba" + +[[package]] +name = "path-tools" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cbc2d27ab7424ba124b691f0abb77ff27474c3eaa7478baf50600fa67c3677c" + +[[package]] +name = "ph" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a447f203c7254ebb06aa4f111480e821debb361e80fb4d760554a8460f236550" +dependencies = [ + "arrayvec", + "binout", + "bitm", + "dyn_size_of", + "rayon", + "seedable_hash", + "voracious_radix_sort", +] + +[[package]] +name = "ph-temp" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cb0fa95e664d4297f5fde759717ac83cee707fc49b6a43e1da96fca818ec57" +dependencies = [ + "arrayvec", + "binout", + "bitm", + "dyn_size_of", + "rayon", + "seedable_hash", + "voracious_radix_sort", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "piscem" +version = "0.16.1" +dependencies = [ + "anyhow", + "cf1-rs", + "clap", + "mimalloc", + "num_cpus", + "piscem-rs", + "prepare_fasta", + "serde_json", + "toml", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "piscem-rs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df48d17270a97a152e845830deba82249f6b0b3756cbdcffed5e2bd20de05b1b" +dependencies = [ + "ahash", + "anyhow", + "clap", + "crossbeam", + "dashmap", + "epserde", + "flate2", + "indicatif", + "mem_dbg 0.4.0", + "mimalloc", + "niffler", + "paraseq", + "serde", + "serde_json", + "smallvec", + "sshash-lib", + "sux", + "tracing", + "tracing-subscriber", + "value-traits", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "pluralizer" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b3eba432a00a1f6c16f39147847a870e94e2e9b992759b503e330efec778cbe" +dependencies = [ + "once_cell", + "regex", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prepare_fasta" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6282aa4eb898cdf6d236ef4a68cdde2ad0985c53f01be4e785ec5b761d62e796" +dependencies = [ + "anyhow", + "clap", + "flate2", + "hex", + "needletail", + "path-tools", + "serde_json", + "sha2", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.1", + "rand_core 0.10.0", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "rapidhash" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9813f789f95ee4fe6b4d01834404d7cccacbc3f6c029343af910b3c2835eb9f1" + +[[package]] +name = "rapidhash" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" +dependencies = [ + "rustversion", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rdst" +version = "0.20.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7970b4e577b76a96d5e56b5f6662b66d1a4e1f5bb026ee118fc31b373c2752" +dependencies = [ + "arbitrary-chunks", + "block-pseudorand", + "criterion", + "partition", + "rayon", + "tikv-jemallocator", + "voracious_radix_sort", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sealed" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "seedable_hash" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2a159211665e29bbf5a2fbb42da50dd6eadff23eef7a6a7ae4a9b0a7cd0152" +dependencies = [ + "rapidhash 1.4.0", + "wyhash", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "seq-hash" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b3b0c10f709f85cc44db7d54a0e300093757340b532aa7728b6212ccfebae2" +dependencies = [ + "packed-seq", + "wide", +] + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", + "sha2-asm", +] + +[[package]] +name = "sha2-asm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b845214d6175804686b2bd482bcffe96651bb2d1200742b712003504a2dac1ab" +dependencies = [ + "cc", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simd-minimizers" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d337c81bca2fc990b480ed2fe3421c66227e4ca427a9b9d7cfcfe97e9b4f986" +dependencies = [ + "clap", + "itertools 0.14.0", + "packed-seq", + "seq-hash", + "wide", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "sshash-lib" +version = "0.3.2" +dependencies = [ + "anyhow", + "epserde", + "mem_dbg 0.4.0", + "memmap2", + "needletail", + "ph-temp", + "rapidhash 4.4.1", + "rayon", + "seq-macro", + "sux", + "thiserror 2.0.18", + "tracing", + "value-traits", +] + +[[package]] +name = "stable_try_trait_v2" +version = "1.75.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4e48411f4db8ccca0470bfb67e3bb821af4227d455aa147917d8d109be0d13" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "sux" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ac8c22eb51ce4636502b5c2859249ee2d2b9bb0cfad6dc1eede23768179860" +dependencies = [ + "ambassador", + "anyhow", + "arbitrary-chunks", + "bitflags", + "common_traits", + "crossbeam-channel", + "derivative", + "derive_setters", + "dsi-progress-logger", + "env_logger", + "epserde", + "fallible-iterator", + "flate2", + "impl-tools", + "itertools 0.14.0", + "jiff", + "lambert_w", + "lender", + "libc", + "log", + "mem_dbg 0.4.0", + "rand 0.10.0", + "rayon", + "rdst", + "tempfile", + "thiserror 2.0.18", + "thread-priority", + "value-traits", + "xxhash-rust", + "zerocopy", + "zstd", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "sysinfo" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows 0.61.3", +] + +[[package]] +name = "tempfile" +version = "3.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix", + "windows-sys 0.60.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread-priority" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210811179577da3d54eb69ab0b50490ee40491a25d95b8c6011ba40771cb721" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.61.3", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.5.4+5.3.0-patched" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9402443cb8fd499b6f327e40565234ff34dbda27460c5b47db0db77443dd85d1" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965fe0c26be5c56c94e38ba547249074803efd52adfb66de62107d95aab3eaca" +dependencies = [ + "libc", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-traits" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e73c7053d8fa8e9c3c6b16c32d079ed5642a7156514820486a9c4e109cf48d" +dependencies = [ + "value-traits-derive", +] + +[[package]] +name = "value-traits-derive" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d301d1ee4b3eced3e73aa5740a303c7e068f1d4450c5dae4c8cf6bfa266954f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "voracious_radix_sort" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446e7ffcb6c27a71d05af7e51ef2ee5b71c48424b122a832f2439651e1914899" +dependencies = [ + "rayon", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d7d0fce354c88b7982aec4400b3e7fcf723c32737cef571bd165f7613557ee" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55839b71ba921e4f75b674cb16f843f4b1f3b26ddfcb3454de1cf65cc021ec0f" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf2e969c2d60ff52e7e98b7392ff1588bffdd1ccd4769eba27222fd3d621571" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0861f0dcdf46ea819407495634953cdcc8a8c7215ab799a7a7ce366be71c7b30" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10053fbf9a374174094915bbce141e87a6bf32ecd9a002980db4b638405e8962" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wide" +version = "0.7.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "wyhash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf6e163c25e3fac820b4b453185ea2dea3b6a3e0a721d4d23d75bd33734c295" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zlib-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c745c48e1007337ed136dc99df34128b9faa6ed542d80a1c673cf55a6d7236c8" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[patch.unused]] +name = "libradicl" +version = "0.11.0" +source = "git+https://github.com/COMBINE-lab/libradicl.git?branch=develop#5a2f8e8aa6973debaad40748d2b9f19ac1a4b6ce" diff --git a/Cargo.toml b/Cargo.toml index 0f99ee9..5a39d0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,29 +1,39 @@ +[workspace] + [package] name = "piscem" -version = "0.11.0" -edition = "2021" +version = "0.16.2" +edition = "2024" build = "build.rs" +license = "BSD-3-Clause" +description = "Fast, space-efficient k-mer-based read mapper for bulk RNA-seq, scRNA-seq, and scATAC-seq" repository = "https://github.com/COMBINE-lab/piscem" +homepage = "https://github.com/COMBINE-lab/piscem" +readme = "README.md" +keywords = ["bioinformatics", "genomics", "rna-seq", "mapping", "kmer"] +categories = ["command-line-utilities", "science"] [build-dependencies] -cmake = "0.1.52" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +toml = "0.8" [dependencies] -num_cpus = "1.16.0" -anyhow = "1.0.93" -clap = { version = "4.5.21", features = [ +piscem-rs = "0.1.0" +cf1-rs = "0.3.1" +num_cpus = "1.17.0" +anyhow = "1.0.100" +clap = { version = "4.5.56", features = [ "cargo", "derive", "env", "wrap_help", ] } -tracing = "0.1.40" -tracing-subscriber = { version = "0.3.18", default-features = true, features = [ +tracing = "0.1.44" +tracing-subscriber = { version = "0.3.22", default-features = true, features = [ "env-filter", ] } -prepare_fasta = "0.1.0" +prepare_fasta = { version = "0.2.0" } +serde_json = "1.0.149" +mimalloc = "0.1" [profile.release] lto = "thin" @@ -32,65 +42,3 @@ opt-level = 3 # generated by 'cargo dist init' [profile.dist] inherits = "release" - -# Config for 'dist' -[workspace.metadata.dist] -# The preferred dist version to use in CI (Cargo.toml SemVer syntax) -cargo-dist-version = "0.24.1" -# The installers to generate for each app -installers = ["shell"] -# Target platforms to build apps for (Rust target-triple syntax) -targets = [ - "aarch64-apple-darwin", - "x86_64-apple-darwin", - "x86_64-unknown-linux-gnu", -] -# The archive format to use for non-windows builds (defaults .tar.xz) -unix-archive = ".tar.gz" -# CI backends to support -ci = "github" -# Which actions to run on pull requests -pr-run-mode = "plan" -# Whether to install an updater program -install-updater = true -# Generate and dist a source tarball -source-tarball = false -# Path that installers should place binaries in -install-path = "CARGO_HOME" -## since this is cross-language and -## we are not including C++ debug -## symbols, this currently doesn't work -## and would be of limited utility anyway. -# debug = true -# split-debuginfo = "packed" - -[[workspace.metadata.dist.extra-artifacts]] -artifacts = ["source.tar.gz", "source.tar.gz.sha256"] -build = [ - "bash", - "scripts/git-archive-all.sh", - "--format", - "tar.gz", - "--prefix", - "piscem/", - "source.tar.gz", -] - -[workspace.metadata.dist.github-custom-runners] -aarch64-apple-darwin = "macos-14" - -[workspace.metadata.dist.dependencies.homebrew] -autoconf = { version = "2.72", stage = [ - "build", - "run", -], targets = [ - "aarch64-apple-darwin", -] } -automake = { version = "1.16.5", stage = [ - "build", - "run", -], targets = [ - "aarch64-apple-darwin", -] } -coreutils = { stage = ["build"] } -gnu-tar = { stage = ["build"] } diff --git a/README.md b/README.md index 7541021..f66fa1a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # piscem -`piscem` is a rust wrapper for a next-generation index + mapper tool (still currently written in C++17). +`piscem` is a rust wrapper for a next-generation index + mapper tool consisting of a compacted de Bruijn graph constructor (with tiling information), and a very efficient index and read mapper. Notes ===== - - If you are primarily interested in simply *using* `piscem`, you can obtain pre-compiled binaries from the GitHub [releases](https://github.com/COMBINE-lab/piscem/releases/tag/v0.10.3) page + - If you are primarily interested in simply *using* `piscem`, you can obtain pre-compiled binaries from the GitHub [releases](https://github.com/COMBINE-lab/piscem/releases/tag/v0.16.2) page for linux x86-64, OSX x86-64, and OSX ARM. Likewise, `piscem` can be installed using [bioconda](https://bioconda.github.io/recipes/piscem/README.html). The instructions below are primarily for those who need to *build* `piscem` from source. @@ -22,51 +22,18 @@ before running `piscem`. Building ======== -This repository currently pulls in (as submodules) `piscem-cpp` and `cuttlefish`, and then uses cargo + the cmake crate to build the C++ code. It then calls out to the main C++ function from `main.rs`. The idea is that in this framework, code can slowly be migrated from C++ -> Rust in a piecemeal fashion, while the overall top-level repo remains a "rust build". Importantly, `piscem` unifies and simplifies the other tools, making them runnable via a single executable and providing an improved command line interface. - To build `piscem`, first check out this repository **with recursive dependencies**: ``` -git clone --recursive https://github.com/COMBINE-lab/piscem.git -``` - -if you have accidentally checked out the repo without the `--recursive` flag, you can change into the top-level directory and run: - -``` -git submodule update --init --recursive +git clone https://github.com/COMBINE-lab/piscem.git ``` Once you have checked out the repository, you can build `piscem` with ``` -cargo build --release +RUSTFLAGS="-C target-cpu=native" cargo build --release ``` -It is worth noting that the build process respects the `CC` and `CXX` environment flags, so if you wish to use a specific C++ compiler, you can run: - -``` -CC= CXX= cargo build --release -``` - -Compling this code requires a C++17 capable compiler, so if your default compiler does not have these capabilities, please be sure to pass the appropriate -flags along to `cargo build` with a sufficiently capable compiler. - -Other details about building ----------------------------- - -The build process requries access to static libraries for both `zlib` and `libbz2`. If these are not in your standard path, you can provide them via the `RUSTFLAGS` option as: - -``` -RUSTFLAGS='-L ' cargo build --release -``` - -Finally, on some systems, you may get a strange linking error related to relocatable symbols. In that case, you can pass the `NOPIE` option to the build process as follows: - -``` -NOPIE=TRUE cargo build --release -``` - -Note that the `CC`, `CXX`, `RUSTFLAGS` and `NOPIE` environment variables are all "stackable" and you can provide any subset of them that you need during build. Usage ===== @@ -96,9 +63,6 @@ Info for different sub-commands build ----- -> **Note** -> Since the build process makes use of [KMC3](https://github.com/refresh-bio/KMC) for a k-mer enumeration step, which, in turn, makes use of intermediate files to keep memory usage low, **you will likely need to increase the default number of file handles that can be open at once**. Before running the `build` command, you can do this by running `ulimit -n 2048` in the terminal where you execute the `build` command. You can also put this command in any script that you will use to run `piscem build`, or add it to your shell initalization scripts / profiles so that it is the default for new shells that you start - The build subcommand indexes one or more reference sequences, building a piscem index over them. The usage for the command is as so: ``` diff --git a/build.rs b/build.rs index 28e69cf..c10c877 100644 --- a/build.rs +++ b/build.rs @@ -1,152 +1,15 @@ -use cmake::Config; -use std::env; - fn main() { - let custom_cc = env::var("CC"); - let custom_cxx = env::var("CXX"); - let conda_build = env::var("CONDA_BUILD"); - let nopie_build = env::var("NOPIE"); - let nobmi2_var = env::var("NO_BMI2"); - - let is_conda_build = match conda_build { - Ok(val) => match val.to_uppercase().as_str() { - "TRUE" | "1" | "YES" => true, - "FALSE" | "0" | "NO" => false, - _ => true, - }, - Err(_e) => false, - }; - - println!("cargo:rerun-if-changed=cuttlefish/CMakeLists.txt"); - println!("cargo:rerun-if-changed=piscem-cpp/CMakeLists.txt"); - - let mut cfg_piscem_cpp = Box::new(Config::new("piscem-cpp")); - let mut cfg_cf = Box::new(Config::new("cuttlefish")); - - (*cfg_cf).define("INSTANCE_COUNT", "32"); - if let Ok(cc_var) = custom_cc { - (*cfg_piscem_cpp).define("CMAKE_C_COMPILER", cc_var.clone()); - (*cfg_cf).define("CMAKE_C_COMPILER", cc_var); - } - - if let Ok(cxx_var) = custom_cxx { - (*cfg_piscem_cpp).define("CMAKE_CXX_COMPILER", cxx_var.clone()); - (*cfg_cf).define("CMAKE_CXX_COMPILER", cxx_var); - } - - if is_conda_build { - (*cfg_cf).define("CONDA_BUILD", "TRUE"); - (*cfg_cf).define("CMAKE_OSX_DEPLOYMENT_TARGET", "10.15"); - (*cfg_cf).define("MACOSX_SDK_VERSION", "10.15"); - } - - if let Ok(nobmi2) = nobmi2_var { - match nobmi2.as_str() { - "1" | "TRUE" | "true" | "True" => { - (*cfg_piscem_cpp).define("NO_BMI2", "TRUE"); - } - _ => {} - } - } - - (*cfg_piscem_cpp).always_configure(false); - (*cfg_cf).always_configure(false); - - let dst_piscem_cpp = (*cfg_piscem_cpp).build(); - let dst_cf = (*cfg_cf).build(); - - if let Ok(nopie) = nopie_build { - match nopie.as_str() { - "1" | "TRUE" | "true" | "True" => { - println!("cargo:rustc-link-arg=-no-pie"); - } - _ => {} - } - } - - println!( - "cargo:rustc-link-search=native={}", - dst_cf.join("lib").display() - ); - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("lib").display() - ); - - // For some reason, if we are using - // *some* linux distros (and on conda) and are - // building for the linux target; - // things get put in the lib64 directory - // rather than lib... So, we add that here - println!( - "cargo:rustc-link-search=native={}", - dst_cf.join("lib64").display() - ); - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("lib64").display() - ); - let profile = std::env::var("PROFILE").unwrap(); - match profile.as_str() { - "debug" => { - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Debug").join("lib64").display() - ); - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Debug").join("lib").display() - ); - } - "release" => { - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Release").join("lib64").display() - ); - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Release").join("lib").display() - ); - } - _ => (), - } - - let profile = std::env::var("PROFILE").unwrap(); - match profile.as_str() { - "debug" => { - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Debug").join("lib64").display() - ); - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Debug").join("lib").display() - ); - } - "release" => { - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Release").join("lib64").display() - ); - println!( - "cargo:rustc-link-search=native={}", - dst_piscem_cpp.join("Release").join("lib").display() - ); - } - _ => (), - } - - println!("cargo:rustc-link-lib=static=kmc_core"); - //println!("cargo:rustc-link-lib=static=pesc_static"); - //println!("cargo:rustc-link-lib=static=build_static"); - println!("cargo:rustc-link-lib=static=sshash_static"); - println!("cargo:rustc-link-lib=static=zcf"); - println!("cargo:rustc-link-lib=static=bz2"); - println!("cargo:rustc-link-lib=static=radicl"); - - #[cfg(target_os = "linux")] - println!("cargo:rustc-link-lib=dylib=stdc++"); - - #[cfg(target_os = "macos")] - println!("cargo:rustc-link-lib=dylib=c++"); + // Extract cf1-rs version from Cargo.lock so we can embed it in the version JSON. + let lock_contents = + std::fs::read_to_string("Cargo.lock").expect("Failed to read Cargo.lock"); + let lock: toml::Value = lock_contents.parse().expect("Failed to parse Cargo.lock"); + let version = lock["package"] + .as_array() + .unwrap() + .iter() + .find(|p| p["name"].as_str() == Some("cf1-rs")) + .and_then(|p| p["version"].as_str()) + .unwrap_or("unknown"); + println!("cargo:rustc-env=CF1_RS_VERSION={version}"); + println!("cargo:rerun-if-changed=Cargo.lock"); } diff --git a/clean_build.sh b/clean_build.sh index 8583f96..d5de79e 100755 --- a/clean_build.sh +++ b/clean_build.sh @@ -2,9 +2,5 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -echo "cleaning external dependency directories of cuttlefish and piscem-cpp." -rm -fr ${SCRIPT_DIR}/cuttlefish/external/* -rm -fr ${SCRIPT_DIR}/piscem-cpp/external/zlib-cloudflare - echo "invoking cargo clean" cargo clean --target-dir ${SCRIPT_DIR}/target diff --git a/cuttlefish b/cuttlefish deleted file mode 160000 index e24249c..0000000 --- a/cuttlefish +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e24249cfd4566ad74ec02870af5c0a7069f738e2 diff --git a/dist-workspace.toml b/dist-workspace.toml new file mode 100644 index 0000000..05f0fe0 --- /dev/null +++ b/dist-workspace.toml @@ -0,0 +1,41 @@ +[workspace] +members = ["cargo:."] + +# Config for 'dist' +[dist] +github-build-setup = "../build-setup.yml" +# The preferred dist version to use in CI (Cargo.toml SemVer syntax) +cargo-dist-version = "0.31.0" +# The installers to generate for each app +installers = ["shell"] +# Target platforms to build apps for (Rust target-triple syntax) +targets = ["aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"] +# CI backends to support +ci = "github" +# Whether to install an updater program +install-updater = true +# Path that installers should place binaries in +install-path = "CARGO_HOME" +## since this is cross-language and +## we are not including C++ debug +## symbols, this currently doesn't work +## and would be of limited utility anyway. +# debug = true +# split-debuginfo = "packed" + +[[dist.extra-artifacts]] +artifacts = ["source-full.tar.gz", "source-full.tar.gz.sha256"] +build = ["bash", "-c", """ + set -e + git archive --format=tar.gz --prefix=piscem/ HEAD > source-full.tar.gz + shasum -a 256 source-full.tar.gz > source-full.tar.gz.sha256 + """] + +[dist.github-custom-runners] +aarch64-apple-darwin = "macos-14" +x86_64-apple-darwin = "macos-15-intel" +x86_64-unknown-linux-gnu = "ubuntu-22.04" + +[dist.dependencies.homebrew] +coreutils = { stage = ["build"] } +gnu-tar = { stage = ["build"] } diff --git a/piscem-cpp b/piscem-cpp deleted file mode 160000 index 7be79ee..0000000 --- a/piscem-cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7be79eee2295ee039c13523bc746114b7d5e1234 diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..7a3602a --- /dev/null +++ b/release.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [ $# -ne 1 ]; then + echo "Usage: $0 (e.g. $0 0.15.0)" >&2 + exit 1 +fi + +VERSION="$1" +TAG="v${VERSION}" +CARGO_TOML="Cargo.toml" + +# Validate version looks reasonable (digits and dots) +if ! echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then + echo "Error: version '$VERSION' doesn't look like a semver (expected X.Y.Z)" >&2 + exit 1 +fi + +# Check we're in the right directory +if [ ! -f "$CARGO_TOML" ]; then + echo "Error: $CARGO_TOML not found. Run this from the piscem repo root." >&2 + exit 1 +fi + +# Check for uncommitted changes +if ! git diff --quiet || ! git diff --cached --quiet; then + echo "Error: working tree has uncommitted changes. Commit or stash first." >&2 + exit 1 +fi + +# Check tag doesn't already exist +if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Error: tag '$TAG' already exists." >&2 + exit 1 +fi + +# Update version in Cargo.toml +sed -i '' "s/^version = \".*\"/version = \"${VERSION}\"/" "$CARGO_TOML" + +echo "Updated $CARGO_TOML to version $VERSION" + +# Commit, tag, and push +git add "$CARGO_TOML" +git commit -m "release ${TAG}" +git tag "$TAG" +git push origin main "$TAG" + +echo "Released ${TAG} and pushed to origin." diff --git a/src/main.rs b/src/main.rs index 79feaae..306d14f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,33 +1,29 @@ -use std::ffi::CString; -use std::ffi::{OsStr, OsString}; +use mimalloc::MiMalloc; use std::io; -use std::os::raw::{c_char, c_int}; use std::path::PathBuf; -use anyhow::{bail, Result}; +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +use anyhow::{Context, Result, bail}; +use cf1_rs::{CfInput, cf_build as cf1_build}; use clap::{Parser, Subcommand}; -use tracing::{error, info, warn, Level}; +use serde_json::json; +use tracing::{Level, error, info, warn}; mod piscem_commands; use piscem_commands::*; -#[link(name = "pesc_static", kind = "static")] -extern "C" { - pub fn run_pesc_sc(args: c_int, argsv: *const *const c_char) -> c_int; - pub fn run_pesc_bulk(args: c_int, argsv: *const *const c_char) -> c_int; - pub fn run_pesc_sc_atac(args: c_int, argsv: *const *const c_char) -> c_int; -} - -#[link(name = "build_static", kind = "static")] -extern "C" { - pub fn run_build(args: c_int, argsv: *const *const c_char) -> c_int; - pub fn run_build_poison_table(args: c_int, argsv: *const *const c_char) -> c_int; -} - -#[link(name = "cfcore_static", kind = "static", modifiers = "+whole-archive")] -extern "C" { - pub fn cf_build(args: c_int, argsv: *const *const c_char) -> c_int; -} +use piscem_rs::cli::build as rs_build; +use piscem_rs::cli::poison as rs_poison; +use piscem_rs::cli::map_bulk; +use piscem_rs::cli::map_scrna; +use piscem_rs::cli::map_scatac; +use piscem_rs::cli::build::BuildArgs; +use piscem_rs::cli::poison::BuildPoisonArgs; +use piscem_rs::cli::map_scrna::MapScrnaArgs; +use piscem_rs::cli::map_bulk::MapBulkArgs; +use piscem_rs::cli::map_scatac::MapScatacArgs; /// Indexing and mapping to compacted colored de Bruijn graphs #[derive(Debug, Parser)] @@ -60,16 +56,8 @@ enum Commands { MapSCAtac(MapSCAtacOpts), } -// from: https://stackoverflow.com/questions/74322541/how-to-append-to-pathbuf -fn append_to_path(p: impl Into, s: impl AsRef) -> PathBuf { - let mut p = p.into(); - p.push(s); - p.into() -} - fn main() -> Result<(), anyhow::Error> { let cli_args = Cli::parse(); - //env_logger::Builder::from_env(Env::default().default_filter_or("warn")).init(); let quiet = cli_args.quiet; if quiet { @@ -99,6 +87,7 @@ fn main() -> Result<(), anyhow::Error> { work_dir, overwrite, no_ec_table, + polya_clip_length, decoy_paths, seed, }) => { @@ -110,8 +99,11 @@ fn main() -> Result<(), anyhow::Error> { ); } if threads > ncpus { - bail!("the number of provided threads ({}) should be <= the number of logical CPUs ({}).", - threads, ncpus); + bail!( + "the number of provided threads ({}) should be <= the number of logical CPUs ({}).", + threads, + ncpus + ); } if mlen >= klen { bail!( @@ -143,89 +135,100 @@ fn main() -> Result<(), anyhow::Error> { } } - let mut args: Vec = vec![]; - - let cf_out = PathBuf::from(output.as_path().to_string_lossy().into_owned() + "_cfish"); - let cf_base_path = cf_out.as_path(); - let seg_file = append_to_path(cf_base_path, ".cf_seg"); - let seq_file = append_to_path(cf_base_path, ".cf_seq"); - let struct_file = append_to_path(cf_base_path, ".json"); - let mut build_ret; - - if overwrite { - if struct_file.exists() { - std::fs::remove_file(struct_file.clone())?; - } - if seg_file.exists() { - std::fs::remove_file(seg_file.clone())?; - } - if seq_file.exists() { - std::fs::remove_file(seq_file.clone())?; + // Ensure the parent directory of the output prefix exists. + if let Some(parent) = output.parent() { + if !parent.as_os_str().is_empty() && !parent.exists() { + std::fs::create_dir_all(parent)?; + info!( + "created output directory {} (did not previously exist)", + parent.display() + ); } } - if struct_file.exists() && (!seq_file.exists() || !seg_file.exists()) { - warn!("The prefix you have chosen for output already corresponds to an existing cDBG structure file {:?}.", struct_file.display()); - warn!("However, the corresponding seq and seg files do not exist. Please either delete this structure file, choose another output prefix, or use the --overwrite flag."); - bail!("Cannot write over existing index without the --overwrite flag."); - } - - args.push(CString::new("cdbg_builder").unwrap()); - - // We can treat the different input options independently - // here because the argument parser should have enforced - // their exclusivity. - let mut has_input = false; - - if let Some(seqs) = ref_seqs { + // Build CfInput from CLI args, using native variants where possible. + let cf_input = if let Some(ref seqs) = ref_seqs { if !seqs.is_empty() { let out_stem = PathBuf::from(output.as_path().to_string_lossy().into_owned() + ".sigs"); let configs = prepare_fasta::RecordParseConfig { input: seqs.clone(), output_stem: out_stem, - polya_clip_length: None, + polya_clip_length, }; info!("Computing and recording reference signatures..."); prepare_fasta::parse_records(configs)?; info!("done."); - args.push(CString::new("--seq").unwrap()); - let reflist = seqs.join(","); - args.push(CString::new(reflist.as_str()).unwrap()); - has_input = true; + CfInput::Files(seqs.iter().map(PathBuf::from).collect()) + } else { + bail!("--ref-seqs provided but empty"); } - } - - if let Some(lists) = ref_lists { - if !lists.is_empty() { - args.push(CString::new("--list").unwrap()); - let reflist = lists.join(","); - args.push(CString::new(reflist.as_str()).unwrap()); - has_input = true; + } else if let Some(ref lists) = ref_lists { + if lists.len() == 1 { + CfInput::ListFile(PathBuf::from(&lists[0])) + } else { + // Multiple list files — resolve all to individual paths. + let mut files = Vec::new(); + for list_path in lists { + let contents = std::fs::read_to_string(list_path) + .with_context(|| format!("reading list file {}", list_path))?; + for line in contents.lines() { + let line = line.trim(); + if !line.is_empty() { + files.push(PathBuf::from(line)); + } + } + } + CfInput::Files(files) } - } + } else if let Some(ref dirs) = ref_dirs { + if dirs.len() == 1 { + CfInput::Directory(PathBuf::from(&dirs[0])) + } else { + // Multiple directories — resolve all to individual file paths. + let mut files = Vec::new(); + for dir_path in dirs { + for entry in std::fs::read_dir(dir_path) + .with_context(|| format!("reading directory {}", dir_path))? + { + let path = entry?.path(); + if path.is_file() { + files.push(path); + } + } + } + CfInput::Files(files) + } + } else { + bail!("Input (via --ref-seqs, --ref-lists, or --ref-dirs) must be provided."); + }; - if let Some(dirs) = ref_dirs { - if !dirs.is_empty() { - args.push(CString::new("--dir").unwrap()); - let reflist = dirs.join(","); - args.push(CString::new(reflist.as_str()).unwrap()); - has_input = true; + let cf_out = PathBuf::from(output.as_path().to_string_lossy().into_owned() + "_cfish"); + let cf_out_str = cf_out.as_path().to_string_lossy(); + let seg_file = PathBuf::from(format!("{}.cf_seg", cf_out_str)); + let seq_file = PathBuf::from(format!("{}.cf_seq", cf_out_str)); + let struct_file = PathBuf::from(format!("{}.json", cf_out_str)); + + if overwrite { + for f in [&struct_file, &seg_file, &seq_file] { + if f.exists() { + std::fs::remove_file(f)?; + } } } - assert!( - has_input, - "Input (via --ref-seqs, --ref-lists, or --ref-dirs) must be provided." - ); - - args.push(CString::new("-k").unwrap()); - args.push(CString::new(klen.to_string()).unwrap()); - args.push(CString::new("--track-short-seqs").unwrap()); - args.push(CString::new("--poly-N-stretch").unwrap()); + if struct_file.exists() && (!seq_file.exists() || !seg_file.exists()) { + warn!( + "The prefix you have chosen for output already corresponds to an existing cDBG structure file {:?}.", + struct_file.display() + ); + warn!( + "However, the corresponding seq and seg files do not exist. Please either delete this structure file, choose another output prefix, or use the --overwrite flag." + ); + bail!("Cannot write over existing index without the --overwrite flag."); + } - // check if the provided work directory exists. - // If not, then try and create it. + // Ensure work directory exists. match work_dir.try_exists() { Ok(true) => { info!( @@ -234,11 +237,14 @@ fn main() -> Result<(), anyhow::Error> { ); } Ok(false) => { - // try to create it match std::fs::create_dir_all(&work_dir) { Ok(_) => {} Err(e) => { - error!("when attempting to create working directory {}, encountered error {:#?}", &work_dir.display(), e); + error!( + "when attempting to create working directory {}, encountered error {:#?}", + &work_dir.display(), + e + ); bail!( "Failed to create working directory {} for index construction : {:#?}", &work_dir.display(), @@ -256,11 +262,9 @@ fn main() -> Result<(), anyhow::Error> { } } - // check if the provided output path is more than just a prefix - // if so, check if the specified directory exists and create it - // if it doesn't. + // Ensure the output parent directory exists. if let Some(parent_path) = cf_out.parent() { - if !parent_path.exists() { + if !parent_path.as_os_str().is_empty() && !parent_path.exists() { std::fs::create_dir_all(parent_path)?; info!( "directory {} did not already exist; creating it.", @@ -269,147 +273,72 @@ fn main() -> Result<(), anyhow::Error> { } } - args.push(CString::new("-o").unwrap()); - args.push(CString::new(cf_out.as_path().to_string_lossy().into_owned()).unwrap()); - - args.push(CString::new("-t").unwrap()); - args.push(CString::new(threads.to_string()).unwrap()); - // output format - args.push(CString::new("-f").unwrap()); - args.push(CString::new("3").unwrap()); - // work directory - args.push(CString::new("-w").unwrap()); - args.push(CString::new(work_dir.as_path().to_string_lossy().into_owned()).unwrap()); - - info!("args = {:?}", args); - { - let arg_ptrs: Vec<*const c_char> = args.iter().map(|s| s.as_ptr()).collect(); - let args_len: c_int = args.len() as c_int; - build_ret = unsafe { cf_build(args_len, arg_ptrs.as_ptr()) }; - } - - if build_ret != 0 { - bail!( - "cDBG constructor returned exit code {}; failure.", - build_ret - ); - } - - args.clear(); - args.push(CString::new("ref_index_builder").unwrap()); - - args.push(CString::new("-i").unwrap()); - args.push(CString::new(cf_out.as_path().to_string_lossy().into_owned()).unwrap()); - args.push(CString::new("-k").unwrap()); - args.push(CString::new(klen.to_string()).unwrap()); - args.push(CString::new("-m").unwrap()); - args.push(CString::new(mlen.to_string()).unwrap()); // minimizer length - - args.push(CString::new("--canonical-parsing").unwrap()); - if !no_ec_table { - args.push(CString::new("--build-ec-table").unwrap()); - } - args.push(CString::new("-o").unwrap()); - args.push(CString::new(output.as_path().to_string_lossy().into_owned()).unwrap()); - - args.push(CString::new("-d").unwrap()); - args.push(CString::new(work_dir.as_path().to_string_lossy().into_owned()).unwrap()); - - args.push(CString::new("-t").unwrap()); - args.push(CString::new(threads.to_string()).unwrap()); - - args.push(CString::new("--seed").unwrap()); - args.push(CString::new(seed.to_string()).unwrap()); - - if quiet { - args.push(CString::new("--quiet").unwrap()); - } - - { - println!("{:?}", args); - let arg_ptrs: Vec<*const c_char> = args.iter().map(|s| s.as_ptr()).collect(); - let args_len: c_int = args.len() as c_int; - build_ret = unsafe { run_build(args_len, arg_ptrs.as_ptr()) }; - } - - if build_ret != 0 { - bail!("indexer returned exit code {}; failure.", build_ret); - } + info!("starting cDBG construction with cf1-rs"); + let cf_result = cf1_build() + .input(cf_input) + .output_prefix(cf_out.clone()) + .k(klen) + .threads(threads) + .work_dir(work_dir.clone()) + .call()?; + + info!( + "cDBG construction complete: {} unitigs, {} vertices", + cf_result.unitig_count, cf_result.vertex_count + ); - // now, build the poison table if there are decoys + // Build piscem-rs index from cuttlefish output + rs_build::run(BuildArgs { + input: cf_out.clone(), + output: output.clone(), + klen, + mlen, + threads, + build_ec_table: !no_ec_table, + canonical: true, + seed, + single_mphf: false, + })?; + + // Build poison table if decoys were provided if let Some(decoy_pathbufs) = decoy_paths { - args.clear(); - args.push(CString::new("poison_table_builder").unwrap()); - - // index is the one we just built - args.push(CString::new("-i").unwrap()); - args.push(CString::new(output.as_path().to_string_lossy().into_owned()).unwrap()); - - args.push(CString::new("-t").unwrap()); - args.push(CString::new(threads.to_string()).unwrap()); - - if overwrite { - args.push(CString::new("--overwrite").unwrap()); - } - - let path_args = decoy_pathbufs - .into_iter() - .map(|x| x.to_string_lossy().into_owned()) - .collect::>() - .join(","); - args.push(CString::new("-d").unwrap()); - args.push(CString::new(path_args).unwrap()); - - if quiet { - args.push(CString::new("--quiet").unwrap()); - } + rs_poison::run(BuildPoisonArgs { + index: output.clone(), + decoys: decoy_pathbufs, + threads, + })?; + } - { - println!("{:?}", args); - let arg_ptrs: Vec<*const c_char> = args.iter().map(|s| s.as_ptr()).collect(); - let args_len: c_int = args.len() as c_int; - build_ret = unsafe { run_build_poison_table(args_len, arg_ptrs.as_ptr()) }; - } - if build_ret != 0 { - bail!( - "building poison table returned exit code {}; failure.", - build_ret - ); + if !keep_intermediate_dbg { + info!("removing intermediate cdBG files produced by cf1-rs."); + for (path, label) in [ + (&cf_result.seg_file, "segment"), + (&cf_result.seq_file, "tiling"), + ] { + match std::fs::remove_file(path) { + Ok(_) => info!("removed {} file {}", label, path.display()), + Err(e) => warn!("cannot remove {}, error: {:?}", path.display(), e), + } } + // Keep the json file — it's small and may contain useful info. } - if !keep_intermediate_dbg { - info!("removing intermediate cdBG files produced by cuttlefish."); + let piscem_rs_ver = piscem_rs::VERSION; + let cf1_rs_ver = env!("CF1_RS_VERSION"); + let piscem_ver = clap::crate_version!(); - match std::fs::remove_file(seg_file.clone()) { - Ok(_) => { - info!("removed segment file {}", seg_file.display()); - } - Err(e) => { - warn!( - "cannot remove {}, encountered error {:?}!", - seg_file.display(), - e - ); - } - }; + let version_json = json!({ + "piscem-rs": piscem_rs_ver, + "cf1-rs": cf1_rs_ver, + "piscem": piscem_ver + }); - match std::fs::remove_file(seq_file.clone()) { - Ok(_) => { - info!("removed tiling file {}", seq_file.display()); - } - Err(e) => { - warn!( - "cannot remove {}, encountered error {:?}!", - seq_file.display(), - e - ); - } - }; - // for now, let the json file stick around. It's - // generally very small and may contain useful information - // about the references being indexed. - } + let mut fname = output.as_path().to_string_lossy().into_owned(); + fname.push_str("_ver.json"); + + let fname = PathBuf::from(fname); + let ver_file = std::fs::File::create(fname)?; + serde_json::to_writer_pretty(ver_file, &version_json)?; info!("piscem build finished."); } @@ -422,23 +351,32 @@ fn main() -> Result<(), anyhow::Error> { ); } if sc_opts.threads > ncpus { - bail!("the number of provided threads ({}) should be <= the number of logical CPUs ({}).", - sc_opts.threads, ncpus); - } - - let mut args = sc_opts.as_argv()?; - if quiet { - args.push(CString::new("--quiet").unwrap()); + bail!( + "the number of provided threads ({}) should be <= the number of logical CPUs ({}).", + sc_opts.threads, + ncpus + ); } - info!("cmd: {:?}", args); - let arg_ptrs: Vec<*const c_char> = args.iter().map(|s| s.as_ptr()).collect(); - let args_len: c_int = args.len() as c_int; - - let map_ret = unsafe { run_pesc_sc(args_len, arg_ptrs.as_ptr()) }; - if map_ret != 0 { - bail!("mapper returned exit code {}; failure", map_ret); - } + let args = MapScrnaArgs { + index: PathBuf::from(&sc_opts.index), + read1: sc_opts.read1.iter().map(PathBuf::from).collect(), + read2: sc_opts.read2.iter().map(PathBuf::from).collect(), + geometry: sc_opts.geometry, + output: sc_opts.output.clone(), + threads: sc_opts.threads, + skipping_strategy: sc_opts.skipping_strategy, + no_poison: sc_opts.no_poison, + struct_constraints: sc_opts.struct_constraints, + ignore_ambig_hits: sc_opts.ignore_ambig_hits, + max_ec_card: sc_opts.max_ec_card, + max_hit_occ: sc_opts.max_hit_occ as usize, + max_hit_occ_recover: sc_opts.max_hit_occ_recover as usize, + max_read_occ: sc_opts.max_read_occ as usize, + with_position: sc_opts.with_position, + quiet, + }; + map_scrna::run(args)?; } Commands::MapSCAtac(scatac_opts) => { @@ -449,23 +387,51 @@ fn main() -> Result<(), anyhow::Error> { ); } if scatac_opts.threads > ncpus { - bail!("the number of provided threads ({}) should be <= the number of logical CPUs ({}).", - scatac_opts.threads, ncpus); + bail!( + "the number of provided threads ({}) should be <= the number of logical CPUs ({}).", + scatac_opts.threads, + ncpus + ); } - let mut args = scatac_opts.as_argv()?; - if quiet { - args.push(CString::new("--quiet").unwrap()); + for (flag, name) in [ + (scatac_opts.sam_format, "--sam-format"), + (scatac_opts.bed_format, "--bed-format"), + (scatac_opts.use_chr, "--use-chr"), + (scatac_opts.check_kmer_orphan, "--check-kmer-orphan"), + (scatac_opts.struct_constraints, "--struct-constraints"), + ] { + if flag { + warn!("{} is not supported by piscem-rs and will be ignored", name); + } } - info!("cmd: {:?}", args); - let arg_ptrs: Vec<*const c_char> = args.iter().map(|s| s.as_ptr()).collect(); - let args_len: c_int = args.len() as c_int; - - let map_ret = unsafe { run_pesc_sc_atac(args_len, arg_ptrs.as_ptr()) }; - if map_ret != 0 { - bail!("mapper returned exit code {}; failure", map_ret); - } + let barcode = scatac_opts.barcode.unwrap_or_default(); + let args = MapScatacArgs { + index: PathBuf::from(&scatac_opts.index), + reads: scatac_opts.reads.unwrap_or_default().iter().map(PathBuf::from).collect(), + read1: scatac_opts.read1.unwrap_or_default().iter().map(PathBuf::from).collect(), + read2: scatac_opts.read2.unwrap_or_default().iter().map(PathBuf::from).collect(), + barcode: barcode.iter().map(PathBuf::from).collect(), + output: scatac_opts.output.clone(), + threads: scatac_opts.threads, + bc_len: scatac_opts.bclen as usize, + no_tn5_shift: scatac_opts.no_tn5_shift, + no_poison: scatac_opts.no_poison, + check_ambig_hits: !scatac_opts.ignore_ambig_hits, + max_ec_card: scatac_opts.max_ec_card, + max_hit_occ: scatac_opts.max_hit_occ as usize, + max_hit_occ_recover: scatac_opts.max_hit_occ_recover as usize, + max_read_occ: scatac_opts.max_read_occ as usize, + end_cache_capacity: scatac_opts.end_cache_capacity, + bin_size: scatac_opts.bin_size as u64, + bin_overlap: scatac_opts.bin_overlap as u64, + thr: scatac_opts.thr, + min_overlap: 30, + skipping_strategy: None, + quiet, + }; + map_scatac::run(args)?; } Commands::MapBulk(bulk_opts) => { @@ -476,23 +442,31 @@ fn main() -> Result<(), anyhow::Error> { ); } if bulk_opts.threads > ncpus { - bail!("the number of provided threads ({}) should be <= the number of logical CPUs ({}).", - bulk_opts.threads, ncpus); - } - - let mut args = bulk_opts.as_argv()?; - - if quiet { - args.push(CString::new("--quiet").unwrap()); + bail!( + "the number of provided threads ({}) should be <= the number of logical CPUs ({}).", + bulk_opts.threads, + ncpus + ); } - let arg_ptrs: Vec<*const c_char> = args.iter().map(|s| s.as_ptr()).collect(); - let args_len: c_int = args.len() as c_int; - - let map_ret = unsafe { run_pesc_bulk(args_len, arg_ptrs.as_ptr()) }; - if map_ret != 0 { - bail!("mapper returned exit code {}; failure", map_ret); - } + let args = MapBulkArgs { + index: PathBuf::from(&bulk_opts.index), + reads: bulk_opts.reads.unwrap_or_default().iter().map(PathBuf::from).collect(), + read1: bulk_opts.read1.unwrap_or_default().iter().map(PathBuf::from).collect(), + read2: bulk_opts.read2.unwrap_or_default().iter().map(PathBuf::from).collect(), + output: bulk_opts.output.clone(), + threads: bulk_opts.threads, + skipping_strategy: bulk_opts.skipping_strategy, + no_poison: bulk_opts.no_poison, + struct_constraints: bulk_opts.struct_constraints, + ignore_ambig_hits: bulk_opts.ignore_ambig_hits, + max_ec_card: bulk_opts.max_ec_card, + max_hit_occ: bulk_opts.max_hit_occ as usize, + max_hit_occ_recover: bulk_opts.max_hit_occ_recover as usize, + max_read_occ: bulk_opts.max_read_occ as usize, + quiet, + }; + map_bulk::run(args)?; } } Ok(()) diff --git a/src/piscem_commands.rs b/src/piscem_commands.rs index ad7545c..bc7b2a5 100644 --- a/src/piscem_commands.rs +++ b/src/piscem_commands.rs @@ -1,8 +1,6 @@ -use anyhow::{anyhow, bail, Result}; +use anyhow::{Result, anyhow, bail}; use clap::{ArgGroup, Args}; -use std::ffi::CString; -use std::path::{Path, PathBuf}; -use std::str::FromStr; +use std::path::PathBuf; trait DefaultMappingParams { const MAX_EC_CARD: u32; @@ -14,6 +12,7 @@ trait DefaultMappingParams { const BIN_SIZE: u32; const BIN_OVERLAP: u32; const BCLEN: u16; + const END_CACHE_CAPACITY: usize; } struct DefaultParams; @@ -28,14 +27,7 @@ impl DefaultMappingParams for DefaultParams { const BIN_SIZE: u32 = 1000; const BIN_OVERLAP: u32 = 300; const BCLEN: u16 = 16; -} - -/// Trait to produce a proper set of command-line arguments -/// from a populated struct. There is a single method, -/// `as_argv`, which produces a Vec that can be parsed -/// and passed to a C function as the `char** argv` parameter. -pub trait AsArgv { - fn as_argv(&self) -> Result>; + const END_CACHE_CAPACITY: usize = 5_000_000; } fn klen_is_good(s: &str) -> Result { @@ -111,6 +103,12 @@ pub(crate) struct BuildOpts { #[arg(long, help_heading = "Index Construction Parameters")] pub no_ec_table: bool, + /// If provided (default is not to clip polyA), then reference sequences + /// ending with polyA tails of length greater than or equal to this value + /// will be clipped. + #[arg(long, help_heading = "Index Construction Parameters")] + pub polya_clip_length: Option, + /// path to (optional) ',' sparated list of decoy sequences used to insert poison /// k-mer information into the index. #[arg(long, value_delimiter = ',')] @@ -132,10 +130,6 @@ pub(crate) struct MapSCOpts { #[arg(short, long, help_heading = "Input")] pub index: String, - /// list available geometries supported by the underlying `pesc-sc` mapper - // #[arg(long, help_heading = "Advanced")] - // pub list_geometries: bool, - /// geometry of barcode, umi and read #[arg(short, long)] pub geometry: String, @@ -188,6 +182,10 @@ pub(crate) struct MapSCOpts { #[arg(long)] pub ignore_ambig_hits: bool, + /// includes the positions of each mapped read in the resulting RAD file. + #[arg(long)] + pub with_position: bool, + /// determines the maximum cardinality equivalence class /// (number of (txp, orientation status) pairs) to examine (cannot be used with /// --ignore-ambig-hits). @@ -284,7 +282,6 @@ pub(crate) struct MapBulkOpts { #[arg( long, short, - requires = "check_ambig_hits", default_value_t = DefaultParams::MAX_EC_CARD, conflicts_with = "ignore_ambig_hits", help_heading = "Advanced options" @@ -306,183 +303,6 @@ pub(crate) struct MapBulkOpts { pub max_read_occ: u32, } -impl AsArgv for MapSCOpts { - fn as_argv(&self) -> Result> { - // first check if the relevant index files exist - let mut idx_suffixes: Vec = vec!["sshash".into(), "ctab".into(), "refinfo".into()]; - - if !self.ignore_ambig_hits { - idx_suffixes.push("ectab".into()); - } - - { - let idx_path = get_index_path(&self.index)?; - for s in idx_suffixes { - let req_file = idx_path.with_extension(s); - if !req_file.exists() { - bail!("To load the index with the specified prefix {}, piscem expects the file {} to exist, but it does not!", &self.index, req_file.display()); - } - } - } - - let r1_string = self.read1.join(","); - let r2_string = self.read2.join(","); - - let mut args: Vec = vec![ - CString::new("sc_ref_mapper").unwrap(), - CString::new("-i").unwrap(), - CString::new(self.index.clone()).unwrap(), - CString::new("-g").unwrap(), - CString::new(self.geometry.clone()).unwrap(), - CString::new("-1").unwrap(), - CString::new(r1_string.as_str()).unwrap(), - CString::new("-2").unwrap(), - CString::new(r2_string.as_str()).unwrap(), - CString::new("-t").unwrap(), - CString::new(self.threads.to_string()).unwrap(), - CString::new("-o").unwrap(), - #[cfg(not(target_os = "windows"))] - CString::new(std::os::unix::ffi::OsStrExt::as_bytes( - ::clone(&self.output) - .into_os_string() - .as_os_str(), - )) - .unwrap(), - // NOTE: Windows is completely untested - #[cfg(target_os = "windows")] - CString::new(self.output.into_os_string().to_str()?).unwrap(), - ]; - - /*if self.list_geometries { - args.push(CString::new("--list-geometries").unwrap()); - }*/ - - if self.ignore_ambig_hits { - args.push(CString::new("--ignore-ambig-hits").unwrap()); - } else { - args.push(CString::new("--max-ec-card").unwrap()); - args.push(CString::new(self.max_ec_card.to_string()).unwrap()); - } - - if self.no_poison { - args.push(CString::new("--no-poison").unwrap()); - } - - args.push(CString::new("--skipping-strategy").unwrap()); - args.push(CString::new(self.skipping_strategy.to_string()).unwrap()); - - if self.struct_constraints { - args.push(CString::new("--struct-constraints").unwrap()); - } - - args.push(CString::new("--max-hit-occ").unwrap()); - args.push(CString::new(self.max_hit_occ.to_string()).unwrap()); - - args.push(CString::new("--max-hit-occ-recover").unwrap()); - args.push(CString::new(self.max_hit_occ_recover.to_string()).unwrap()); - - args.push(CString::new("--max-read-occ").unwrap()); - args.push(CString::new(self.max_read_occ.to_string()).unwrap()); - - Ok(args) - } -} - -fn get_index_path(base: &str) -> Result { - if Path::new(base).exists() { - bail!( - concat!("The path {} was provided as the base path for the index, but this corresponds ", - "to a specific existing file. The provided path should be the file stem (e.g. without the extension)."), - base); - } - - if let Some(_ext) = Path::new(base).extension() { - Ok(PathBuf::from_str(&format!("{}.dummy", base))?) - } else { - Ok(PathBuf::from_str(base)?) - } -} - -impl AsArgv for MapBulkOpts { - fn as_argv(&self) -> Result> { - let mut idx_suffixes: Vec = vec!["sshash".into(), "ctab".into(), "refinfo".into()]; - - if !self.ignore_ambig_hits { - idx_suffixes.push("ectab".into()); - } - - { - let idx_path = get_index_path(&self.index)?; - for s in idx_suffixes { - let req_file = idx_path.with_extension(s); - if !req_file.exists() { - bail!("To load the index with the specified prefix {}, piscem expects the file {} to exist, but it does not!", &self.index, req_file.display()); - } - } - } - - let mut args: Vec = vec![ - CString::new("bulk_ref_mapper").unwrap(), - CString::new("-i").unwrap(), - CString::new(self.index.clone()).unwrap(), - CString::new("-t").unwrap(), - CString::new(self.threads.to_string()).unwrap(), - CString::new("-o").unwrap(), - #[cfg(not(target_os = "windows"))] - CString::new(std::os::unix::ffi::OsStrExt::as_bytes( - ::clone(&self.output) - .into_os_string() - .as_os_str(), - )) - .unwrap(), - // NOTE: Windows is completely untested - #[cfg(target_os = "windows")] - CString::new(self.output.into_os_string().to_str()?).unwrap(), - ]; - - if let Some(ref unpaired_reads) = &self.reads { - let r_string = unpaired_reads.clone().join(","); - args.push(CString::new("-r").unwrap()); - args.push(CString::new(r_string.as_str()).unwrap()); - } else if let (Some(ref r1), Some(ref r2)) = (&self.read1, &self.read2) { - let r1_string = r1.clone().join(","); - let r2_string = r2.clone().join(","); - args.push(CString::new("-1").unwrap()); - args.push(CString::new(r1_string.as_str()).unwrap()); - args.push(CString::new("-2").unwrap()); - args.push(CString::new(r2_string.as_str()).unwrap()); - } - - if self.ignore_ambig_hits { - args.push(CString::new("--ignore-ambig-hits").unwrap()); - } else { - args.push(CString::new("--max-ec-card").unwrap()); - args.push(CString::new(self.max_ec_card.to_string()).unwrap()); - } - - if self.no_poison { - args.push(CString::new("--no-poison").unwrap()); - } - - args.push(CString::new("--skipping-strategy").unwrap()); - args.push(CString::new(self.skipping_strategy.to_string()).unwrap()); - - if self.struct_constraints { - args.push(CString::new("--struct-constraints").unwrap()); - } - - args.push(CString::new("--max-hit-occ").unwrap()); - args.push(CString::new(self.max_hit_occ.to_string()).unwrap()); - - args.push(CString::new("--max-hit-occ-recover").unwrap()); - args.push(CString::new(self.max_hit_occ_recover.to_string()).unwrap()); - - args.push(CString::new("--max-read-occ").unwrap()); - args.push(CString::new(self.max_read_occ.to_string()).unwrap()); - - Ok(args) - } -} #[derive(Args, Clone, Debug)] pub(crate) struct MapSCAtacOpts { @@ -513,13 +333,12 @@ pub(crate) struct MapSCAtacOpts { #[arg(short = 'r', long, help_heading = "Input", value_delimiter = ',', conflicts_with_all = ["read1", "read2"])] pub reads: Option>, - /// path to a ',' separated list of read 2 files + /// path to a ',' separated list of barcode files #[arg( short = 'b', long, help_heading = "Input", - value_delimiter = ',', - requires = "read1" + value_delimiter = ',' )] pub barcode: Option>, @@ -543,24 +362,28 @@ pub(crate) struct MapSCAtacOpts { #[arg(long)] pub no_poison: bool, - /// apply structural constraints when performing mapping. - #[arg(short = 'c', long)] + /// [DEPRECATED] apply structural constraints when performing mapping. + /// This option is no longer supported and will be ignored. + #[arg(short = 'c', long, hide = true)] pub struct_constraints: bool, /// the skipping strategy to use for k-mer collection #[arg(long, default_value = &DefaultParams::SKIPPING_STRATEGY, value_parser = clap::builder::PossibleValuesParser::new(["permissive", "strict"]))] pub skipping_strategy: String, - /// output mappings in sam format - #[arg(long)] + /// [DEPRECATED] output mappings in sam format. + /// This option is no longer supported and will be ignored. + #[arg(long, hide = true)] pub sam_format: bool, - /// output mappings in bed format - #[arg(long)] + /// [DEPRECATED] output mappings in bed format. + /// This option is no longer supported and will be ignored. + #[arg(long, hide = true)] pub bed_format: bool, - /// use chromosomes as color - #[arg(long)] + /// [DEPRECATED] use chromosomes as color. + /// This option is no longer supported and will be ignored. + #[arg(long, hide = true)] pub use_chr: bool, /// threshold to be considered for pseudoalignment, default set to 0.7 @@ -579,10 +402,10 @@ pub(crate) struct MapSCAtacOpts { #[arg(long)] pub no_tn5_shift: bool, - /// Check if any mapping kmer exist for a mate which is not mapped, + /// [DEPRECATED] Check if any mapping kmer exist for a mate which is not mapped, /// but there exists mapping for the other read. - /// If set to true and a mapping kmer exists, then the pair would not be mapped (default false) - #[arg(long)] + /// This option is no longer supported and will be ignored. + #[arg(long, hide = true)] pub check_kmer_orphan: bool, /// determines the maximum cardinality equivalence class @@ -611,140 +434,11 @@ pub(crate) struct MapSCAtacOpts { #[arg(long, default_value_t = DefaultParams::MAX_READ_OCC, help_heading = "Advanced options")] pub max_read_occ: u32, + /// the length of the barcode sequence #[arg(long, default_value_t = DefaultParams::BCLEN, help_heading = "Advanced options")] pub bclen: u16, -} -impl AsArgv for MapSCAtacOpts { - fn as_argv(&self) -> Result> { - // first check if the relevant index files exist - let idx_suffixes: Vec = vec!["sshash".into(), "ctab".into(), "refinfo".into()]; - - // if !self.ignore_ambig_hits { - // idx_suffixes.push("ectab".into()); - // } - - { - let idx_path = get_index_path(&self.index)?; - for s in idx_suffixes { - let req_file = idx_path.with_extension(s); - if !req_file.exists() { - bail!("To load the index with the specified prefix {}, piscem expects the file {} to exist, but it does not!", &self.index, req_file.display()); - } - } - } - - let mut args: Vec = vec![ - CString::new("scatac_ref_mapper").unwrap(), - CString::new("-i").unwrap(), - CString::new(self.index.clone()).unwrap(), - CString::new("-t").unwrap(), - CString::new(self.threads.to_string()).unwrap(), - CString::new("-o").unwrap(), - #[cfg(not(target_os = "windows"))] - CString::new(std::os::unix::ffi::OsStrExt::as_bytes( - ::clone(&self.output) - .into_os_string() - .as_os_str(), - )) - .unwrap(), - // NOTE: Windows is completely untested - #[cfg(target_os = "windows")] - CString::new(self.output.into_os_string().to_str()?).unwrap(), - ]; - - // if let (Some(ref r1), Some(ref r2), Some(ref b)) = (&self.read1, &self.read2, &self.barcode) - // { - // let r1_string = r1.clone().join(","); - // let r2_string = r2.clone().join(","); - // - // args.push(CString::new("-1").unwrap()); - // args.push(CString::new(r1_string.as_str()).unwrap()); - // args.push(CString::new("-2").unwrap()); - // args.push(CString::new(r2_string.as_str()).unwrap()); - // args.push(CString::new("-b").unwrap()); - // args.push(CString::new(b_string.as_str()).unwrap()); - // } - let b_string = self.barcode.as_ref().unwrap().clone().join(","); - if let Some(ref unpaired_reads) = &self.reads { - let r_string = unpaired_reads.clone().join(","); - args.push(CString::new("-r").unwrap()); - args.push(CString::new(r_string.as_str()).unwrap()); - } else if let (Some(ref r1), Some(ref r2)) = (&self.read1, &self.read2) { - let r1_string = r1.clone().join(","); - let r2_string = r2.clone().join(","); - args.push(CString::new("-1").unwrap()); - args.push(CString::new(r1_string.as_str()).unwrap()); - args.push(CString::new("-2").unwrap()); - args.push(CString::new(r2_string.as_str()).unwrap()); - } - - args.push(CString::new("-b").unwrap()); - args.push(CString::new(b_string.as_str()).unwrap()); - /*if self.list_geometries { - args.push(CString::new("--list-geometries").unwrap()); - }*/ - - // if self.ignore_ambig_hits { - // args.push(CString::new("--ignore-ambig-hits").unwrap()); - // } else { - // args.push(CString::new("--max-ec-card").unwrap()); - // args.push(CString::new(self.max_ec_card.to_string()).unwrap()); - // } - - if self.no_poison { - args.push(CString::new("--no-poison").unwrap()); - } - - args.push(CString::new("--skipping-strategy").unwrap()); - args.push(CString::new(self.skipping_strategy.to_string()).unwrap()); - - if self.struct_constraints { - args.push(CString::new("--struct-constraints").unwrap()); - } - - if self.bed_format { - args.push(CString::new("--bed-format").unwrap()); - } - - if self.use_chr { - args.push(CString::new("--use-chr").unwrap()); - } - - if self.sam_format { - args.push(CString::new("--sam-format").unwrap()); - } - - if self.check_kmer_orphan { - args.push(CString::new("--kmers-orphans").unwrap()); - } - - args.push(CString::new("--thr").unwrap()); - args.push(CString::new(self.thr.to_string()).unwrap()); - - if self.no_tn5_shift { - args.push(CString::new("--tn5-shift").unwrap()); - args.push(CString::new("false").unwrap()); - } - - args.push(CString::new("--bin-size").unwrap()); - args.push(CString::new(self.bin_size.to_string()).unwrap()); - - args.push(CString::new("--bin-overlap").unwrap()); - args.push(CString::new(self.bin_overlap.to_string()).unwrap()); - - args.push(CString::new("--bclen").unwrap()); - args.push(CString::new(self.bclen.to_string()).unwrap()); - - // args.push(CString::new("--max-hit-occ").unwrap()); - // args.push(CString::new(self.max_hit_occ.to_string()).unwrap()); - - // args.push(CString::new("--max-hit-occ-recover").unwrap()); - // args.push(CString::new(self.max_hit_occ_recover.to_string()).unwrap()); - - // args.push(CString::new("--max-read-occ").unwrap()); - // args.push(CString::new(self.max_read_occ.to_string()).unwrap()); - - Ok(args) - } + /// the capacity of the cache used to provide fast lookup for k-mers at the ends of unitigs + #[arg(long, default_value_t = DefaultParams::END_CACHE_CAPACITY, help_heading = "Advanced options")] + pub end_cache_capacity: usize, }