name: CI
on:
  pull_request:
  push:
    branches: [main]

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write
  checks: write

jobs:
  ci:
    name: CI
    needs: [test, clippy, docs]
    runs-on: ubuntu-latest
    steps:
      - name: Done
        run: exit 0
  test:
    name: Tests
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        rust: [1.79.0, nightly]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v2
      - name: Install rust
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
          override: true
      - name: Ready cache
        if: matrix.os == 'ubuntu-latest'
        run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/
      - name: Install dependencies
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libudev-dev
      - name: Cache cargo
        uses: actions/cache@v1
        id: cache
        with:
          path: ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Test
        run: cargo test --verbose -- --nocapture
  fmt:
   name: Rustfmt
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@v2
     - uses: actions-rs/toolchain@v1
       with:
         profile: minimal
         toolchain: nightly
         override: true
         components: rustfmt
     - name: Run fmt --all -- --check
       uses: actions-rs/cargo@v1
       with:
         command: fmt
         args: --all -- --check

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: nightly
          override: true
          components: clippy
      - name: Install dependencies
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libudev-dev
      - name: Cache cargo
        uses: actions/cache@v1
        id: cache
        with:
          path: ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run clippy --all-targets --
        uses: actions-rs/clippy-check@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --all-targets --
  docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: 1.79.0
          override: true
      - name: Install dependencies
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libudev-dev
      - name: Cache cargo
        uses: actions/cache@v1
        id: cache
        with:
          path: ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run doc tests
        uses: actions-rs/cargo@v1
        with:
          command: test
          args: --doc
      - name: Check docs
        uses: actions-rs/cargo@v1
        with:
          command: doc
          args: --no-deps
  docs-and-demos-ghpages:
    name: Update Docs and Demos in GitHub Pages
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v2
      - uses: jetli/wasm-bindgen-action@v0.1.0
        with:
          version: 'latest'
      - uses: actions-rs/toolchain@v1
        with:
          target: wasm32-unknown-unknown
          toolchain: 1.79.0
          override: true
      - name: Build docs
        env:
          GITHUB_REPO: ${{ github.repository }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |-
          cargo doc --verbose &&
          echo "<meta http-equiv=refresh content=0;url=bevy_egui_kbgp/index.html>" > target/doc/index.html &&
          cargo build --examples --target wasm32-unknown-unknown --features bevy/webgl2 &&
          for demowasm in $(cd target/wasm32-unknown-unknown/debug/examples; ls *.wasm | grep -v -); do
              wasm-bindgen target/wasm32-unknown-unknown/debug/examples/$demowasm --out-dir target/doc/demos/ --target web
              cat > target/doc/demos/${demowasm%.*}.html <<EOF
          <html lang="en-us">
              <head>
                  <script type="module">
                      import init from './${demowasm%.*}.js';
                      var res = await init();
                      res.start();
                  </script>
              </head>
              <body>
              </body>
          </html>
          EOF
          done
      - name: Add read permissions
        run: |-
          chmod --recursive +r target/doc
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v1
        with:
          path: target/doc
  deploy-ghpages:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: docs-and-demos-ghpages
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v2
