79 lines
2.5 KiB
Swift
Generated
79 lines
2.5 KiB
Swift
Generated
// Generated by alef. Do not edit by hand.
|
|
// swift-format-ignore-file
|
|
// This file contains generated FFI glue for trait bridge registration.
|
|
|
|
import Foundation
|
|
import RustBridge
|
|
|
|
/// Protocol for outbound `OcrBackend` implementations.
|
|
/// Conform your Swift class or struct to this protocol to implement
|
|
/// a Rust trait from the host side.
|
|
public protocol SwiftOcrBackendBridge: AnyObject {
|
|
func processImage(image_bytes: Data, config: OcrConfig) throws -> String
|
|
func supportsLanguage(lang: String) -> Bool
|
|
func backendType() -> OcrBackendType
|
|
}
|
|
|
|
/// Internal adapter wrapping a `SwiftOcrBackendBridge` conformer.
|
|
/// Marshals Swift types and trait calls to/from the C boundary.
|
|
/// Excluded/internal types are serialised to/from JSON strings.
|
|
final class SwiftOcrBackendAdapter {
|
|
private let bridge: any SwiftOcrBackendBridge
|
|
|
|
init(bridge: any SwiftOcrBackendBridge) {
|
|
self.bridge = bridge
|
|
}
|
|
|
|
func processImageCall(image_bytes: Data, config: OcrConfig) throws -> String {
|
|
do {
|
|
let result = try self.bridge.processImage(image_bytes: image_bytes, config: config)
|
|
let encodedData = try marshal_encode_excluded(result)
|
|
if let jsonString = String(data: encodedData, encoding: .utf8) {
|
|
return "{\"ok\": \(jsonString)}"
|
|
}
|
|
return "{\"ok\": null}"
|
|
} catch {
|
|
return marshal_error_result(error)
|
|
}
|
|
}
|
|
|
|
func supportsLanguageCall(lang: String) -> Bool {
|
|
let result = self.bridge.supportsLanguage(lang: lang)
|
|
return result
|
|
}
|
|
|
|
func backendTypeCall() -> OcrBackendType {
|
|
let result = self.bridge.backendType()
|
|
return result
|
|
}
|
|
|
|
}
|
|
|
|
// MARK: - Marshalling helpers
|
|
|
|
private struct Empty: Codable {}
|
|
|
|
private func marshal_ok_result<T: Encodable>(_ value: T) -> String {
|
|
let encoder = JSONEncoder()
|
|
if let data = try? encoder.encode(value),
|
|
let jsonString = String(data: data, encoding: .utf8) {
|
|
return "{\"ok\": \(jsonString)}"
|
|
}
|
|
return "{\"ok\": null}"
|
|
}
|
|
|
|
private func marshal_encode_excluded<T: Encodable>(_ value: T) throws -> Data {
|
|
let encoder = JSONEncoder()
|
|
return try encoder.encode(value)
|
|
}
|
|
|
|
private func marshal_error_result(_ error: any Error) -> String {
|
|
let errorString = String(describing: error)
|
|
let encoder = JSONEncoder()
|
|
if let data = try? encoder.encode(errorString),
|
|
let jsonString = String(data: data, encoding: .utf8) {
|
|
return "{\"err\": \(jsonString)}"
|
|
}
|
|
return "{\"err\": \"unknown error\"}"
|
|
}
|