# Documentation and mdbook related jobs.

name: book

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  merge_group:

jobs:
  test:
    runs-on: ubuntu-latest
    name: test
    timeout-minutes: 60

    steps:
      - uses: actions/checkout@v4

      - name: Install mdbook
        run: |
          mkdir mdbook
          curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.14/mdbook-v0.4.14-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook
          echo $(pwd)/mdbook >> $GITHUB_PATH

      - name: Install mdbook-template
        run: |
          mkdir mdbook-template
          curl -sSL https://github.com/sgoudham/mdbook-template/releases/latest/download/mdbook-template-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook-template
          echo $(pwd)/mdbook-template >> $GITHUB_PATH

      - name: Run tests
        run: mdbook test

  lint:
    runs-on: ubuntu-latest
    name: lint
    timeout-minutes: 60

    steps:
      - uses: actions/checkout@v4

      - name: Install mdbook-linkcheck
        run: |
          mkdir mdbook-linkcheck
          curl -sSL -o mdbook-linkcheck.zip https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/latest/download/mdbook-linkcheck.x86_64-unknown-linux-gnu.zip
          unzip mdbook-linkcheck.zip -d ./mdbook-linkcheck
          chmod +x $(pwd)/mdbook-linkcheck/mdbook-linkcheck
          echo $(pwd)/mdbook-linkcheck >> $GITHUB_PATH

      - name: Run linkcheck
        run: mdbook-linkcheck --standalone

  build:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
      - name: Install mdbook
        run: |
          mkdir mdbook
          curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.14/mdbook-v0.4.14-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook
          echo $(pwd)/mdbook >> $GITHUB_PATH

      - name: Install mdbook-template
        run: |
          mkdir mdbook-template
          curl -sSL https://github.com/sgoudham/mdbook-template/releases/latest/download/mdbook-template-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook-template
          echo $(pwd)/mdbook-template >> $GITHUB_PATH

      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Build book
        run: mdbook build

      - name: Build docs
        run: cargo docs --exclude "example-*"
        env:
          # Keep in sync with ./ci.yml:jobs.docs
          RUSTDOCFLAGS:
            --cfg docsrs --show-type-layout --generate-link-to-definition --enable-index-page
            -Zunstable-options

      - name: Move docs to book folder
        run: |
          mv target/doc target/book/docs

      - name: Archive artifact
        shell: sh
        run: |
          chmod -c -R +rX "target/book" |
          while read line; do
             echo "::warning title=Invalid file permissions automatically fixed::$line"
          done
          tar \
            --dereference --hard-dereference \
            --directory "target/book" \
            -cvf "$RUNNER_TEMP/artifact.tar" \
            --exclude=.git \
            --exclude=.github \
            .

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: github-pages
          path: ${{ runner.temp }}/artifact.tar
          retention-days: 1
          if-no-files-found: error

  deploy:
    # Only deploy if a push to main
    if: github.ref_name == 'main' && github.event_name == 'push'
    runs-on: ubuntu-latest
    needs: [test, lint, build]

    # Grant GITHUB_TOKEN the permissions required to make a Pages deployment
    permissions:
      pages: write
      id-token: write

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    timeout-minutes: 60

    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4
