on: [push, pull_request]

name: Rust

env:
  RUSTFLAGS: -D warnings
  RUSTDOCFLAGS: -D warnings
  NIGHTLY_VERSION: nightly-2026-04-02

jobs:
  fmt-crank-check-test:
    name: Format + check
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.95.0

      - name: Install packages (Linux)
        if: runner.os == 'Linux'
        uses: awalsh128/cache-apt-pkgs-action@v1.4.3
        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

      - run: cargo clippy --locked --all-features --all-targets

      - run: cargo clippy --locked --all-features -p egui_extras

      - run: cargo clippy --locked --all-targets

      - run: cargo clippy --locked --no-default-features --lib --all-targets

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

      - run: cargo clippy --locked --no-default-features --lib -p eframe --features x11,wgpu_no_default_features

      - run: cargo clippy --locked --no-default-features --lib -p egui_extras

      - run: cargo clippy --locked --no-default-features --lib -p epaint

      # Regression test for https://github.com/emilk/egui/issues/4771
      - run: cargo clippy -p test_egui_extras_compilation

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

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

      - name: clippy release
        run: cargo clippy --all-targets --all-features --release -- -D warnings

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

  check_wasm:
    name: Check wasm32 + wasm-bindgen
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.95.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: clippy wasm32 egui_demo_app
        run: cargo clippy -p egui_demo_app --lib --target wasm32-unknown-unknown

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

      - name: clippy wasm32 eframe
        run: cargo clippy -p eframe --lib --no-default-features --features wgpu,persistence --target wasm32-unknown-unknown

      - name: wasm-bindgen
        uses: jetli/wasm-bindgen-action@v0.1.0
        with:
          version: "0.2.126" # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml

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

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

  # requires a different toolchain from the other checks (nightly)
  check_wasm_atomics:
    name: Check wasm32+atomics
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - 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
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: ${{env.NIGHTLY_VERSION}}
          targets: wasm32-unknown-unknown
          components: rust-src

      - name: Check wasm32+atomics eframe with wgpu
        run: RUSTFLAGS='-C target-feature=+atomics' cargo +${{env.NIGHTLY_VERSION}} check -p eframe --lib --no-default-features --features wgpu,wgpu/webgpu --target wasm32-unknown-unknown -Z build-std=std,panic_abort

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

  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
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: EmbarkStudios/cargo-deny-action@v2
        with:
          rust-version: "1.95.0"
          log-level: error
          command: check
          arguments: --target  ${{ matrix.target }}

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

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

      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.95.0
          targets: aarch64-linux-android

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

        # Default features disabled to turn off accesskit, which does not work
        # with NativeActivity.
      - run: cargo check --features wgpu,android-native-activity --target aarch64-linux-android --no-default-features
        working-directory: crates/eframe

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

  ios:
    name: ios
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.95.0
          targets: aarch64-apple-ios

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

        # Default features are disabled because glutin doesn't compile for ios.
      - run: cargo check --features wgpu --target aarch64-apple-ios --no-default-features
        working-directory: crates/eframe

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

  windows:
    name: Check Windows
    runs-on: windows-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.95.0

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

      - run: cargo clippy --all-targets --all-features

      - run: cargo clippy -p hello_world

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

  tests:
    name: Run tests
    # We run the tests on macOS because it will run with an actual GPU
    runs-on: macos-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.95.0

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

      - name: Run tests
        run: cargo test --all-features

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

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-results
          path: "**/tests/snapshots"
