name: CI

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - master

env:
  RUSTFLAGS: -Dwarnings
  RUST_BACKTRACE: 1

jobs:
  rustfmt:
    name: rustfmt
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: sfackler/actions/rustup@master
      - uses: sfackler/actions/rustfmt@master

  clippy:
    name: clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: sfackler/actions/rustup@master
      - run: echo "version=$(rustc --version)" >> $GITHUB_OUTPUT
        id: rust-version
      - uses: actions/cache@v3
        with:
          path: ~/.cargo/registry/index
          key: index-${{ runner.os }}-${{ github.run_number }}
          restore-keys: |
            index-${{ runner.os }}-
      - run: cargo generate-lockfile
      - uses: actions/cache@v3
        with:
          path: ~/.cargo/registry/cache
          key: registry-${{ runner.os }}-${{ steps.rust-version.outputs.version }}-${{ hashFiles('Cargo.lock') }}
      - run: cargo fetch
      - uses: actions/cache@v3
        with:
          path: target
          key: clippy-target-${{ runner.os }}-${{ steps.rust-version.outputs.version }}-${{ hashFiles('Cargo.lock') }}y
      - run: cargo clippy --all --all-targets

  test:
    name: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: sfackler/actions/rustup@master
        with:
          version: 1.56.0
      - run: echo "version=$(rustc --version)" >> $GITHUB_OUTPUT
        id: rust-version
      - uses: actions/cache@v3
        with:
          path: ~/.cargo/registry/index
          key: index-${{ runner.os }}-${{ github.run_number }}
          restore-keys: |
            index-${{ runner.os }}-
      - run: cargo generate-lockfile
      - uses: actions/cache@v3
        with:
          path: ~/.cargo/registry/cache
          key: registry-${{ runner.os }}-${{ steps.rust-version.outputs.version }}-${{ hashFiles('Cargo.lock') }}
      - run: cargo fetch
      - uses: actions/cache@v3
        with:
          path: target
          key: test-target-${{ runner.os }}-${{ steps.rust-version.outputs.version }}-${{ hashFiles('Cargo.lock') }}y
      - run: cargo test --all
