From aec3678bd689d4522a27f67c6bc5def1ed331889 Mon Sep 17 00:00:00 2001 From: Mikhail Kilin Date: Thu, 21 May 2026 00:48:30 +0300 Subject: [PATCH] Add CI typecheck for iOS UniFFI app bridge --- .github/workflows/ios-rust.yml | 2 ++ crates/tele-ios-ffi/README.md | 6 ++++ scripts/typecheck-ios-uniffi-app-bridge.sh | 33 ++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100755 scripts/typecheck-ios-uniffi-app-bridge.sh diff --git a/.github/workflows/ios-rust.yml b/.github/workflows/ios-rust.yml index ea3dc49..516dbe5 100644 --- a/.github/workflows/ios-rust.yml +++ b/.github/workflows/ios-rust.yml @@ -23,6 +23,8 @@ jobs: run: cargo test -p tele-ios-ffi --no-default-features --features standalone-fake - name: Swift FFI smoke run: scripts/smoke-ios-ffi-swift.sh /tmp/tele-ios-ffi-swift-smoke + - name: Swift app UniFFI bridge typecheck + run: scripts/typecheck-ios-uniffi-app-bridge.sh /tmp/tele-ios-ffi-swift-smoke /tmp/tele-ios-ffi-app-typecheck-module-cache - name: Generate iOS FFI bindings run: scripts/generate-ios-ffi-bindings.sh /tmp/tele-ios-ffi - name: Swift bindings typecheck diff --git a/crates/tele-ios-ffi/README.md b/crates/tele-ios-ffi/README.md index cdacc2a..4eef2a1 100644 --- a/crates/tele-ios-ffi/README.md +++ b/crates/tele-ios-ffi/README.md @@ -30,6 +30,12 @@ Run an executable Swift smoke test against matching fake-only UniFFI bindings: DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer scripts/smoke-ios-ffi-swift.sh ``` +Typecheck the Swift app bridge against generated UniFFI bindings: + +```bash +DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer scripts/typecheck-ios-uniffi-app-bridge.sh +``` + Current linking status: - Xcode is installed at `/Applications/Xcode.app`, and `DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild -version` reports Xcode 26.5. diff --git a/scripts/typecheck-ios-uniffi-app-bridge.sh b/scripts/typecheck-ios-uniffi-app-bridge.sh new file mode 100755 index 0000000..9411f69 --- /dev/null +++ b/scripts/typecheck-ios-uniffi-app-bridge.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ffi_dir="${1:-/private/tmp/tele-ios-ffi-swift-smoke}" +module_cache="${2:-/private/tmp/tele-ios-ffi-app-typecheck-module-cache}" + +if [[ -z "${DEVELOPER_DIR:-}" && -d /Applications/Xcode.app/Contents/Developer ]]; then + export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer +fi + +if [[ ! -f "${ffi_dir}/Swift/tele_ios_ffi.swift" || ! -f "${ffi_dir}/Headers/module.modulemap" ]]; then + "${repo_root}/scripts/smoke-ios-ffi-swift.sh" "${ffi_dir}" +fi + +swiftc \ + -typecheck \ + -parse-as-library \ + -module-name TeleTuiIOSCore \ + -module-cache-path "${module_cache}" \ + -I "${ffi_dir}/Headers" \ + "${ffi_dir}/Swift/tele_ios_ffi.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Models.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Bridge.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Lifecycle.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/PlatformServices.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/SessionBridgeFactory.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Storage.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/ViewModels.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift" \ + "${repo_root}/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/UniFfiSessionBridge.swift" + +printf 'Typechecked TeleTuiIOSCore against UniFFI Swift bindings in %s\n' "${ffi_dir}"