name: "Build and test"
on:
  push:
    branches:
      - main
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Build
        run: cargo build --all-features --verbose --release

  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
            components: rustfmt, clippy

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Check code format
        run: cargo fmt -- --check

      - name: Check clippy
        run: cargo clippy --all-features -- --deny warnings

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install cargo binstall
        uses: cargo-bins/cargo-binstall@main

      - name: Install mpv
        run: apt-get update && apt-get install -y mpv

      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@nightly
        with:
            components: llvm-tools-preview

      - name: Install nextest
        run: cargo binstall -y cargo-nextest --secure

      - name: Run tests
        run: |
          cargo nextest run --all-features --release --no-fail-fast --test-threads=1
        env:
          RUST_LOG: "trace"
          RUSTFLAGS: "-Cinstrument-coverage"
          LLVM_PROFILE_FILE: "target/coverage/%p-%m.profraw"

      - name: Install grcov
        run: cargo binstall -y grcov

      - name: Generate coverage report
        run: |
          grcov \
            --source-dir . \
            --binary-path ./target/release/deps/ \
            --excl-start 'mod test* \{' \
            --ignore 'tests/*' \
            --ignore "*test.rs" \
            --ignore "*tests.rs" \
            --ignore "*github.com*" \
            --ignore "*libcore*" \
            --ignore "*rustc*" \
            --ignore "*liballoc*" \
            --ignore "*cargo*" \
            -t html \
            -o ./target/coverage/html \
            target/coverage/

      - name: Upload test report
        uses: https://git.pvv.ntnu.no/Projects/rsync-action@v1
        with:
          source: target/coverage/html/
          target: ${{ gitea.ref_name }}/coverage/
          username: gitea-web
          ssh-key: ${{ secrets.WEB_SYNC_SSH_KEY }}
          host: bekkalokk.pvv.ntnu.no
          known-hosts: "bekkalokk.pvv.ntnu.no ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEI6VSaDrMG8+flg4/AeHlAFIen8RUzWh6URQKqFegSx"

  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Build docs
        run: cargo doc --all-features --document-private-items --release

      - name: Transfer files
        uses: https://git.pvv.ntnu.no/Projects/rsync-action@v1
        with:
          source: target/doc/
          target: ${{ gitea.ref_name }}/docs/
          username: gitea-web
          ssh-key: ${{ secrets.WEB_SYNC_SSH_KEY }}
          host: bekkalokk.pvv.ntnu.no
          known-hosts: "bekkalokk.pvv.ntnu.no ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEI6VSaDrMG8+flg4/AeHlAFIen8RUzWh6URQKqFegSx"