on: [push, pull_request]

name: Rust

env:
  # web_sys_unstable_apis is required to enable the web_sys clipboard API which eframe web uses,
  # as well as by the wasm32-backend of the wgpu crate.
  # https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html
  # https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
  RUSTFLAGS: --cfg=web_sys_unstable_apis -D warnings
  RUSTDOCFLAGS: -D warnings

jobs:
  fmt-crank-check-test:
    name: Format + check + test
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.72.0

      - name: Install packages (Linux)
        if: runner.os == 'Linux'
        #uses: awalsh128/cache-apt-pkgs-action@v1.2.2
        #TODO(emilk) use upstream when https://github.com/awalsh128/cache-apt-pkgs-action/pull/90 is merged
        uses: rerun-io/cache-apt-pkgs-action@59534850182063abf1b2c11bb3686722a12a8397
        with:
          packages: libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libgtk-3-dev # libgtk-3-dev is used by rfd
          version: 1.0
          execute_install_scripts: true

      - name: Set up cargo cache
        uses: Swatinem/rust-cache@v2

      - name: Rustfmt
        run: cargo fmt --all -- --check

      - name: Lint vertical spacing
        run: ./scripts/lint.py

      - name: Install cargo-cranky
        uses: baptiste0928/cargo-install@v1
        with:
          crate: cargo-cranky

      - name: check --all-features
        run: cargo check --locked --all-features --all-targets

      - name: check egui_extras --all-features
        run: cargo check --locked --all-features -p egui_extras

      - name: check default features
        run: cargo check --locked --all-targets

      - name: check --no-default-features
        run: cargo check --locked --no-default-features --lib --all-targets

      - name: check eframe --no-default-features
        run: cargo check --locked --no-default-features --features x11 --lib -p eframe

      - name: check egui_extras --no-default-features
        run: cargo check --locked --no-default-features --lib -p egui_extras

      - name: check epaint --no-default-features
        run: cargo check --locked --no-default-features --lib -p epaint

      - name: Test doc-tests
        run: cargo test --doc --all-features

      - name: cargo doc --lib
        run: cargo doc --lib --no-deps --all-features

      - name: cargo doc --document-private-items
        run: cargo doc --document-private-items --no-deps --all-features

      - name: Test
        run: cargo test --all-features

      - name: Cranky
        run: cargo cranky --all-targets --all-features -- -D warnings

      - name: Cranky release
        run: cargo cranky --all-targets --all-features --release -- -D warnings

  # ---------------------------------------------------------------------------

  check_wasm:
    name: Check wasm32 + wasm-bindgen
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.72.0
          targets: wasm32-unknown-unknown

      - run: sudo apt-get update && sudo apt-get install libgtk-3-dev libatk1.0-dev

      - name: Set up cargo cache
        uses: Swatinem/rust-cache@v2

      - name: Install cargo-cranky
        uses: baptiste0928/cargo-install@v1
        with:
          crate: cargo-cranky

      - name: Check wasm32 egui_demo_app
        run: cargo check -p egui_demo_app --lib --target wasm32-unknown-unknown

      - name: Check wasm32 egui_demo_app --all-features
        run: cargo check -p egui_demo_app --lib --target wasm32-unknown-unknown --all-features

      - name: Check wasm32 eframe
        run: cargo check -p eframe --lib --no-default-features --features glow,persistence --target wasm32-unknown-unknown

      - name: wasm-bindgen
        uses: jetli/wasm-bindgen-action@v0.1.0
        with:
          version: "0.2.88"

      - run: ./scripts/wasm_bindgen_check.sh --skip-setup

      - name: Cranky wasm32
        run: ./scripts/clippy_wasm.sh

  # ---------------------------------------------------------------------------

  cargo-deny:
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: aarch64-apple-darwin
          - target: aarch64-linux-android
          - target: i686-pc-windows-gnu
          - target: i686-pc-windows-msvc
          - target: i686-unknown-linux-gnu
          - target: wasm32-unknown-unknown
          - target: x86_64-apple-darwin
          - target: x86_64-pc-windows-gnu
          - target: x86_64-pc-windows-msvc
          - target: x86_64-unknown-linux-gnu
          - target: x86_64-unknown-linux-musl
          - target: x86_64-unknown-redox

    name: cargo-deny ${{ matrix.target }}
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: EmbarkStudios/cargo-deny-action@v1
        with:
          rust-version: "1.72.0"
          log-level: error
          command: check
          arguments: --target  ${{ matrix.target }}

  # ---------------------------------------------------------------------------

  android:
    name: android
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.72.0
          targets: aarch64-linux-android

      - name: Set up cargo cache
        uses: Swatinem/rust-cache@v2

      - run: cargo check --features wgpu,android-native-activity --target aarch64-linux-android
        working-directory: crates/eframe

  # ---------------------------------------------------------------------------

  windows:
    name: Check Windows
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.72.0

      - name: Set up cargo cache
        uses: Swatinem/rust-cache@v2

      - name: Check all
        run: cargo check --all-targets --all-features

      - name: Check hello_world
        run: cargo check -p hello_world
