# This yaml shares the build bridge steps with ci and nightly.
name: Build flutter-rust-bridge
# 2023-11-23 18:00:00+00:00

on:
  workflow_call:

env:
  CARGO_EXPAND_VERSION: "1.0.95"
  FLUTTER_VERSION: "3.22.3"
  FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
  RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503

jobs:
  generate_bridge:
    runs-on: ${{ matrix.job.os }}
    strategy:
      fail-fast: false
      matrix:
        job:
          - {
              target: x86_64-unknown-linux-gnu,
              os: ubuntu-22.04,
              extra-build-args: "",
            }
    steps:
      - name: Checkout source code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Install prerequisites
        run: |
          sudo apt-get install ca-certificates -y
          sudo apt-get update -y
          sudo apt-get install -y \
            clang \
            cmake \
            curl \
            gcc \
            git \
            g++ \
            libclang-dev \
            libgtk-3-dev \
            llvm-dev \
            nasm \
            ninja-build \
            pkg-config \
            wget

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          targets: ${{ matrix.job.target }}
          components: "rustfmt"

      - uses: Swatinem/rust-cache@v2
        with:
          prefix-key: bridge-${{ matrix.job.os }}

      - name: Cache Bridge
        id: cache-bridge
        uses: actions/cache@v3
        with:
          path: /tmp/flutter_rust_bridge
          key: vcpkg-${{ matrix.job.arch }}

      - name: Install flutter
        uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version: ${{ env.FLUTTER_VERSION }}
          cache: true

      - name: Install flutter rust bridge deps
        shell: bash
        run: |
          cargo install cargo-expand --version ${{ env.CARGO_EXPAND_VERSION }} --locked
          cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked
          pushd flutter && sed -i -e 's/extended_text: 14.0.0/extended_text: 13.0.0/g' pubspec.yaml && flutter pub get && popd

      - name: Run flutter rust bridge
        run: |
          ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h
          cp ./flutter/macos/Runner/bridge_generated.h ./flutter/ios/Runner/bridge_generated.h

      - name: Upload Artifact
        uses: actions/upload-artifact@master
        with:
          name: bridge-artifact
          path: |
            ./src/bridge_generated.rs
            ./src/bridge_generated.io.rs
            ./flutter/lib/generated_bridge.dart
            ./flutter/lib/generated_bridge.freezed.dart
            ./flutter/macos/Runner/bridge_generated.h
            ./flutter/ios/Runner/bridge_generated.h
