name: Bindings tests

on:
  workflow_dispatch:
  push:
    branches: [main]
  pull_request:
    branches: [main]
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  CARGO_TERM_COLOR: always

jobs:
  xtask:
    uses: ./.github/workflows/xtask.yml

  test-uniffi-codegen:
    name: Test UniFFI bindings generation
    needs: xtask
    if: github.event_name == 'push' || !github.event.pull_request.draft
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install protoc
        uses: taiki-e/install-action@v2
        with:
          tool: protoc@3.20.3

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      # Cargo config can screw with caching and is only used for alias config
      # and extra lints, which we don't care about here
      - name: Delete cargo config
        run: rm .cargo/config.toml

      - name: Load cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Get xtask
        uses: actions/cache/restore@v3
        with:
          path: target/debug/xtask
          key: "${{ needs.xtask.outputs.cachekey-linux }}"
          fail-on-cache-miss: true

      - name: Build library & generate bindings
        run: target/debug/xtask ci bindings

  test-apple:
    name: matrix-rust-components-swift
    needs: xtask
    runs-on: macos-12
    if: github.event_name == 'push' || !github.event.pull_request.draft

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      # install protoc in case we end up rebuilding opentelemetry-proto
      - name: Install protoc
        uses: taiki-e/install-action@v2
        with:
          tool: protoc@3.20.3

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Install aarch64-apple-ios target
        run: rustup target install aarch64-apple-ios

      # Cargo config can screw with caching and is only used for alias config
      # and extra lints, which we don't care about here
      - name: Delete cargo config
        run: rm .cargo/config.toml

      - name: Load cache
        uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Get xtask
        uses: actions/cache/restore@v3
        with:
          path: target/debug/xtask
          key: "${{ needs.xtask.outputs.cachekey-macos }}"
          fail-on-cache-miss: true

      - name: Build library & bindings
        run: target/debug/xtask swift build-library

      - name: Run XCTests
        working-directory: bindings/apple
        run: swift test

      - name: Build Framework
        run: target/debug/xtask swift build-framework --only-target=aarch64-apple-ios
