name: Prepare Rust
description: Prepare an environment to build or test rust packages

inputs:
  targets:
    description: "JSON Array of targets to add to rustup"
    required: false
    default: '[]'
  rust-version:
    description: "Version of rust to install"
    required: true
    default: '1.75.0'

runs:
  using: "composite"
  steps:
    -
      name: Install zig
      uses: https://github.com/goto-bus-stop/setup-zig@v2
      with:
        version: 0.11.0
    -
      name: Fetch rust cache
      id: cache
      uses: https://github.com/actions/cache/restore@v4
      with:
        path: |
          ~/.cargo/bin
          ~/.cargo/registry/index
          ~/.cargo/registry/cache
          ~/.cargo/git/db
          ~/.rustup
          target/
        key: rust-${{ inputs.rust-version }}-${{ join(fromJSON(inputs.targets), '-') }}-${{ hashFiles('Cargo.toml') }}-${{ hashFiles('Cargo.lock')}}
    -
      name: Install rustup and rust
      if: steps.cache.outputs.cache-hit != 'true'
      uses: https://github.com/dtolnay/rust-toolchain@${{ inputs.rust-version }}
      with:
        components: clippy
        targets: ${{ join(fromJSON(inputs.targets), ',') }}
    -
      name: Install cargo-zigbuild
      if: steps.cache.outputs.cache-hit != 'true'
      run: cargo install cargo-zigbuild
    -
      name: Fetch dependencies
      if: steps.cache.outputs.cache-hit != 'true'
      run: cargo fetch
    -
      name: Export path
      if: steps.cache.outputs.cache-hit == 'true'
      run: |
        echo "${HOME}/.cargo/bin" >> "${GITHUB_PATH}"
        echo "${HOME}/.rustup/bin" >> "${GITHUB_PATH}"
    -
      name: Populate rust cache
      if: steps.cache.outputs.cache-hit != 'true'
      uses: https://github.com/actions/cache/save@v4
      with:
        path: |
          ~/.cargo/bin
          ~/.cargo/registry/index
          ~/.cargo/registry/cache
          ~/.cargo/git/db
          ~/.rustup
          target/
        key: ${{ steps.cache.outputs.cache-primary-key }}
