name: Rust on: pull_request: jobs: clippy & fmt: runs-on: alpine container: rust:alpine env: CARGO_HOME: ${{ github.workspace }}/.cargo steps: - name: Checkout uses: actions/checkout@v4 - name: Cache cargo packages uses: actions/cache@v4 with: path: | .cargo/registry .cargo/git target key: rust-build-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | rust-${{ runner.os }}-cargo- - name: Install tools run: | apk add --no-cache git rustup component add clippy rustfmt - name: Clippy (with compile check) run: | if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then status=0 for manifest in $(find . -name "Cargo.toml"); do cargo clippy --manifest-path "$manifest" -- -D warnings && \ echo "$manifest: Clippy passed" || \ { echo "$manifest: Clippy failed"; status=1; } done exit $status elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then echo "Rust files found but no Cargo.toml" exit 1 else echo "No Rust project found" fi - name: Format check run: | if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then status=0 for manifest in $(find . -name "Cargo.toml"); do cargo fmt --manifest-path "$manifest" --check && \ echo "$manifest: formatting OK" || \ { echo "$manifest: needs formatting"; status=1; } done exit $status elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then echo "Rust files found but no Cargo.toml" exit 1 else echo "No Rust project found" fi