From 408d1d8126ee1df01f09080efa93ffbcde756290 Mon Sep 17 00:00:00 2001 From: "Michael Ziminsky (Z)" Date: Wed, 9 Oct 2024 20:42:00 -0700 Subject: [PATCH] Rename project --- .github/ISSUE_TEMPLATE/bug-report.yml | 48 - .github/ISSUE_TEMPLATE/feature-request.yml | 24 - .github/workflows/build.yml | 122 - .github/workflows/ci.yml | 74 + .github/workflows/release.yml | 150 +- Cargo.lock | 3129 +++++++++++++++++ Cargo.toml | 2 +- README.md | 37 + ROADMAP.md | 23 - assets/icon.svg | 37 + cli/CHANGELOG.md | 21 + cli/Cargo.toml | 24 +- cli/README.md | 367 +- cli/src/cli.rs | 15 +- cli/src/file_picker.rs | 7 +- cli/src/helpers.rs | 4 +- cli/src/main.rs | 14 +- cli/src/subcommands/cache.rs | 2 +- cli/src/subcommands/modpack.rs | 2 +- cli/src/subcommands/mods.rs | 2 +- cli/src/subcommands/mods/add.rs | 2 +- cli/src/subcommands/mods/list.rs | 2 +- cli/src/subcommands/mods/locking.rs | 4 +- cli/src/subcommands/mods/mgmt.rs | 6 +- cli/src/subcommands/mods/remove.rs | 2 +- cli/src/subcommands/profile.rs | 4 +- cli/src/subcommands/profile/configure.rs | 2 +- cli/src/subcommands/profile/create.rs | 2 +- cli/src/subcommands/profile/delete.rs | 2 +- cli/src/subcommands/profile/helpers.rs | 4 +- cli/src/tui.rs | 8 +- cli/tests_old/configs/empty.json | 6 - cli/tests_old/configs/empty_profile.json | 14 - cli/tests_old/configs/one_profile_full.json | 36 - .../configs/two_modpacks_cfactive.json | 23 - .../configs/two_modpacks_mdactive.json | 23 - .../configs/two_profiles_one_empty.json | 43 - cli/tests_old/integration_tests.rs | 316 -- cli/tests_old/util.rs | 36 - clippy.toml | 2 +- curseforge-client/Cargo.toml | 1 - lib/CHANGELOG.md | 9 + lib/Cargo.toml | 16 +- lib/README.md | 15 +- lib/src/checked_types/path_scoped.rs | 4 +- lib/src/client.rs | 4 +- lib/src/client/service_id.rs | 4 +- lib/src/config/profile.rs | 7 +- lib/src/fs_util.rs | 1 + 49 files changed, 3498 insertions(+), 1204 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/ci.yml create mode 100644 Cargo.lock create mode 100644 README.md delete mode 100644 ROADMAP.md create mode 100644 assets/icon.svg create mode 100644 cli/CHANGELOG.md delete mode 100644 cli/tests_old/configs/empty.json delete mode 100644 cli/tests_old/configs/empty_profile.json delete mode 100644 cli/tests_old/configs/one_profile_full.json delete mode 100644 cli/tests_old/configs/two_modpacks_cfactive.json delete mode 100644 cli/tests_old/configs/two_modpacks_mdactive.json delete mode 100644 cli/tests_old/configs/two_profiles_one_empty.json delete mode 100644 cli/tests_old/integration_tests.rs delete mode 100644 cli/tests_old/util.rs create mode 100644 lib/CHANGELOG.md diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml deleted file mode 100644 index 2ce87cb..0000000 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Bug Report -description: File a bug report. -labels: ["bug"] -body: - - type: textarea - attributes: - label: Description - description: Describe the bug that occurs. - validations: - required: true - - - type: textarea - attributes: - label: Steps to reproduce - description: How can you reproduce this bug? You can also describe how you encountered the bug if you're unsure of how to make it happen again. - placeholder: | - For example: - 1. Run `ferium ...` - 2. ... doesn't properly change - 3. Run command again - 4. ... changes properly - ... - - - type: dropdown - attributes: - label: Operating System - description: The operating system are you encountered the bug on. - options: - - Windows - - Linux - - macOS - - other (Specify in Additional Information) - validations: - required: true - - - type: checkboxes - attributes: - label: Are you using the latest version of ferium? - description: The bug you encountered might have been fixed in a newer version, make sure you have the [latest version](https://github.com/gorilla-devs/ferium/releases/latest). - options: - - label: I am using the latest version of ferium - required: true - - - type: textarea - attributes: - label: Additional Information - description: Any additional information you would like to provide. You can even drop images or videos here. - diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml deleted file mode 100644 index ca85a43..0000000 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Feature Request -description: Suggest a new feature for the project. -labels: ["enhancement"] -body: - - type: textarea - attributes: - label: The Problem - description: What problem do you have, that this feature could resolve? - placeholder: | - For example: - I cannot do ... - I have to do ... every time. - validations: - required: true - - - type: textarea - attributes: - label: Your Solution(s) - description: Have you thought of ways ferium can solve your problem? If so, share them here. - placeholder: | - For example: - Ferium should do ... - Instead of doing ..., ferium should ... instead. - diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 8032dce..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,122 +0,0 @@ -name: Build - -on: - push: - # Do not run on tag pushes - branches: '**' - # Only run when; - paths: - # any Rust code has changed, - - "**.rs" - # this workflow has changed, - - ".github/workflows/build.yml" - # dependencies have changed, - - "Cargo.lock" - # or a rebuild is manually called. - workflow_dispatch: - -jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - steps: - - uses: actions/checkout@v4 - - name: Create `out/` - run: mkdir out - - # Install Rust on the various platforms - - - name: Install Rust for macOS - if: matrix.os == 'macos-latest' - uses: dtolnay/rust-toolchain@stable - with: - targets: aarch64-apple-darwin, x86_64-apple-darwin - - - name: Install Rust for Windows - if: matrix.os == 'windows-latest' - uses: dtolnay/rust-toolchain@stable - - - name: Install Rust for Linux - if: matrix.os == 'ubuntu-latest' - uses: dtolnay/rust-toolchain@stable - with: - targets: x86_64-pc-windows-gnu, x86_64-unknown-linux-musl, aarch64-unknown-linux-musl - - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt update - sudo apt install gcc-mingw-w64-x86-64 musl musl-tools gcc-aarch64-linux-gnu - curl https://apt.llvm.org/llvm.sh | sudo bash -s 17 - - - name: Install Rust cache - uses: Swatinem/rust-cache@v2 - - - name: Lint code - run: cargo clippy - - - name: Run tests - run: cargo test --no-default-features - - - name: Build macOS Intel - if: matrix.os == 'macos-latest' - run: | - cargo build --target=x86_64-apple-darwin --release - zip -r out/ferium-macos-x64.zip -j target/x86_64-apple-darwin/release/ferium - - - name: Build macOS ARM - if: matrix.os == 'macos-latest' - run: | - cargo build --target=aarch64-apple-darwin --release - zip -r out/ferium-macos-arm.zip -j target/aarch64-apple-darwin/release/ferium - - - name: Build Windows MSVC - if: matrix.os == 'windows-latest' - run: | - cargo build --target=x86_64-pc-windows-msvc --release - Compress-Archive -Path "target\x86_64-pc-windows-msvc\release\ferium.exe" -DestinationPath "out\ferium-windows-msvc.zip" - - - name: Build Linux - if: matrix.os == 'ubuntu-latest' - run: | - cargo build --target=x86_64-unknown-linux-musl --release - zip -r out/ferium-linux.zip -j target/x86_64-unknown-linux-musl/release/ferium - - - name: Build ARM Linux - if: matrix.os == 'ubuntu-latest' - run: | - cargo rustc --target=aarch64-unknown-linux-musl --release -- -Clink-self-contained=yes -Clinker=rust-lld - zip -r out/ferium-linux-arm64.zip -j target/aarch64-unknown-linux-musl/release/ferium - env: - CC_aarch64_unknown_linux_musl: clang-17 - - - name: Build Linux nogui - if: matrix.os == 'ubuntu-latest' - run: | - cargo build --target=x86_64-unknown-linux-musl --release --no-default-features - zip -r out/ferium-linux-nogui.zip -j target/x86_64-unknown-linux-musl/release/ferium - - - name: Build ARM Linux nogui - if: matrix.os == 'ubuntu-latest' - run: | - cargo rustc --target=aarch64-unknown-linux-musl --release --no-default-features -- -Clink-self-contained=yes -Clinker=rust-lld - zip -r out/ferium-linux-arm64-nogui.zip -j target/aarch64-unknown-linux-musl/release/ferium - env: - CC_aarch64_unknown_linux_musl: clang-17 - - - name: Build Windows GNU - if: matrix.os == 'ubuntu-latest' - run: | - cargo build --target=x86_64-pc-windows-gnu --release - zip -r out/ferium-windows-gnu.zip -j target/x86_64-pc-windows-gnu/release/ferium.exe - - - name: Upload build artefacts - uses: actions/upload-artifact@v4 - with: - name: binaries-${{ matrix.os }} - path: out/ferium*.zip - if-no-files-found: error diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9f6e380 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,74 @@ +name: ci +on: + workflow_dispatch: + pull_request: + push: + paths: + - Cargo.lock + - "**/Cargo.toml" + - "*.toml" + - "**.rs" + - .github/workflows/ci.yml + branches: + - main + schedule: + - cron: "03 02 01 * *" + +permissions: + contents: read + +jobs: + rustfmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: nightly + components: rustfmt + - name: Check formatting + uses: actions-rust-lang/rustfmt@v1 + + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: nightly + components: clippy + - name: Lint code + run: cargo clippy --locked --release --verbose --workspace + + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Check documentation + run: cargo doc --no-deps --document-private-items --locked --release --verbose --workspace + + build_and_test: + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - windows-latest + - macos-latest + rust: + # MSRV + - 1.80.0 + - stable + - beta + - nightly + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + - name: build + run: cargo build --locked --release --verbose --workspace + - name: test + run: cargo test --locked --release --verbose --workspace diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1bbc09d..50ec07c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,110 +1,64 @@ -name: Publish and Release - +name: Release on: - workflow_dispatch: push: - tags: "*" - -jobs: - crates-publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Upload to crates.io - run: cargo publish - env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} - - gh-release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Download artifacts - uses: dawidd6/action-download-artifact@v3 - with: - workflow_conclusion: success - workflow: build.yml - path: ./out + tags: + - v* - - name: Create sha256sum for Scoop - run: sha256sum ./out/**/ferium-windows-msvc.zip | cut -d ' ' -f 1 > ./out/ferium-windows-msvc.zip.sha256 +permissions: + contents: read - # Remove the dots for the markdown header - - name: MD Header - run: echo "MD_HEADER=$(git describe --tags --abbrev=0 | sed 's/\.//g')" >> $GITHUB_ENV - - - name: Get the latest tag - run: echo "TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - - - name: Create release - uses: softprops/action-gh-release@v1 - with: - files: ./out/** - name: Ferium ${{ env.TAG }} - tag_name: ${{ env.TAG }} - body: | - Compiled binaries for Ferium version `${{ env.TAG }}` ([changelog](${{ github.server_url }}/${{ github.repository }}/blob/main/CHANGELOG.md#${{ env.MD_HEADER }})) - - The provided binaries are for: - - Linux ARM without a GUI file dialogue - - Linux ARM (aarch64 linux musl) - - Linux without a GUI file dialogue - - Linux (x64 linux musl) - - macOS Apple Silicon (aarch64 darwin) - - macOS Intel (x64 darwin) - - GNU Windows (x64 windows gnu) (i.e. Cygwin/MinGW) - - Windows (x64 windows msvc) - - You can install ferium by downloading and unzipping the appropriate asset, and moving the executable to ~/bin or any other folder in your path. - - aur-update: +jobs: + create-release: runs-on: ubuntu-latest - needs: gh-release + permissions: + contents: write steps: - uses: actions/checkout@v4 + - uses: taiki-e/create-gh-release-action@v1 with: - fetch-depth: 0 - - - name: Get the latest tag - run: echo "TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - - - name: Update no-gui AUR package - uses: ATiltedTree/create-aur-release@v1 - with: - package_name: ferium-bin - package_version: ${{ env.TAG }} - commit_username: "Ilesh Thiada" - commit_email: ileshkt@gmail.com - ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }} - - name: Update gui AUR package - uses: ATiltedTree/create-aur-release@v1 - with: - package_name: ferium-gui-bin - package_version: ${{ env.TAG }} - commit_username: "Ilesh Thiada" - commit_email: ileshkt@gmail.com - ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }} - - homebrew-update: - runs-on: ubuntu-latest + changelog: cli/CHANGELOG.md + token: ${{ secrets.GITHUB_TOKEN }} + + upload-assets: + needs: create-release + permissions: + contents: write + strategy: + fail-fast: false + matrix: + include: + - { os: ubuntu-latest, target: aarch64-unknown-linux-gnu , no-gui: true } + - { os: ubuntu-latest, target: aarch64-unknown-linux-musl , no-gui: true } + - { os: ubuntu-latest, target: arm-unknown-linux-gnueabihf , no-gui: true } + - { os: ubuntu-latest, target: arm-unknown-linux-musleabihf, no-gui: true } + - { os: ubuntu-latest, target: i686-unknown-linux-gnu } + - { os: ubuntu-latest, target: i686-unknown-linux-musl } + - { os: ubuntu-latest, target: x86_64-unknown-linux-gnu } + - { os: ubuntu-latest, target: x86_64-unknown-linux-musl } + + - { os: macos-latest, target: aarch64-apple-darwin } + - { os: macos-latest, target: x86_64-apple-darwin } + + - { os: windows-latest, target: i686-pc-windows-msvc } + - { os: windows-latest, target: x86_64-pc-windows-msvc } + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 + - uses: taiki-e/install-action@cross + - name: Build Default + uses: taiki-e/upload-rust-binary-action@v1 with: - fetch-depth: 0 - - - name: Get the latest tag - run: echo "TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - - - name: Update Homebrew formula - uses: mislav/bump-homebrew-formula-action@v3 + bin: allaerris + target: ${{ matrix.target }} + token: ${{ secrets.GITHUB_TOKEN }} + checksum: sha256 + - name: Build GUI + if: ${{ ! matrix.no-gui }} + uses: taiki-e/upload-rust-binary-action@v1 with: - tag-name: ${{ env.TAG }} - env: - COMMITTER_TOKEN: ${{ secrets.COMMITTER_TOKEN }} + bin: allaerris + target: ${{ matrix.target }} + token: ${{ secrets.GITHUB_TOKEN }} + checksum: sha256 + features: gui + archive: $bin-$target-gui diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f1499c7 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3129 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "allaerris" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-scoped", + "clap", + "clap_complete", + "dialoguer", + "dirs", + "ferrallay", + "indicatif", + "itertools", + "reqwest", + "rfd", + "serde", + "serde_json", + "size", + "tokio", + "url", + "walkdir", + "yansi", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "ashpd" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe7e0dd0ac5a401dc116ed9f9119cf9decc625600474cb41f0fc0a0050abc9a" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand", + "raw-window-handle", + "serde", + "serde_repr", + "tokio", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-io" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-scoped" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4042078ea593edffc452eef14e99fdb2b120caa4ad9618bcdeabc4a023b98740" +dependencies = [ + "futures", + "pin-project", + "tokio", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + +[[package]] +name = "cc" +version = "1.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "clap" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_complete" +version = "4.5.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "205d5ef6d485fa47606b98b0ddc4ead26eb850aaa86abfb562a94fb3280ecba0" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curseforge-client" +version = "1.0.0" +dependencies = [ + "reqwest", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "thiserror", + "url", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "ferrallay" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-scoped", + "curseforge-client", + "dirs", + "itertools", + "modrinth-client", + "octocrab", + "paste", + "reqwest", + "serde", + "serde-value", + "serde_json", + "serde_test", + "sha1", + "thiserror", + "tokio", + "url", + "zip", +] + +[[package]] +name = "flate2" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "log", + "rustls 0.22.4", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls 0.23.13", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "9.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" +dependencies = [ + "base64 0.21.7", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "modrinth-client" +version = "2.7.0" +dependencies = [ + "reqwest", + "serde", + "serde_derive", + "serde_json", + "thiserror", + "url", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] + +[[package]] +name = "octocrab" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9305e4c99543ecd0f42bd659c9e9d6ca7115fe5e37d5c85a7277b1db0d4c4101" +dependencies = [ + "arc-swap", + "async-trait", + "base64 0.22.1", + "bytes", + "cfg-if", + "chrono", + "either", + "futures", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls 0.26.0", + "hyper-util", + "jsonwebtoken", + "once_cell", + "percent-encoding", + "pin-project", + "secrecy", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "snafu", + "tower", + "tower-http", + "url", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + +[[package]] +name = "portable-atomic" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.13", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.13", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls 0.27.3", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.13", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "windows-registry", +] + +[[package]] +name = "rfd" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8af382a047821a08aa6bfc09ab0d80ff48d45d8726f7cd8e44891f7cb4a4278e" +dependencies = [ + "ashpd", + "block2", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "pollster", + "raw-window-handle", + "urlencoding", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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 = "schannel" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_test" +version = "1.0.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f901ee573cab6b3060453d2d5f0bae4e6d628c23c0a962ff9b5f1d7c8d4f1ed" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + +[[package]] +name = "size" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "snafu" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b835cb902660db3415a672d862905e791e54d306c6e8189168c7f3d9ae1c79d" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1e02fca405f6280643174a50c942219f0bbf4dbf7d480f1dd864d6f211ae5" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.4", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.13", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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 = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +dependencies = [ + "bitflags", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +dependencies = [ + "bitflags", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +dependencies = [ + "rustls-pki-types", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[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-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +dependencies = [ + "memchr", +] + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-process", + "async-recursion", + "async-trait", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tokio", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zip" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap", + "memchr", + "thiserror", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "url", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 75ce202..471af6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = ["cli", "lib", "*-client"] [workspace.package] edition = "2021" -rust-version = "1.80.0" +repository = "https://github.com/mgziminsky/allaerris" [workspace.dependencies] anyhow = "1.0" diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea49eb5 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +
+Logo Icon + +[![rust badge](https://img.shields.io/static/v1?label=Made%20with&message=Rust&logo=rust&labelColor=e82833&color=b11522)](https://www.rust-lang.org) +[![licence badge](https://img.shields.io/github/license/mgziminsky/allaerris)](LICENSE.txt) +[![ci.yml](https://github.com/mgziminsky/allaerris/actions/workflows/ci.yml/badge.svg)](.github/workflows/ci.yml) + +
+ +Another Minecraft mod manager, heavily inspired by [ferium]. +The project names are a [portmanteau] of [ferris] and [allay]. +In my head lore, the core lib [`ferrallay`] can be thought of as a "species" of [allay] with claws for arms, and the cli [`allaerris`] is the name of one such individual of said species. + +This project was initially going to be some feature PRs to the [libium] and [ferium] projects by [gorilla-devs], +but it quickly became apparent the features and functionality I wanted didn't fit into the existing architecture. +Since I needed a project to keep me busy and practice with, I decided to basically start over and build what I wanted. + +I mainly wanted something that provided more control over profile mods, especially when using a modpack. The primary features/differences from [ferium] are: + +- Allow overriding/excluding mods from a modpack +- Support locking mods to a specific version +- Selectively update installed mods/packs +- Keep track of installed files for cleaner updates +- Won't touch files from other sources to support easy manual customization +- Detect profile of working directory tree and use it when present +- Globally cached file downloads +- API clients generated from OpenAPI specs to support full functionality + + +[gorilla-devs]: https://github.com/gorilla-devs +[libium]: https://github.com/gorilla-devs/libium +[ferium]: https://github.com/gorilla-devs/ferium +[portmanteau]: https://farside.link/wikipedia.org/wiki/Blend_word +[ferris]: https://rustacean.net/ +[allay]: https://minecraft.wiki/w/Allay +[`ferrallay`]: ./lib +[`allaerris`]: ./cli diff --git a/ROADMAP.md b/ROADMAP.md deleted file mode 100644 index b920684..0000000 --- a/ROADMAP.md +++ /dev/null @@ -1,23 +0,0 @@ -# WIP - -# Planned - In no particular order -- Handle dependencies during add and update -- Github use graphql. Requires API token -- Support server/client distinction in profile -- Support full profile deployment including installing loaders and vanilla client/server -- Support any project type, not just mods and packs -- Link mods into profile instead of copying when possible - -# Completed -- Profile add/remove/update/show/list -- Mods/Modpack add/remove/list -- Apply/install profile -- Allow overriding/deleting mods from a modpack -- Update installed mods -- Detect profile of working directory tree and use it if present -- Allow selective updates by passing project ids -- Add option to immediately apply updates, or prompt to apply when not specified -- Cache management commands -- Support cache bypass and/or force redownload during profile apply -- "Scan" existing mod files and add to profile -- CLI for locking/unlocking mods diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 0000000..8db6987 --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md new file mode 100644 index 0000000..934073a --- /dev/null +++ b/cli/CHANGELOG.md @@ -0,0 +1,21 @@ +## [Planned] - In no particular order +- Github use graphql. Requires API token + +## [WIP] + +## [Unreleased] + + +## [0.1.0] - Initial Release +- Profile add/remove/update/show/list +- Mods/Modpack add/remove/list +- Apply/install profile +- Allow overriding/deleting mods from a modpack +- Update installed mods +- Detect profile of working directory tree and use it if present +- Selective updates by passing project ids +- Option to immediately apply updates, or prompt to apply when not specified +- Cache management commands +- Support cache bypass and/or force redownload during profile apply +- "Scan" existing mod files and add to profile +- Lock/unlock mods to specific version diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 6f23e5b..71b90a0 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,18 +1,12 @@ [package] -name = "ferium" +name = "allaerris" resolver = "2" -version = "4.5.2" +version = "0.1.0" edition.workspace = true -rust-version.workspace = true -authors = [ - "Michael Ziminsky (Z)", - "Ilesh Thiada (theRookieCoder) ", - "薛詠謙 (KyleUltimate)", - "Daniel Hauck (SolidTux)", -] +repository.workspace = true +rust-version = "1.80.0" +authors = ["Michael Ziminsky (Z)"] description = "Fast CLI program for managing Minecraft mods and modpacks from Modrinth, CurseForge, and Github Releases" -exclude = [".github", "tests", "media"] -repository = "https://github.com/gorilla-devs/ferium" categories = ["command-line-utilities"] readme = "README.md" license = "MPL-2.0" @@ -26,9 +20,9 @@ gui = ["rfd"] clap = { version = "4.5", features = ["derive"] } clap_complete = "4.5" dialoguer = "0.11" +ferrallay = { version = "0.1", path = "../lib" } indicatif = "0.17" -relibium = { version = "2", path = "../lib" } -rfd = { version = "0.14", default-features = false, optional = true, features = [ +rfd = { version = "0.15", default-features = false, optional = true, features = [ "xdg-portal", "tokio", ] } @@ -46,9 +40,5 @@ serde_json.workspace = true tokio = { workspace = true, features = ["rt-multi-thread"] } url.workspace = true - -[dev-dependencies] -rand = "0.8" - [lints] workspace = true diff --git a/cli/README.md b/cli/README.md index 9796ae7..e1e6b62 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,350 +1,107 @@ -# Ferium - -[![rust badge](https://img.shields.io/static/v1?label=Made%20with&message=Rust&logo=rust&labelColor=e82833&color=b11522)](https://www.rust-lang.org) -[![licence badge](https://img.shields.io/github/license/gorilla-devs/ferium)](https://github.com/gorilla-devs/ferium/blob/main/LICENSE.txt) -[![build.yml](https://github.com/gorilla-devs/ferium/actions/workflows/build.yml/badge.svg)](https://github.com/gorilla-devs/ferium/actions/workflows/build.yml) - -> Check out ferium's sister projects [ferinth](https://github.com/gorilla-devs/ferinth) and [furse](https://github.com/gorilla-devs/furse). -> They are Rust wrappers for the official Modrinth and CurseForge APIs respectively. - -Ferium is a fast and feature rich CLI program for downloading and updating Minecraft mods from [Modrinth](https://modrinth.com/mods), [CurseForge](https://curseforge.com/minecraft/mc-mods), and [GitHub Releases](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases), and modpacks from [Modrinth](https://modrinth.com/modpacks) and [CurseForge](https://curseforge.com/minecraft/modpacks). +# Allaerris +Allaerris is a fast and feature rich CLI program for downloading and updating Minecraft mods from [Modrinth](https://modrinth.com/mods), [CurseForge](https://curseforge.com/minecraft/mc-mods), and [GitHub Releases](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases), and modpacks from [Modrinth](https://modrinth.com/modpacks) and [CurseForge](https://curseforge.com/minecraft/modpacks). Simply specify the mods you use, and in just one command you can download the latest compatible version of all the mods you configured. -## Features - -- Use the CLI to easily automate your modding experience -- Download mods from multiple sources, namely [Modrinth](https://modrinth.com/mods), [CurseForge](https://curseforge.com/minecraft/mc-mods), and [GitHub Releases](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases) -- Download modpacks from multiple sources, namely [Modrinth](https://modrinth.com/modpacks) and [CurseForge](https://curseforge.com/minecraft/modpacks) --
- Beautiful and informative UI - - #### Profile info and listing mods - ![Profile Information and Listing Mods](media/profile_info_and_list.png) - - #### Listing mods verbosely - ![Listing Mods Verbosely](media/list_verbose.png) - - #### Upgrading mods/modpacks - ![Upgrading Mods/Modpacks](media/upgrade.png) -
- --
- It's super fast due to multithreading for network intensive tasks - - Your results may vary depending on your internet connection. - - It downloads my modpack [Kupfur](https://github.com/theRookieCoder/Kupfur) with 79 mods in 15 seconds: - - https://github.com/gorilla-devs/ferium/assets/60034030/cfe2f0aa-3c10-41ca-b223-367925309ea9 - - It downloads [MMTP](https://www.curseforge.com/minecraft/modpacks/mats-mega-tech-pack), a very large modpack with around 400 mods, in just under a minute: - - https://github.com/gorilla-devs/ferium/assets/60034030/857e8d27-372d-4cdd-90af-b0d77cb7e90c -
- -- Upgrade all your mods to the latest compatible version in one command, `ferium upgrade` - - Ferium checks that the version being downloaded is the latest one that is compatible with the configured mod loader and Minecraft version -- Download and install the latest version of your modpack in one command, `ferium modpack upgrade` -- Create multiple profiles and configure different mod loaders, Minecraft versions, output directories, and mods for each - ## Installation - -Ferium executables from GitHub Releases do not require any external dependencies at runtime. -If you compile from source on Linux, using GCC to build will result in binaries that require GCC to be available at runtime. -On Linux, the regular versions require some sort of desktop environment to be available that offers an XDG Desktop Portal to show the folder picker. -The `nogui` versions do not need this as they won't have a GUI folder picker, making these variants suitable for server use. - -> [!IMPORTANT] -> Linux users! Use the `nogui` versions (or compile with `--no-default-features`) if you do not have a desktop environment (like GNOME, KDE, XFCE, etc.) - -### Packages - -Have knowledge/experience maintaining packages? Consider [helping with adding and maintaining ferium for your favourite package manager.](https://github.com/gorilla-devs/ferium/discussions/292) - -#### [Arch User Repository](https://aur.archlinux.org) for _Arch Linux_ - -[![AUR](https://repology.org/badge/version-for-repo/aur/ferium.svg)](https://aur.archlinux.org/packages?K=ferium) - -> [!NOTE] -> From-source builds will install the Rust toolchain and GCC. - -| Installation method | GUI file dialogue | No GUI | -| ----------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------- | -| Install pre-built binaries from GitHub Releases | **[ferium-gui-bin](https://aur.archlinux.org/packages/ferium-gui-bin)** | [ferium-bin](https://aur.archlinux.org/packages/ferium-bin) | -| Build from source at the latest tag | [ferium-gui](https://aur.archlinux.org/packages/ferium-gui) | [ferium](https://aur.archlinux.org/packages/ferium) | -| Build from source using the latest commit | [ferium-gui-git](https://aur.archlinux.org/packages/ferium-gui-git) | [ferium-git](https://aur.archlinux.org/packages/ferium-git) | - -#### [Homebrew](https://brew.sh) for _macOS_ or _Linux_ -[![Homebrew](https://repology.org/badge/version-for-repo/homebrew/ferium.svg)](https://formulae.brew.sh/formula/ferium) -```bash -brew install ferium -``` - -#### [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget) for _Windows_ -[![winget](https://img.shields.io/badge/winget_package-gray)](https://winstall.app/apps/GorillaDevs.Ferium) - -```powershell -winget install GorillaDevs.Ferium -``` - -#### [Scoop](https://scoop.sh) for _Windows_ -[![Scoop](https://repology.org/badge/version-for-repo/scoop/ferium.svg)](https://scoop.sh/#/apps?q=ferium&id=d17eaa5fe92af6d5eddb853f06bf27d162cadbba) -```powershell -scoop bucket add games -scoop install ferium -``` - -#### [Pacstall](https://pacstall.dev) for _Ubuntu_ -[![Pacstall](https://repology.org/badge/version-for-repo/pacstall/ferium.svg)](https://pacstall.dev/packages/ferium-bin) -```bash -pacstall -I ferium-bin -``` - -#### [Nixpkgs](https://nixos.wiki/wiki/Nixpkgs) for _NixOS_ or _Linux_ -[![Nixpkgs unstable](https://repology.org/badge/version-for-repo/nix_unstable/ferium.svg)](https://search.nixos.org/packages?show=ferium&channel=unstable) +### GitHub Releases +[![GitHub Releases](https://img.shields.io/github/v/release/mgziminsky/allaerris?color=bright-green&label=github%20releases)](https://github.com/mgziminsky/allaerris/releases) > [!NOTE] -> See the package page for installation instructions: -> https://search.nixos.org/packages?show=ferium&channel=unstable - -#### [Portage](https://wiki.gentoo.org/wiki/Portage) for _Gentoo_ -Available on [LoaTcHi's overlay](https://github.com/Loatchi/loatchi-overlay) -```bash -eselect repository enable loatchi -emaint sync -r loatchi -emerge -av ferium -``` - -#### [XBPS](https://xbps-api-docs.voidlinux.org) for _Void Linux_ -[![Void Linux x86_64](https://repology.org/badge/version-for-repo/void_x86_64/ferium.svg)](https://voidlinux.org/packages/?q=ferium) -```bash -xbps install ferium -``` - -#### [crates.io](https://crates.io) using the _Rust toolchain_ -[![crates.io](https://repology.org/badge/version-for-repo/crates_io/rust:ferium.svg)](https://crates.io/crates/ferium) -```bash -cargo install ferium -``` -> [!TIP] -> Use a tool like [cargo-update](https://crates.io/crates/cargo-update) to keep ferium updated to the latest version! - -#### GitHub Releases -[![GitHub Releases](https://img.shields.io/github/v/release/gorilla-devs/ferium?color=bright-green&label=github%20releases)](https://github.com/gorilla-devs/ferium/releases) -> [!IMPORTANT] > You will have to manually download and install every time there is a new update. -1. Download the asset suitable for your operating system from the [latest release](https://github.com/gorilla-devs/ferium/releases/latest) +1. Download the asset suitable for your operating system from the [latest release](https://github.com/mgziminsky/allaerris/releases/latest) 2. Unzip the file and move it to a folder in your path, e.g. `~/bin` 3. Remember to check the releases page for any updates! ## Overview / Help Page > [!NOTE] -> A lot of ferium's backend is in a separate project; [libium](https://github.com/theRookieCoder/libium). -> It deals with things such as the config, adding mod(pack)s, upgrading, file pickers, etc. +> A lot of allaerris' backend is in a separate project; [ferrallay](../lib). +> It contains most of the functional implementation of the project. -### Program Configuration +## Program Configuration -Ferium stores profile and modpack information in its config file. By default, this is located at `~/.config/ferium/config.json`. -You can change this in 2 ways, setting the `FERIUM_CONFIG_FILE` environment variable, or setting the `--config-file` global flag. +Allaerris stores profile and modpack information in its config file. By default, this is located at `~/.config/ferrallay/config.json`. +You can change this in 2 ways, setting the `ALLAERRIS_CONFIG_FILE` environment variable, or passing the `--config-file` global flag. The flag always takes precedence. -> [!CAUTION] -> Be careful when manually editing the config file - You can also set a custom CurseForge API key or GitHub personal access token using the `CURSEFORGE_API_KEY` and `GITHUB_TOKEN` environment variables, or the `--curseforge_api_key` and `--github-token` global flags respectively. Again, the flags take precedence. -### First Startup - -You can either have your own set of mods in what is called a 'profile', or install a modpack. +## Quickstart -- [Create a new profile](#creating) by running `ferium profile create` and entering the details for your profile. - - Then, [add your mods](#adding-mods) using `ferium add`. - - Finally, download your mods using `ferium upgrade`. -- [Add a modpack](#adding-modpacks) by running `ferium modpack add `. - - After which, run `ferium modpack upgrade` to download and install the latest version of the modpack. +- [Create a new profile](#create) by running `allaerris profile new` and entering the details for your profile. +- [Add your mods](#adding) using `allaerris add`. +- [Set a modpack](#setting-a-modpack) using `allaerris modpack set`. +- Finally, download your mods using `allaerris apply`. -### Adding Mods - -#### Modrinth -```bash -ferium add project_id -``` +## Profiles +### Create +Create a profile by running `allaerris profile new` and specifying the following: +> [!TIP] +> You can also provide these settings as command line options to avoid interactivity for things like scripts +- Profile path +- Profile Name +- Minecraft version +- Mod loader -`project_id` is the slug or project ID of the mod. (e.g. [Sodium](https://modrinth.com/mod/sodium) has the slug `sodium` and project ID `AANobbMI`). You can find the slug in the website URL (`modrinth.com/mod/`), and the project ID at the bottom of the left sidebar under 'Technical information'. -So to add [Sodium](https://modrinth.com/mod/sodium), you can run `ferium add sodium` or `ferium add AANobbMI`. +After creation, the new profile will automatically be set as the active profile. -#### CurseForge -```bash -ferium add project_id -``` -`project_id` is the project ID of the mod. (e.g. [Terralith](https://www.curseforge.com/minecraft/mc-mods/terralith) has the project id `513688`). You can find the project id at the top of the right sidebar under 'About Project'. -So to add [Terralith](https://www.curseforge.com/minecraft/mc-mods/terralith), you should run `ferium add 513688`. +### Edit +You can change the same settings afterwards by running `allaerris profile edit`. Again, you can provide these settings as options. -#### GitHub -```bash -ferium add owner/name -``` -`owner` is the username of the owner of the repository and `name` is the name of the repository, both are case-insensitive. (e.g. [Sodium's repository](https://github.com/CaffeineMC/sodium-fabric) has the id `CaffeineMC/sodium-fabric`). You can find these at the top left of the repository's page as a big 'owner / name'. -So to add [Sodium](https://github.com/CaffeineMC/sodium-fabric), you should run `ferium add CaffeineMC/sodium-fabric` (again, case-insensitive). -> [!IMPORTANT] -> The GitHub repository needs to upload JAR files to their Releases for ferium to download, or else it will refuse to be added. +### Manage +You can get information about the current profile by running `allaerris profile` or `allaerris profile info`, and about all the profiles you have by running `allaerris profiles` or `allaerris profile list`. -#### User Mods +Switch to a different profile using `allaerris profile switch`. -If you want to use files that are not downloadable by ferium, place them in a subfolder called `user` in the output directory. Files here will be copied to the output directory when upgrading. +Delete a profile using `allaerris profile delete` and selecting the profile you want to delete or providing the profile name or path directly. -> [!NOTE] -> Profiles using Quilt will not copy their user mods, this is because Quilt automatically loads mods from nested directories (such as the user folder) since version `0.18.1-beta.3`. -### Adding Modpacks +## Mods +### Adding +```bash +allaerris add +``` #### Modrinth -``` -ferium modpack add project_id -``` -`project_id` is the slug or project ID of the modpack. (e.g. [Fabulously Optimized](https://modrinth.com/modpack/fabulously-optimized) has the slug `fabulously-optimized` and project ID `1KVo5zza`). You can find the slug in the website URL (`modrinth.com/modpack/`), and the project id at the bottom of the left sidebar under 'Technical information'. -So to add [Fabulously Optimized](https://modrinth.com/modpack/fabulously-optimized), you can run `ferium modpack add fabulously-optimized` or `ferium modpack add 1KVo5zza`. +`project_id` is the slug or project ID of the mod. (e.g. [Sodium](https://modrinth.com/mod/sodium) has the slug `sodium` and project ID `AANobbMI`). You can find the slug in the website URL (`modrinth.com/mod/`), and the project ID using the "Copy ID" button nested in the 3-dot menu. +So to add [Sodium](https://modrinth.com/mod/sodium), you can run `allaerris add sodium` or `allaerris add AANobbMI`. #### CurseForge -``` -ferium modpack add project_id -``` -`project_id` is the project ID of the modpack. (e.g. [Fabulously Optimized](https://www.curseforge.com/minecraft/modpacks/fabulously-optimized) has the project ID `396246`). You can find the project ID at the top of the right sidebar under 'About Project'. -So to add [Fabulously Optimized](https://www.curseforge.com/minecraft/modpacks/fabulously-optimized), you should run `ferium modpack add 396246`. - -### Upgrading Mods - -> [!WARNING] -> If your output directory is not empty when setting it, ferium will offer to create a backup. -> Please do so if it contains any files you would like to keep. - -Now after adding all your mods, run `ferium upgrade` to download all of them to your output directory. -This defaults to `.minecraft/mods`, where `.minecraft` is the default Minecraft resources directory. You don't need to worry about this if you play with Mojang's launcher and use the default resources directory. -You can choose to pick a custom output directory during profile creation or [change it later](#configure-1). - -If ferium fails to download a mod, it will print its name in red and try to give a reason. It will continue downloading the rest of your mods and will exit with an error. - -> [!TIP] -> When upgrading, any files not downloaded by ferium will be moved to the `.old` folder in the output directory. -> See [user mods](#user-mods) for information on how to add mods that ferium cannot download. - -### Upgrading Modpacks - -> [!WARNING] -> If your output directory's `mods` and/or `resourcepacks` folders are not empty when setting it, ferium will offer to create a backup. -> Please do so if it contains any files you would like to keep. - -Now after adding your modpack, run `ferium modpack upgrade` to download the modpack to your output directory. -This defaults to `.minecraft`, which is the default Minecraft resources directory. You don't need to worry about this if you play with Mojang's launcher and use the default resources directory. -You can choose to pick a custom output directory when adding the modpack or [change it later](#configure). - -If ferium fails to download a mod, it will print its name in red and try to give a reason. It will continue downloading the rest of the mods and will exit with an error. - -> [!CAUTION] -> If you choose to install modpack overrides, your existing configs may be overwritten when upgrading. - -### Managing Mods - -You can list out all the mods in your current profile by running `ferium list`. If you want to see more information about them, you can use `ferium list -v` or `ferium list --verbose`. - -You can remove any of your mods using `ferium remove`; just select the ones you would like to remove using the space key, and press enter once you're done. You can also provide the names or IDs of the mods to remove as arguments. +`project_id` is the project ID of the mod. (e.g. [Terralith](https://www.curseforge.com/minecraft/mc-mods/terralith) has the project id `513688`). You can find the project id at the top of the sidebar under 'About Project'. +So to add [Terralith](https://www.curseforge.com/minecraft/mc-mods/terralith), you should run `allaerris add 513688`. +#### GitHub +`project_id` in the format `owner/repo` where `owner` is the username of the owner of the repository and `repo` is the name of the repository, both are case-insensitive. (e.g. [Sodium's repository](https://github.com/CaffeineMC/sodium-fabric) has the id `CaffeineMC/sodium-fabric`). You can find these at the top left of the repository's page as a big 'owner / name'. +So to add [Sodium](https://github.com/CaffeineMC/sodium-fabric), you should run `allaerris add CaffeineMC/sodium-fabric` (again, case-insensitive). > [!IMPORTANT] -> Both mod names and GitHub repository identifiers are case insensitive. -> Mod names with spaces have to be given in quotes (`ferium remove "ok zoomer"`) or the spaces should be escaped (usually `ferium remove ok\ zoomer`, but depends on the shell). - -#### Check Overrides - -If some mod is supposed to be compatible with your game version and mod loader, but ferium does not download it, [create an issue](https://github.com/gorilla-devs/ferium/issues/new?labels=bug&template=bug-report.md) if you think it's a bug. - -If you suspect the author has not specified compatible versions or mod loaders, you can disable the game version or mod loader checks by using the `--ignore-game-version` and/or `--ignore-mod-loader` flags when adding the mod, or manually setting `check_game_version` and/or `check_mod_loader` to false for the specific mod in the config file. +> The GitHub repository needs to upload built jar/zip/mrpack files to their Releases for allaerris to download, otherwise it will fail when applying the profile. -For example, [Just Enough Items](https://www.curseforge.com/minecraft/mc-mods/jei) does not specify the mod loader for older Minecraft versions such as `1.12.2`. In this case, you would add JEI by running `ferium add 238222 --dont-check-mod-loader` so that the mod loader check is disabled. -You can also manually disable the mod loader (and/or game version) check(s) in the config like so: -```json -{ - "name": "Just Enough Items (JEI)", - "identifier": { - "CurseForgeProject": 238222 - }, - "check_mod_loader": false -} +### Setting a Modpack +```bash +allaerris modpack set ``` +`profile_id` follows the same guidelines as for [adding mods](#adding-mods) -### Managing Modpacks - -#### Adding - -When adding a modpack, you will configure the following: - -- Output directory - - This defaults to `.minecraft`, which is the default Minecraft resources directory. You don't need to worry about this if you play with Mojang's launcher and use the default resources directory. -- Whether to install modpack overrides - -> [!TIP] -> You can also provide these settings as flags to avoid interactivity for things like scripts - -> [!NOTE] -> Ferium will automatically switch to the newly added modpack - -#### Configuring - -You can configure these same settings afterwards by running `ferium modpack configure`. Again, you can provide these settings as flags. - -#### Manage - -You can list out all the modpacks you have added by running `ferium modpack list` or `ferium modpacks`. -Switch to a different modpack using `ferium modpack switch`. -Remove a modpack using `ferium modpack remove` and selecting the modpack you want to remove. - -### Profiles - -#### Creating - -You can create a profile by running `ferium profile create` and specifying the following: +### Manage Mods +Download and install all mods to the active provile using `allaerris apply`. +If allaerris fails to download a mod, it will print its name and try to give a reason while continuing to download the rest of your mods. -- Output directory - - This defaults to `.minecraft/mods` where `.minecraft` is the default Minecraft resources directory. You don't need to worry about this if you play with Mojang's launcher and use the default resources directory. -- Name of the profile -- Minecraft version -- Mod loader +You can list out all the mods in your current profile by running `allaerris list`. If you want to see more information about them, you can use `allaerris list -v`. -If you want to copy the mods from another profile, use the `--import` flag. -You can also directly provide the profile name to the flag if you don't want a profile picker to be shown. +You can remove any of your mods using `allaerris remove`; just select the ones you would like to remove using the space key, and press enter once you're done. You can also provide the names or IDs of the mods to remove as arguments. > [!NOTE] -> Ferium will automatically switch to the newly created profile - -> [!TIP] -> You can also provide these settings as flags to avoid interactivity for things like scripts - - -#### Configure - -You can configure these same settings afterwards by running `ferium profile configure`. Again, you can provide these settings as flags. - -#### Manage +> Both mod names and GitHub repository identifiers are case insensitive. +> Mod names with spaces have to be given in quotes (`allaerris remove "ok zoomer"`) or the spaces should be escaped (usually `allaerris remove ok\ zoomer`, but depends on the shell). -You can get information about the current profile by running `ferium profile` or `ferium profile info`, and about all the profiles you have by running `ferium profiles` or `ferium profile list`. -Switch to a different profile using `ferium profile switch`. -Delete a profile using `ferium profile delete` and selecting the profile you want to delete. +#### Updating +```bash +allaerris update +``` +This will find the latest compatible version of all installed mods and, by default, mark them to be installed the next time `allaerris apply` is called. You may also specify only specific mods to be updated. There are also flags to cancel a pending update, or to immediately install all found updates. ## Feature Requests -If you would like to make a feature request, check the [issue tracker](https://github.com/gorilla-devs/ferium/issues?q=is%3Aissue+label%3Aenhancement) to see if the feature has already been added or is planned. -If not, [create a new issue](https://github.com/gorilla-devs/ferium/issues/new/choose). - -## Developing - -Firstly, you will need the Rust toolchain, which includes `cargo`, `rustup`, etc. You can install these [using rustup](https://www.rust-lang.org/tools/install). -You can manually run cargo commands if you wish, but I recommend using the `justfile` configuration in the repository. [`just`](https://just.systems/man/en) is a command runner that is basically a much better version of `make`. - -To build the project and install it to your Cargo binary directory, clone the project and run `just install`. -If you want to install it for testing purposes, [add the nightly toolchain](https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#rustup-and-the-role-of-rust-nightly) and run `just` (aliased to `just install-dev`), which has some optimisations to make compilation faster. - -You can run integration tests using `cargo test`, lint using `cargo clippy`, and delete all build and test artefacts using `just clean`. - -If you would like to see how to cross-compile for specific targets (e.g. Linux ARM) or other information such as the development libraries required, have a look at the [workflow file](.github/workflows/build.yml). -If you still have doubts, feel free to [create a discussion](https://github.com/gorilla-devs/ferium/discussions/new?category=q-a) and I will try help you out. +If you would like to make a feature request, check the [issue tracker](https://github.com/mgziminsky/allaerris/issues?q=is%3Aissue+label%3Aenhancement) to see if the feature has already been added or is planned. +If not, [create a new issue](https://github.com/mgziminsky/allaerris/issues/new/choose). diff --git a/cli/src/cli.rs b/cli/src/cli.rs index e6a9e4c..a838741 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -4,12 +4,12 @@ use std::path::PathBuf; use clap::{Parser, Subcommand, ValueHint}; use clap_complete::Shell; -use relibium::{config::ModLoader, DEFAULT_MINECRAFT_DIR}; +use ferrallay::{config::ModLoader, DEFAULT_MINECRAFT_DIR}; #[derive(Parser)] #[command(author, version, about)] #[command(arg_required_else_help = true)] -pub struct Ferium { +pub struct Allaerris { #[command(subcommand)] pub subcommand: SubCommand, /// Sets the number of worker threads the tokio runtime will use. @@ -26,7 +26,7 @@ pub struct Ferium { pub curseforge_api_key: Option, /// Set the file to read the config from. /// This does not change the `cache` and `tmp` directories. - /// You can also use the environment variable `FERIUM_CONFIG_FILE`. + /// You can also use the environment variable `ALLAERRIS_CONFIG_FILE`. #[arg(long, short, visible_aliases = ["config", "conf"])] #[arg(value_hint(ValueHint::FilePath))] pub config_file: Option, @@ -243,8 +243,8 @@ pub enum ProfileSubcommand { switch_to: Option, }, /// Configure the current profile's name, Minecraft version, and mod loader - #[command(visible_aliases = ["config", "conf"])] - Configure { + #[command(visible_aliases = ["configure", "config", "conf"])] + Edit { /// The Minecraft version to use #[arg(long, short = 'v')] game_version: Option, @@ -289,12 +289,11 @@ pub enum ModpackSubcommand { #[arg(long, short)] force: bool, }, - /// Configure the current modpack's output directory and installation of - /// overrides. Optionally, provide the settings to change as arguments. + /// Configure the profile modpack's installation of overrides #[command(visible_aliases = ["config", "conf"])] Configure { /// Whether to install the modpack's overrides to the output directory. - /// This will overwrite existing files when installing. + /// This may overwrite existing files when installing. #[arg(long, short)] install_overrides: Option, }, diff --git a/cli/src/file_picker.rs b/cli/src/file_picker.rs index 3369322..686f16d 100644 --- a/cli/src/file_picker.rs +++ b/cli/src/file_picker.rs @@ -1,9 +1,12 @@ -use std::{path::{Path, PathBuf}, sync::LazyLock}; +use std::{ + path::{Path, PathBuf}, + sync::LazyLock, +}; static HOME: LazyLock = LazyLock::new(|| dirs::home_dir().expect("should be able to determine home dir")); -/// Use the system file picker to pick a file, with a `default` path (that is [not supported on linux](https://github.com/PolyMeilex/rfd/issues/42)) +/// Use the system file picker to pick a file, with a `default` path #[cfg(any(feature = "gui", ide))] fn show_folder_picker(default: &Path, prompt: impl Into) -> Option { rfd::FileDialog::new() diff --git a/cli/src/helpers.rs b/cli/src/helpers.rs index dea07cc..e89cd8b 100644 --- a/cli/src/helpers.rs +++ b/cli/src/helpers.rs @@ -1,7 +1,7 @@ use std::ffi::OsStr; use anyhow::{anyhow, bail, Context, Result}; -use relibium::config::{Config, Profile}; +use ferrallay::config::{Config, Profile}; use yansi::Paint; macro_rules! consts { @@ -32,7 +32,7 @@ pub(crate) fn get_active_profile(config: &mut Config) -> Result<&mut Profile> { config .active_profile_mut() .map_err(|err| match err.kind() { - relibium::ErrorKind::NoProfiles => anyhow!( + ferrallay::ErrorKind::NoProfiles => anyhow!( "There are no profiles configured, add a profile using `{}`", format!("{APP_NAME} profile create").bold().italic() ), diff --git a/cli/src/main.rs b/cli/src/main.rs index 9866d9b..bdc97bf 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -13,7 +13,7 @@ use std::{ use anyhow::{Context, Result}; use clap::{CommandFactory, Parser}; -use relibium::{ +use ferrallay::{ client::{Client, ForgeClient, GithubClient, ModrinthClient}, config::{profile::ProfileData, Config, Profile, DEFAULT_CONFIG_PATH}, curseforge::client::AuthData, @@ -22,7 +22,7 @@ use tokio::{runtime, sync::OnceCell}; use yansi::Paint; use self::{ - cli::{Ferium, ModpackSubcommand, ProfileSubcommand, SubCommand}, + cli::{Allaerris, ModpackSubcommand, ProfileSubcommand, SubCommand}, helpers::{consts, get_active_profile, APP_NAME}, subcommands::{cache, modpack, mods, profile}, tui::const_style, @@ -31,11 +31,11 @@ use self::{ const USER_AGENT: &str = concat!(consts!(APP_NAME), "/", env!("CARGO_PKG_VERSION"), " (Github: mgziminsky)"); fn main() -> ExitCode { - let cli = Ferium::parse(); + let cli = Allaerris::parse(); let runtime = { let mut builder = runtime::Builder::new_multi_thread(); builder.enable_all(); - builder.thread_name("ferium-worker"); + builder.thread_name("allaerris-worker"); if let Some(threads) = cli.threads { builder.worker_threads(threads); } @@ -53,13 +53,13 @@ fn main() -> ExitCode { } #[allow(clippy::too_many_lines)] -async fn actual_main(mut cli_app: Ferium) -> Result<()> { +async fn actual_main(mut cli_app: Allaerris) -> Result<()> { // The complete command should not require a config. // See [#139](https://github.com/gorilla-devs/ferium/issues/139) for why this might be a problem. if let SubCommand::Complete { shell } = cli_app.subcommand { clap_complete::generate( shell, - &mut Ferium::command(), + &mut Allaerris::command(), std::env::current_exe() .ok() .as_deref() @@ -100,7 +100,7 @@ async fn actual_main(mut cli_app: Ferium) -> Result<()> { let config_path = &cli_app .config_file - .or_else(|| var_os("FERIUM_CONFIG_FILE").map(Into::into)) + .or_else(|| var_os("ALLAERRIS_CONFIG_FILE").map(Into::into)) .unwrap_or(DEFAULT_CONFIG_PATH.to_owned().into()); // This craziness is because I want a lazy, async, and mut config that can be diff --git a/cli/src/subcommands/cache.rs b/cli/src/subcommands/cache.rs index ee78f1f..0dbd019 100644 --- a/cli/src/subcommands/cache.rs +++ b/cli/src/subcommands/cache.rs @@ -1,7 +1,7 @@ use std::fs::{self}; use anyhow::{anyhow, Context, Result}; -use relibium::mgmt::CACHE_DIR; +use ferrallay::mgmt::CACHE_DIR; use walkdir::WalkDir; use yansi::Paint; diff --git a/cli/src/subcommands/modpack.rs b/cli/src/subcommands/modpack.rs index 8ea4ec3..2c9100d 100644 --- a/cli/src/subcommands/modpack.rs +++ b/cli/src/subcommands/modpack.rs @@ -1,6 +1,6 @@ use anyhow::{anyhow, bail, Ok, Result}; use dialoguer::Confirm; -use relibium::{ +use ferrallay::{ config::{profile::ProfileData, Modpack, Profile}, Client, }; diff --git a/cli/src/subcommands/mods.rs b/cli/src/subcommands/mods.rs index d7f7ed3..0018178 100644 --- a/cli/src/subcommands/mods.rs +++ b/cli/src/subcommands/mods.rs @@ -1,5 +1,5 @@ use anyhow::{bail, Result}; -use relibium::{config::Profile, Client}; +use ferrallay::{config::Profile, Client}; use yansi::Paint; use crate::{cli::ModsSubcommand, helpers, tui::print_mods}; diff --git a/cli/src/subcommands/mods/add.rs b/cli/src/subcommands/mods/add.rs index d7baf9e..07de589 100644 --- a/cli/src/subcommands/mods/add.rs +++ b/cli/src/subcommands/mods/add.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use relibium::{ +use ferrallay::{ config::{profile::ProfileData, Mod, VersionedProject}, Client, }; diff --git a/cli/src/subcommands/mods/list.rs b/cli/src/subcommands/mods/list.rs index d5a7dc9..7150188 100644 --- a/cli/src/subcommands/mods/list.rs +++ b/cli/src/subcommands/mods/list.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, ops::Deref, sync::LazyLock}; use anyhow::{Context, Result}; -use relibium::{ +use ferrallay::{ client::schema::{Author, ProjectId, ProjectIdSvcType}, config::{Mod, Profile, VersionedProject}, modrinth::apis::teams_api::GetTeamsParams, diff --git a/cli/src/subcommands/mods/locking.rs b/cli/src/subcommands/mods/locking.rs index 5b18e64..060fec0 100644 --- a/cli/src/subcommands/mods/locking.rs +++ b/cli/src/subcommands/mods/locking.rs @@ -1,7 +1,7 @@ use std::{collections::HashSet, fmt::Display}; use anyhow::Result; -use relibium::{ +use ferrallay::{ client::schema::{ProjectIdSvcType, VersionIdSvcType}, config::{Mod, Profile, VersionedProject}, Client, @@ -41,7 +41,7 @@ macro_rules! not_found_msg { /// installed version. /// /// # Errors -/// - Reading the [profile data](relibium::config::profile::ProfileData) fails +/// - Reading the [profile data](ferrallay::config::profile::ProfileData) fails /// - Reading the lockfile with installed mod versions fails pub async fn lock_mods(profile: &mut Profile, ids: &[impl ProjectIdSvcType + Display], force: bool) -> Result<()> { let mut installed = profile.installed().await?; diff --git a/cli/src/subcommands/mods/mgmt.rs b/cli/src/subcommands/mods/mgmt.rs index be9fd4f..4438f88 100644 --- a/cli/src/subcommands/mods/mgmt.rs +++ b/cli/src/subcommands/mods/mgmt.rs @@ -2,12 +2,12 @@ use std::{collections::HashMap, sync::mpsc}; use anyhow::{anyhow, Result}; use dialoguer::MultiSelect; -use indicatif::{MultiProgress, ProgressBar}; -use relibium::{ +use ferrallay::{ config::{Mod, Profile, ProjectWithVersion}, mgmt::events::{DownloadId, DownloadProgress, ProgressEvent}, Client, ProfileManager, }; +use indicatif::{MultiProgress, ProgressBar}; use yansi::Paint; use crate::{ @@ -148,7 +148,7 @@ fn progress_hander() -> (mpsc::Sender, tokio::task::JoinHandle<() }, Download(evt) => handle_dl(evt, &mut bars, &progress), Installed { file, is_new, typ } => { - use relibium::mgmt::events::InstallType::*; + use ferrallay::mgmt::events::InstallType::*; println!( "{} {:>9}: {}", if is_new { TICK_GREEN } else { TICK_YELLOW }, diff --git a/cli/src/subcommands/mods/remove.rs b/cli/src/subcommands/mods/remove.rs index ed2f6a4..7065e8c 100644 --- a/cli/src/subcommands/mods/remove.rs +++ b/cli/src/subcommands/mods/remove.rs @@ -1,6 +1,6 @@ use anyhow::Result; use dialoguer::MultiSelect; -use relibium::config::{profile::ProfileData, Mod}; +use ferrallay::config::{profile::ProfileData, Mod}; use crate::tui::mod_single_line; diff --git a/cli/src/subcommands/profile.rs b/cli/src/subcommands/profile.rs index 34408c9..6fe82db 100644 --- a/cli/src/subcommands/profile.rs +++ b/cli/src/subcommands/profile.rs @@ -4,7 +4,7 @@ mod delete; mod helpers; use anyhow::{bail, Context, Result}; -use relibium::{ +use ferrallay::{ checked_types::PathAbsolute, config::{profile::ProfileData, Profile}, Config, @@ -76,7 +76,7 @@ pub async fn process(subcommand: ProfileSubcommand, config: &mut Config) -> Resu println!("Active Profile: {}", fmt_profile_simple(active, 100)); } }, - ProfileSubcommand::Configure { + ProfileSubcommand::Edit { game_version, loader, name, diff --git a/cli/src/subcommands/profile/configure.rs b/cli/src/subcommands/profile/configure.rs index 83d2322..36ac78b 100644 --- a/cli/src/subcommands/profile/configure.rs +++ b/cli/src/subcommands/profile/configure.rs @@ -1,6 +1,6 @@ use anyhow::Result; use dialoguer::{Input, Select}; -use relibium::config::{ModLoader, Profile}; +use ferrallay::config::{ModLoader, Profile}; use super::helpers::{pick_minecraft_version, pick_mod_loader}; use crate::tui::THEME; diff --git a/cli/src/subcommands/profile/create.rs b/cli/src/subcommands/profile/create.rs index 9fbf19f..ac98213 100644 --- a/cli/src/subcommands/profile/create.rs +++ b/cli/src/subcommands/profile/create.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use anyhow::{bail, Context, Ok, Result}; use dialoguer::{Confirm, Input}; -use relibium::{ +use ferrallay::{ checked_types::PathAbsolute, config::{profile::ProfileData, ModLoader, Profile}, Config, DEFAULT_MINECRAFT_DIR, diff --git a/cli/src/subcommands/profile/delete.rs b/cli/src/subcommands/profile/delete.rs index 2fe9f2a..a5c2d90 100644 --- a/cli/src/subcommands/profile/delete.rs +++ b/cli/src/subcommands/profile/delete.rs @@ -1,7 +1,7 @@ use std::ops::Deref; use anyhow::{bail, Result}; -use relibium::{config::Profile, Config}; +use ferrallay::{config::Profile, Config}; use super::helpers::pick_profile; use crate::subcommands::profile::switch_profile; diff --git a/cli/src/subcommands/profile/helpers.rs b/cli/src/subcommands/profile/helpers.rs index 538d455..bd2ce34 100644 --- a/cli/src/subcommands/profile/helpers.rs +++ b/cli/src/subcommands/profile/helpers.rs @@ -2,7 +2,7 @@ use std::ops::Deref; use anyhow::{Context, Result}; use dialoguer::{Input, Select}; -use relibium::{ +use ferrallay::{ checked_types::PathAbsolute, config::{profile::DEFAULT_GAME_VERSION, ModLoader, Profile}, }; @@ -71,7 +71,7 @@ pub async fn pick_minecraft_version(default: Option<&str>) -> Result { Ok(choice) } -pub fn pick_profile<'p>(msg: impl Into, profiles: &'p [&'p Profile], filter: Option) -> Result> { +pub fn pick_profile<'p>(msg: impl Into, profiles: &'p [&Profile], filter: Option) -> Result> { let filter = filter.unwrap_or_default(); let found: Vec<_> = profiles.iter().filter(|p| cmp_profile(p, &filter)).map(Deref::deref).collect(); let selected = match found.len() { diff --git a/cli/src/tui.rs b/cli/src/tui.rs index a8fa924..3d901bf 100644 --- a/cli/src/tui.rs +++ b/cli/src/tui.rs @@ -2,12 +2,12 @@ use std::{borrow::Cow, fmt::Display, ops::Range, sync::LazyLock}; use anyhow::anyhow; use dialoguer::theme::ColorfulTheme; -use indicatif::ProgressStyle; -use itertools::Itertools; -use relibium::{ +use ferrallay::{ client::schema::{Project, ProjectId, VersionId}, config::{Mod, Profile, VersionedProject}, }; +use indicatif::ProgressStyle; +use itertools::Itertools; use yansi::{Paint, Painted}; @@ -202,7 +202,7 @@ pub fn print_project_verbose(proj: &Project) { .unwrap_or_default() .bright_blue() .underline(), - id_tag(&proj.id).dim(), + id_tag(&proj.id), proj.source_url.as_ref().map(url::Url::as_str).map_or_else( || CROSS_RED.to_string(), |u| format!("{} {}", TICK_GREEN, u.bright_blue().underline()) diff --git a/cli/tests_old/configs/empty.json b/cli/tests_old/configs/empty.json deleted file mode 100644 index 6088a22..0000000 --- a/cli/tests_old/configs/empty.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "active_profile": 0, - "active_modpack": 0, - "profiles": [], - "modpacks": [] -} \ No newline at end of file diff --git a/cli/tests_old/configs/empty_profile.json b/cli/tests_old/configs/empty_profile.json deleted file mode 100644 index e2f64c5..0000000 --- a/cli/tests_old/configs/empty_profile.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "active_profile": 0, - "active_modpack": 0, - "profiles": [ - { - "name": "Test profile", - "output_dir": "./tests/mods", - "game_version": "1.18.2", - "mod_loader": "Fabric", - "mods": [] - } - ], - "modpacks": [] -} \ No newline at end of file diff --git a/cli/tests_old/configs/one_profile_full.json b/cli/tests_old/configs/one_profile_full.json deleted file mode 100644 index 279e2c1..0000000 --- a/cli/tests_old/configs/one_profile_full.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "active_profile": 0, - "active_modpack": 0, - "profiles": [ - { - "name": "Default Modded", - "output_dir": "./tests/mods", - "game_version": "1.18.2", - "mod_loader": "Fabric", - "mods": [ - { - "name": "Starlight (Fabric)", - "identifier": { - "ModrinthProject": "H8CaAYZC" - } - }, - { - "name": "Incendium", - "identifier": { - "CurseForgeProject": 591388 - } - }, - { - "name": "sodium-fabric", - "identifier": { - "GitHubRepository": [ - "CaffeineMC", - "sodium-fabric" - ] - } - } - ] - } - ], - "modpacks": [] -} \ No newline at end of file diff --git a/cli/tests_old/configs/two_modpacks_cfactive.json b/cli/tests_old/configs/two_modpacks_cfactive.json deleted file mode 100644 index d12277e..0000000 --- a/cli/tests_old/configs/two_modpacks_cfactive.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "active_profile": 0, - "active_modpack": 0, - "profiles": [], - "modpacks": [ - { - "name": "CF Fabulously Optimised", - "output_dir": "./tests/cf_modpack", - "install_overrides": true, - "identifier": { - "CurseForgeModpack": 396246 - } - }, - { - "name": "MR Fabulously Optimised", - "output_dir": "./tests/md_modpack", - "install_overrides": true, - "identifier": { - "ModrinthModpack": "1KVo5zza" - } - } - ] -} \ No newline at end of file diff --git a/cli/tests_old/configs/two_modpacks_mdactive.json b/cli/tests_old/configs/two_modpacks_mdactive.json deleted file mode 100644 index 9f75080..0000000 --- a/cli/tests_old/configs/two_modpacks_mdactive.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "active_profile": 0, - "active_modpack": 1, - "profiles": [], - "modpacks": [ - { - "name": "CF Fabulously Optimised", - "output_dir": "./tests/cf_modpack", - "install_overrides": true, - "identifier": { - "CurseForgeModpack": 396246 - } - }, - { - "name": "MR Fabulously Optimised", - "output_dir": "./tests/md_modpack", - "install_overrides": true, - "identifier": { - "ModrinthModpack": "1KVo5zza" - } - } - ] -} \ No newline at end of file diff --git a/cli/tests_old/configs/two_profiles_one_empty.json b/cli/tests_old/configs/two_profiles_one_empty.json deleted file mode 100644 index 1a33a63..0000000 --- a/cli/tests_old/configs/two_profiles_one_empty.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "active_profile": 0, - "active_modpack": 0, - "profiles": [ - { - "name": "Profile One", - "output_dir": "./tests/mods", - "game_version": "1.18.2", - "mod_loader": "Fabric", - "mods": [ - { - "name": "Starlight (Fabric)", - "identifier": { - "ModrinthProject": "H8CaAYZC" - } - }, - { - "name": "Incendium", - "identifier": { - "CurseForgeProject": 591388 - } - }, - { - "name": "sodium-fabric", - "identifier": { - "GitHubRepository": [ - "CaffeineMC", - "sodium-fabric" - ] - } - } - ] - }, - { - "name": "Profile Two", - "output_dir": "./tests/mods", - "game_version": "1.18.2", - "mod_loader": "Fabric", - "mods": [] - } - ], - "modpacks": [] -} \ No newline at end of file diff --git a/cli/tests_old/integration_tests.rs b/cli/tests_old/integration_tests.rs deleted file mode 100644 index e87d7bc..0000000 --- a/cli/tests_old/integration_tests.rs +++ /dev/null @@ -1,316 +0,0 @@ -mod util; - -use libium::HOME; -use std::fs::remove_dir; -use util::run_command; - -type Result = std::io::Result<()>; - -fn output_dir() -> String { - let mut home = HOME.clone(); - home.push("mods"); - home.to_string_lossy().to_string() -} - -#[test] -fn argparse() -> Result { - run_command(vec!["help"], None)?; - run_command(vec!["profile", "help"], None) -} - -#[test] -fn create_profile() -> Result { - run_command( - vec![ - "profile", - "create", - "--name", - "Test profile", - "--game-version", - "1.12.2", - "--mod-loader", - "forge", - "--output-dir", - &output_dir(), - ], - // This also tests that the config file is automatically created - None, - ) -} - -#[test] -fn create_profile_import_mods() -> Result { - run_command( - vec![ - "profile", - "create", - "--name", - "Test profile", - "--game-version", - "1.12.2", - "--mod-loader", - "forge", - "--output-dir", - &output_dir(), - "--import", - "Default Modded", - ], - Some("one_profile_full"), - ) -} - -#[test] -fn create_profile_output_dir_not_absolute() { - assert!(run_command( - vec![ - "profile", - "create", - "--name", - "Test profile", - "--game-version", - "1.12.2", - "--mod-loader", - "forge", - "--output-dir", - "mods" // oops relative directory - ], - Some("empty") - ) - .is_err()); -} - -#[test] -fn create_profile_missing_args() { - assert!(run_command( - vec![ - "profile", - "create", - // oops no name - "--game-version", - "1.12.2", - "--mod-loader", - "forge", - "--output-dir", - &output_dir(), - ], - Some("empty") - ) - .is_err()); -} - -#[test] -fn create_profile_name_already_exists() { - assert!(run_command( - vec![ - "profile", - "create", - "--name", - "Test profile", // oops profile with same name already exists - "--game-version", - "1.12.2", - "--mod-loader", - "forge", - "--output-dir", - &output_dir(), - ], - Some("empty_profile") - ) - .is_err()); -} - -#[test] -fn add_modrinth() -> Result { - // Add Sodium to config - run_command(vec!["add", "starlight"], Some("empty_profile")) -} - -#[test] -fn add_curseforge() -> Result { - // Add Terralith to the config - run_command(vec!["add", "591388"], Some("empty_profile")) -} - -#[test] -fn add_github() -> Result { - // Add Sodium to config - run_command( - vec!["add", "CaffeineMC/sodium-fabric"], - Some("empty_profile"), - ) -} - -fn add_all() -> Result { - run_command( - vec!["add", "starlight", "591388", "CaffeineMC/sodium-fabric"], - Some("empty_profile"), - ) -} - -#[test] -fn modpack_add_modrinth() -> Result { - // Add Fabulously Optimised - run_command( - vec![ - "modpack", - "add", - "1KVo5zza", - "--output-dir", - &output_dir(), - "--install-overrides", - "true", - ], - Some("empty_profile"), - ) -} - -#[test] -fn modpack_add_curseforge() -> Result { - // Add RLCraft - run_command( - vec![ - "modpack", - "add", - "452013", - "--output-dir", - &output_dir(), - "--install-overrides", - "true", - ], - Some("empty_profile"), - ) -} - -#[test] -fn already_added() { - assert!(run_command(vec!["add", "StArLiGhT"], Some("one_profile_full")).is_err()); - assert!(run_command(vec!["add", "591388"], Some("one_profile_full")).is_err()); - assert!(run_command( - vec!["add", "caffeinemc/Sodium-Fabric"], - Some("one_profile_full") - ) - .is_err()); -} - -#[test] -fn list() -> Result { - run_command(vec!["list"], Some("one_profile_full")) -} - -#[test] -fn list_verbose() -> Result { - run_command(vec!["list", "--verbose"], Some("one_profile_full")) -} - -#[test] -fn list_markdown() -> Result { - run_command( - vec!["list", "--verbose", "--markdown"], - Some("one_profile_full"), - ) -} - -#[test] -fn profile_list() -> Result { - run_command(vec!["profile", "list"], Some("one_profile_full")) -} - -#[test] -fn upgrade() -> Result { - let _ = remove_dir("./tests/mods"); - run_command(vec!["upgrade"], Some("one_profile_full")) -} - -#[test] -fn cf_modpack_upgrade() -> Result { - let _ = remove_dir("./tests/cf_modpack"); - run_command(vec!["modpack", "upgrade"], Some("two_modpacks_cfactive")) -} - -#[test] -fn md_modpack_upgrade() -> Result { - let _ = remove_dir("./tests/md_modpack"); - run_command(vec!["modpack", "upgrade"], Some("two_modpacks_mdactive")) -} - -#[test] -fn profile_switch() -> Result { - run_command( - vec!["profile", "switch", "Profile Two"], - Some("two_profiles_one_empty"), - ) -} - -#[test] -fn modpack_switch() -> Result { - run_command( - vec!["modpack", "switch", "CF Fabulously Optimised"], - Some("two_modpacks_mdactive"), - ) -} - -#[test] -fn remove_fail() { - // These should fail as one of the mod names provided does not exist - assert!(run_command( - vec![ - "remove", - "starlght", // Wrong - "incendium", - "sodium", - ], - Some("one_profile_full") - ) - .is_err()); - assert!(run_command( - vec![ - "remove", - "starlight (fabric)", - "incendum", // Wrong - "sodium", - ], - Some("one_profile_full") - ) - .is_err()); - assert!(run_command( - vec![ - "remove", - "starlight (fabric)", - "incendium", - "sodum", // Wrong - ], - Some("one_profile_full") - ) - .is_err()); -} - -#[test] -fn remove_name() -> Result { - run_command( - vec!["remove", "starlight (fabric)", "incendium", "sodium-fabric"], - Some("one_profile_full"), - ) -} - -#[test] -fn remove_id() -> Result { - run_command( - vec!["remove", "H8CaAYZC", "591388", "caffeinemc/sodium-fabric"], - Some("one_profile_full"), - ) -} - -#[test] -fn delete_profile() -> Result { - run_command( - vec!["profile", "delete", "Profile Two"], - Some("two_profiles_one_empty"), - ) -} - -#[test] -fn delete_modpack() -> Result { - run_command( - vec!["modpack", "delete", "CF Fabulously Optimised"], - Some("two_modpacks_mdactive"), - ) -} diff --git a/cli/tests_old/util.rs b/cli/tests_old/util.rs deleted file mode 100644 index 36ef969..0000000 --- a/cli/tests_old/util.rs +++ /dev/null @@ -1,36 +0,0 @@ -use std::{ - fs::{copy, create_dir}, - io::Result, - process::Command, -}; - -pub fn run_command(args: Vec<&str>, config_file: Option<&str>) -> Result<()> { - let mut args = args; - let running = format!("./tests/configs/running/{}.json", rand::random::()); - if let Some(config_file) = config_file { - let _ = create_dir("./tests/configs/running"); - let template = format!("./tests/configs/{config_file}.json"); - copy(template, &running)?; - } - - let mut command = Command::new(env!("CARGO_BIN_EXE_ferium")); - let mut arguments = Vec::new(); - arguments.push("--config-file"); - arguments.push(&running); - arguments.append(&mut args); - command.args(arguments); - let output = command.output()?; - if output.status.success() { - Ok(()) - } else { - Err(std::io::Error::new( - std::io::ErrorKind::Other, - format!( - "Command returned with exit code {:?}, stdout:{}, stderr:{}", - output.status.code(), - std::str::from_utf8(&output.stdout).unwrap(), - std::str::from_utf8(&output.stderr).unwrap(), - ), - )) - } -} diff --git a/clippy.toml b/clippy.toml index 5f72af1..e10921f 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1,2 +1,2 @@ -ignore-interior-mutability = ["relibium::config::profile::by_path::ProfileByPath"] +ignore-interior-mutability = ["ferrallay::config::profile::by_path::ProfileByPath"] doc-valid-idents = ["CurseForge", ".."] diff --git a/curseforge-client/Cargo.toml b/curseforge-client/Cargo.toml index 9be9345..213e2fb 100644 --- a/curseforge-client/Cargo.toml +++ b/curseforge-client/Cargo.toml @@ -14,5 +14,4 @@ serde_json = "1.0" serde_repr = "0.1" thiserror = "1.0" url = "2.5" -uuid = { version = "1.9", features = ["serde"] } reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json", "multipart"] } diff --git a/lib/CHANGELOG.md b/lib/CHANGELOG.md new file mode 100644 index 0000000..796a459 --- /dev/null +++ b/lib/CHANGELOG.md @@ -0,0 +1,9 @@ +## [Planned] - In no particular order +- Handle dependencies during add and update +- Support server/client distinction in profile +- Support full profile deployment including installing loaders and vanilla client/server +- Support any project type, not just mods and packs +- Link mods into profile instead of copying when possible + +## [0.1.0] +- Initial Release diff --git a/lib/Cargo.toml b/lib/Cargo.toml index fc06989..ab34ae0 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -1,15 +1,11 @@ [package] -name = "relibium" -version = "2.0.0" +name = "ferrallay" +version = "0.1.0" edition.workspace = true -rust-version.workspace = true -authors = [ - "Michael Ziminsky (Z)", - "Ilesh Thiada (theRookieCoder) ", - "Daniel Hauck (SolidTux)", -] +repository.workspace = true +rust-version = "1.80.0" +authors = ["Michael Ziminsky (Z)"] description = "Multi-source backend for managing Minecraft mods and modpacks from Modrinth, CurseForge, and Github Releases" -repository = "https://github.com/gorilla-devs/libium" readme = "README.md" license = "MPL-2.0" keywords = [ @@ -25,7 +21,7 @@ paste = "1" serde-value = "0.7.0" sha1 = "0.10" thiserror = "1.0" -zip = { version = "2.1", default-features = false, features = ["deflate"]} +zip = { version = "2.2.0", default-features = false, features = ["deflate"] } anyhow.workspace = true async-scoped.workspace = true diff --git a/lib/README.md b/lib/README.md index 871732e..8a81bd9 100644 --- a/lib/README.md +++ b/lib/README.md @@ -1,9 +1,8 @@ -# Libium -Libium is the backend of [ferium](https://github.com/gorilla-devs/ferium). It helps manage Minecraft mods from Modrinth, CurseForge, and Github Releases. +# Ferrallay +This lib contains the core functionality of this project. It handles the bulk of the management functions for mods, config, and profiles, +as well as providing a normalized client interface for interacting with the different supported service APIs. -These are the main components of libium; - -- `config` deals with (surprise, surprise) the config. It defines the config structure and methods to get the config file, deserialise it, etc -- `modpack` contains manifest/metadata structs for MR and CF modpack formats, and functions for reading these from a zip file -- `upgrade` contains functions for fetching the latest compatible mod/modpack file, and downloading it -- `add` contains functions to verify and add a mod to a profile +The primary modules are: +- [`client`](src/client.rs) - Public client interface wrapping the raw service APIs +- [`config`](src/config.rs) - Types dealing with the configuration data that is saved/loaded to/from the filesystem +- [`mgmt`](src/mgmt.rs) - Profile management features dealing with the actual download/install/update fuctionality diff --git a/lib/src/checked_types/path_scoped.rs b/lib/src/checked_types/path_scoped.rs index cceb500..ab898b7 100644 --- a/lib/src/checked_types/path_scoped.rs +++ b/lib/src/checked_types/path_scoped.rs @@ -19,7 +19,9 @@ pub enum PathScopeError { } /// A [`PathBuf`] wrapper that is guaranteed to be relative without directly -/// referencing an outer scope. Leading [`./`] will be stripped and the path +/// referencing an outer scope. +/// +/// Leading [`./`] will be stripped and the path /// partially normalized as described by [`Path::components`] /// /// [`./`]: std::path::Component::CurDir diff --git a/lib/src/client.rs b/lib/src/client.rs index 6e8e844..f1ad4a6 100644 --- a/lib/src/client.rs +++ b/lib/src/client.rs @@ -156,8 +156,8 @@ api! { /// /// # Example /// ```no_run -/// # use relibium::client::*; -/// # async fn async_main() -> relibium::Result<()> { +/// # use ferrallay::client::*; +/// # async fn async_main() -> ferrallay::Result<()> { /// // Single client /// let client = Client::from(ModrinthClient::default()); /// let m = client.get_mod("mod_id").await; diff --git a/lib/src/client/service_id.rs b/lib/src/client/service_id.rs index 692d15d..6389c8c 100644 --- a/lib/src/client/service_id.rs +++ b/lib/src/client/service_id.rs @@ -1,10 +1,10 @@ -/// Use with [`svc_id_impl`] to set any of the clients as not available for the +/// Use with [`svc_id_type`] to set any of the clients as not available for the /// defined type #[allow(unused)] pub enum Unsupported {} /// Represents a known id for one of the supported [client](super::Client) APIs -// Prefer using [svc_id_impl] to implementing manually +// Prefer using [`svc_id_type`] to implementing manually #[allow(missing_docs)] pub trait ServiceId: super::Sealed { type ForgeT; diff --git a/lib/src/config/profile.rs b/lib/src/config/profile.rs index 6d59ff8..733371a 100644 --- a/lib/src/config/profile.rs +++ b/lib/src/config/profile.rs @@ -15,9 +15,10 @@ fn name_lowercase(m: &Mod) -> String { } -/// A lazy loaded profile containing the `name` and `path`. The external -/// [profile data](ProfileData) will be loaded and cached on first access. -/// Path is immutable after creation since it is used as the profile id +/// A lazy loaded profile containing the `name` and `path`. +/// +/// The external [profile data](ProfileData) will be loaded and cached on first +/// access. Path is immutable after creation since it is used as the profile id #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Profile { pub(super) name: String, diff --git a/lib/src/fs_util.rs b/lib/src/fs_util.rs index 4807ff1..299c936 100644 --- a/lib/src/fs_util.rs +++ b/lib/src/fs_util.rs @@ -50,6 +50,7 @@ impl FsUtils for FsUtil { } } +// FIXME: This sucks. How do I make it not suck. #[cfg(test)] mod tests_impl { use super::*;