name: CI

on:
  pull_request:
  push:
    branches:
    - main
  schedule:
  - cron: '0 1 * * *'

jobs:
  main:
    name: Main
    runs-on: ubuntu-latest

    steps:

    - name: Check out repository
      uses: actions/checkout@v2

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: nightly
        profile: minimal
        override: true
        components: clippy

    # Do *not* use `--all-features` here, as the optional dependencies take a
    # long time to build, and will be tested in the "examples" job anyway
    - name: Run tests
      run: cargo test --workspace --all-targets

    - name: Check Clippy
      run: cargo clippy --workspace --all-targets -- -D warnings

  # Please keep this in sync with `publish-docs.yml`
  documentation:
    name: Documentation
    runs-on: ubuntu-latest

    steps:

    - name: Check out repository
      uses: actions/checkout@v2
      with:
        # Documentation build uses `git describe` which requires history
        fetch-depth: 0

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: nightly
        profile: minimal
        override: true
        components: clippy

    - name: Build documentation
      run: cd docs && make -j$(nproc)

    - name: Check Clippy
      run: cd docs && cargo clippy --all-targets -- -D warnings

  doctest:
    name: Doctest
    runs-on: ubuntu-latest

    steps:

    - name: Check out repository
      uses: actions/checkout@v2

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: nightly
        profile: minimal
        override: true

    - name: Doctest
      run: cd doctest && cargo test

  rustfmt:
    name: Rustfmt
    runs-on: ubuntu-latest

    steps:

    - name: Check out repository
      uses: actions/checkout@v2

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        # Nightly rustfmt is needed for the `imports_granularity` option
        toolchain: nightly
        profile: minimal
        override: true
        components: rustfmt

    - name: Check formatting
      run: |
        cargo fmt -- --check
        (cd docs && cargo fmt -- --check)
        # trybuild harnesses are technically not part of the Cargo project, so
        # need to be checked separately
        rustfmt --check maud/tests/warnings/*.rs