name: docs

on:
  push:
  pull_request:

  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  api-build:
    strategy:
      matrix:
        os:
          - ubuntu-latest
        ocaml-compiler:
          - ocaml-variants.4.14.2+options,ocaml-option-flambda # matches opam lock file
          # don't add any other because they won't be used

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v7

      - name: Check for undocumented modules
        run: python scripts/goblint-lib-modules.py

      - name: Set up OCaml ${{ matrix.ocaml-compiler }}
        env:
          # otherwise setup-ocaml pins non-locked dependencies
          # https://github.com/ocaml/setup-ocaml/issues/166
          OPAMLOCKED: locked
        uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: ${{ matrix.ocaml-compiler }}

      - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v6

      - name: Install dependencies
        run: opam install . --deps-only --locked --with-doc

      - name: Build API docs
        run: opam exec -- dune build @doc

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v5
        with:
          path: _build/default/_doc/_html/

  api-deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: api-build
    if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
    concurrency:
      group: "pages"
      cancel-in-progress: true
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v5
