name: CI

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  code_quality:
    name: Code Quality
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - run: cargo fmt --check
      - run: cargo clippy

  integrity:
    name: Integrity Test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          components: rustfmt
      - name: Setup OpenHarmony SDK
        uses: openharmony-rs/setup-ohos-sdk@v0.2
        with:
          version: 6.0.0.1
      - name: Generate bindings
        run: ./scripts/generate_bindings.sh
      - name: Check integrity
        run: git diff --exit-code

  build-toolchains:
    strategy:
      matrix:
        toolchain: [stable, beta, nightly]
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.toolchain }}
      - run: cargo build
        name: Build default features
      - run: cargo build --all-features
        name: Build all features
  api_feature_levels:
    strategy:
      matrix:
        # Note: We don't test API 16+17 in CI, since they were never officially releases separately.
        api_level: ["api-10", "api-11", "api-12", "api-13", "api-14", "api-15", "api-18", "api-20", "api-21"]
    name: Build with API feature levels
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - run: cargo build --features ${{ matrix.api_level }} --features all-components
        name: Build with API features
  api_minimal_featueres:
    strategy:
      matrix:
        component:
          - abilitykit
          - arkui
          - deviceinfo
          - drawing
          - hilog
          - hitrace
          - inputmethod
          - image-kit
          - multimodal-input
          - napi
          - native_buffer
          - native_image
          - native_window
          - rawfile
          - vsync
          - xcomponent
          - window_manager
    name: Build with minimal features
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Build minimal features API-10
        run: cargo build --features api-10 --features ${{ matrix.component }}
      - name: Build minimal features API-11
        run: cargo build --features api-11 --features ${{ matrix.component }}
      - name: Build minimal features API-12
        run: cargo build --features api-12 --features ${{ matrix.component }}
      - name: Build minimal features API-13
        run: cargo build --features api-13 --features ${{ matrix.component }}
      - name: Build minimal features API-14
        run: cargo build --features api-14 --features ${{ matrix.component }}
      - name: Build minimal features API-15
        run: cargo build --features api-15 --features ${{ matrix.component }}
      - name: Build minimal features API-16
        run: cargo build --features api-16 --features ${{ matrix.component }}
      - name: Build minimal features API-17
        run: cargo build --features api-17 --features ${{ matrix.component }}
      - name: Build minimal features API-18
        run: cargo build --features api-18 --features ${{ matrix.component }}
      - name: Build minimal features API-19
        run: cargo build --features api-19 --features ${{ matrix.component }}
      - name: Build minimal features API-20
        run: cargo build --features api-20 --features ${{ matrix.component }}
      - name: Build minimal features API-21
        run: cargo build --features api-21 --features ${{ matrix.component }}
  semver_checks:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Check semver
        uses: obi1kenobi/cargo-semver-checks-action@v2

  rustdoc:
    name: Build Documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
      - name: Build docs
        run: cargo doc --all-features --workspace --no-deps
        env:
          RUSTDOCFLAGS: "--cfg=docsrs"

  build-result:
    name: Result
    runs-on: ubuntu-latest
    if: always()
    # needs all build to detect cancellation
    needs:
      - code_quality
      - build-toolchains
      - api_feature_levels
      - api_minimal_featueres
      # - semver_checks
      - rustdoc
    steps:
      - name: Success
        if: ${{ !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
        run: exit 0
      - name: Failure
        if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')
        run: exit 1