name: 'Setup Rust environment' description: 'Composite action to checkout the repo, restore cargo caches and set up the Rust toolchain. Use this from job steps to keep setup DRY across jobs.' inputs: toolchain: description: 'Rust toolchain to install' required: false default: 'stable' override: description: 'Whether to override the default toolchain' required: false default: 'true' components: description: 'Comma-separated list of additional rust components to install' required: false default: 'clippy, rustfmt' runs: using: 'composite' steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Cache cargo registry uses: actions/cache@v4 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v4 with: path: ~/.cargo/index key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - name: Sanitize components input shell: bash run: echo "SANITIZED_COMPONENTS=${{ inputs.components }}" | sed -E 's/, ?| /-/g' >> $GITHUB_ENV - name: Cache Rust toolchain uses: actions/cache@v4 with: path: ~/.rustup # Key includes the OS and the toolchain version (e.g., 'stable') key: ${{ runner.os }}-rustup-${{ hashFiles('rust-toolchain.toml') }}-v1-${{ inputs.toolchain }}-${{ env.SANITIZED_COMPONENTS }} restore-keys: | ${{ runner.os }}-rustup- - name: Cache cargo build (target) uses: actions/cache@v4 with: path: target key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} - name: Set up rust toolchain uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ inputs.toolchain }} override: ${{ inputs.override }} components: ${{ inputs.components }}