peace 0.0.15

zero stress automation
Documentation
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - "**"

name: CI

jobs:
  audit:
    name: Audit
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - name: "Generate Cargo.lock"
        run: cargo generate-lockfile

      - name: cargo-audit cache restore
        id: cargo-audit_cache_restore
        uses: actions/cache/restore@v4
        with:
          path: ~/.cargo/bin/cargo-audit
          key: ${{ runner.os }}-cargo-audit

      - run: cargo install cargo-audit
        if: steps.cargo-audit_cache_restore.outputs.cache-hit != 'true'

      - name: cargo-audit cache save
        id: cargo-audit_cache_save
        uses: actions/cache/save@v4
        if: always() && steps.cargo-audit_cache_restore.outputs.cache-hit != 'true'
        with:
          path: ~/.cargo/bin/cargo-audit
          key: ${{ runner.os }}-cargo-audit

      - uses: rustsec/audit-check@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  licenses:
    name: Licenses
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: EmbarkStudios/cargo-deny-action@v2

      - name: cargo-about cache
        id: cargo-about-cache
        uses: actions/cache@v4
        with:
          path: ~/.cargo/bin/cargo-about
          key: cargo-about-${{ runner.os }}

      - name: cargo-about install
        if: steps.cargo-about-cache.outputs.cache-hit != 'true'
        run: cargo install --locked cargo-about

      - name: cargo-about generate licenses
        run: cargo about generate --workspace --all-features about.hbs > doc/src/licenses.html

  fmt:
    name: Rustfmt
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
          components: rustfmt

      - run: cargo fmt --all -- --check

  docs_and_spell_check:
    name: Docs and Spell Check
    runs-on: ubuntu-latest
    timeout-minutes: 20
    env:
      RUSTDOCFLAGS: "-Dwarnings"
    steps:
      - name: Checkout Actions Repository
        uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable

      - name: Check spelling
        uses: crate-ci/typos@master

      - run: cargo doc --no-deps

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
          components: clippy

      - name: "Run clippy"
        # we cannot use `--all-features` because `envman` has features that are mutually exclusive.
        run: |
          cargo clippy_cli

        # Ideally we'd also run it for WASM, but:
        #
        # * `workspace_tests` is only coded for native targets.
        # * There is little benefit running it for everything again.
        #
        # The command that we *would* use is:
        #
        # ```bash
        # cargo clippy \
        #   --workspace \
        #   --target wasm32-unknown-unknown \
        #   --no-default-features \
        #   --features "error_reporting" \
        #   --fix \
        #   --exclude peace_rt_model_native \
        #   --exclude peace_item_spec_sh_cmd \
        #   --exclude peace_item_spec_sh_sync_cmd \
        #   --exclude peace_item_spec_tar_x \
        #   --exclude peace_item_specs \
        #   --exclude workspace_tests \
        #   --exclude app_cycle \
        #   --exclude download \
        #   -- -D warnings
        # ```

  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
          components: llvm-tools-preview

      - uses: taiki-e/install-action@cargo-llvm-cov
      - uses: taiki-e/install-action@nextest

      - name: "Configure build to remove debuginfo"
        run: echo $'\n[profile.dev]\ndebug = false' >> Cargo.toml

      - name: "Collect coverage"
        run: ./coverage.sh

      - name: "Print directory sizes"
        run: du -sh target/coverage target/llvm-cov-target

      - name: Upload to codecov.io
        uses: codecov/codecov-action@v4
        with:
          files: ./target/coverage/lcov.info
          token: ${{ secrets.CODECOV_TOKEN }}

  build_and_test_linux:
    name: Build and Test (Linux)
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable

      - uses: taiki-e/install-action@nextest
      - name: "Build and test"
        run: |
          for j in {0..4}; do cargo test_$j || break; done

  build_and_test_windows:
    name: Build and Test (Windows)
    runs-on: windows-latest
    timeout-minutes: 20
    steps:
      - name: Prepare symlink configuration
        run: git config --global core.symlinks true

      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable

      - uses: taiki-e/install-action@nextest
      - name: "Build and test"
        run: cargo nextest run --workspace --all-features

  build_examples_native:
    name: Build examples (Native)
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable

      - name: "Example: download (native)"
        run: cargo build --package download --all-features

      - name: "Example: envman (native)"
        run: cargo build --package envman --features cli

  build_examples_web:
    name: Build examples (WASM, Leptos)
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          targets: wasm32-unknown-unknown

      - name: "Install `wasm-pack`"
        uses: jetli/wasm-pack-action@v0.4.0
        with:
          version: "latest"

      - name: cargo-leptos cache
        id: cargo-leptos-cache
        uses: actions/cache@v4
        with:
          path: ~/.cargo/bin/cargo-leptos
          key: cargo-leptos-${{ runner.os }}

      - name: cargo-leptos install
        if: steps.cargo-leptos-cache.outputs.cache-hit != 'true'
        run: cargo install --git https://github.com/leptos-rs/cargo-leptos.git --locked cargo-leptos

      - name: "Example: envman (leptos)"
        run: cargo envman_build_debug

      # When updating this, also update book.yml
      - name: "Example: download (WASM)"
        # The following no longer works, because the AWS SDK uses tokio with UDP features enabled:
        # for example in $(ls examples)
        run: |
          for example in download
          do wasm-pack build \
            --target web \
            --out-dir "../../doc/src/examples/pkg" \
            --release \
            "examples/${example}" \
            --features 'error_reporting'
          done