// This file was autogenerated by some hot garbage in the `uniffi` crate. // Trust me, you don't want to mess with it! import Foundation // Depending on the consumer's build setup, the low-level FFI code // might be in a separate module, or it might be compiled inline into // this module. This is a bit of light hackery to work with both. #if canImport(pubkycoreFFI) import pubkycoreFFI #endif fileprivate extension RustBuffer { // Allocate a new buffer, copying the contents of a `UInt8` array. init(bytes: [UInt8]) { let rbuf = bytes.withUnsafeBufferPointer { ptr in RustBuffer.from(ptr) } self.init(capacity: rbuf.capacity, len: rbuf.len, data: rbuf.data) } static func from(_ ptr: UnsafeBufferPointer) -> RustBuffer { try! rustCall { ffi_pubkycore_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) } } // Frees the buffer in place. // The buffer must not be used after this is called. func deallocate() { try! rustCall { ffi_pubkycore_rustbuffer_free(self, $0) } } } fileprivate extension ForeignBytes { init(bufferPointer: UnsafeBufferPointer) { self.init(len: Int32(bufferPointer.count), data: bufferPointer.baseAddress) } } // For every type used in the interface, we provide helper methods for conveniently // lifting and lowering that type from C-compatible data, and for reading and writing // values of that type in a buffer. // Helper classes/extensions that don't change. // Someday, this will be in a library of its own. fileprivate extension Data { init(rustBuffer: RustBuffer) { // TODO: This copies the buffer. Can we read directly from a // Rust buffer? self.init(bytes: rustBuffer.data!, count: Int(rustBuffer.len)) } } // Define reader functionality. Normally this would be defined in a class or // struct, but we use standalone functions instead in order to make external // types work. // // With external types, one swift source file needs to be able to call the read // method on another source file's FfiConverter, but then what visibility // should Reader have? // - If Reader is fileprivate, then this means the read() must also // be fileprivate, which doesn't work with external types. // - If Reader is internal/public, we'll get compile errors since both source // files will try define the same type. // // Instead, the read() method and these helper functions input a tuple of data fileprivate func createReader(data: Data) -> (data: Data, offset: Data.Index) { (data: data, offset: 0) } // Reads an integer at the current offset, in big-endian order, and advances // the offset on success. Throws if reading the integer would move the // offset past the end of the buffer. fileprivate func readInt(_ reader: inout (data: Data, offset: Data.Index)) throws -> T { let range = reader.offset...size guard reader.data.count >= range.upperBound else { throw UniffiInternalError.bufferOverflow } if T.self == UInt8.self { let value = reader.data[reader.offset] reader.offset += 1 return value as! T } var value: T = 0 let _ = withUnsafeMutableBytes(of: &value, { reader.data.copyBytes(to: $0, from: range)}) reader.offset = range.upperBound return value.bigEndian } // Reads an arbitrary number of bytes, to be used to read // raw bytes, this is useful when lifting strings fileprivate func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> Array { let range = reader.offset..<(reader.offset+count) guard reader.data.count >= range.upperBound else { throw UniffiInternalError.bufferOverflow } var value = [UInt8](repeating: 0, count: count) value.withUnsafeMutableBufferPointer({ buffer in reader.data.copyBytes(to: buffer, from: range) }) reader.offset = range.upperBound return value } // Reads a float at the current offset. fileprivate func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float { return Float(bitPattern: try readInt(&reader)) } // Reads a float at the current offset. fileprivate func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double { return Double(bitPattern: try readInt(&reader)) } // Indicates if the offset has reached the end of the buffer. fileprivate func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { return reader.offset < reader.data.count } // Define writer functionality. Normally this would be defined in a class or // struct, but we use standalone functions instead in order to make external // types work. See the above discussion on Readers for details. fileprivate func createWriter() -> [UInt8] { return [] } fileprivate func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 { writer.append(contentsOf: byteArr) } // Writes an integer in big-endian order. // // Warning: make sure what you are trying to write // is in the correct type! fileprivate func writeInt(_ writer: inout [UInt8], _ value: T) { var value = value.bigEndian withUnsafeBytes(of: &value) { writer.append(contentsOf: $0) } } fileprivate func writeFloat(_ writer: inout [UInt8], _ value: Float) { writeInt(&writer, value.bitPattern) } fileprivate func writeDouble(_ writer: inout [UInt8], _ value: Double) { writeInt(&writer, value.bitPattern) } // Protocol for types that transfer other types across the FFI. This is // analogous go the Rust trait of the same name. fileprivate protocol FfiConverter { associatedtype FfiType associatedtype SwiftType static func lift(_ value: FfiType) throws -> SwiftType static func lower(_ value: SwiftType) -> FfiType static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType static func write(_ value: SwiftType, into buf: inout [UInt8]) } // Types conforming to `Primitive` pass themselves directly over the FFI. fileprivate protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType { } extension FfiConverterPrimitive { public static func lift(_ value: FfiType) throws -> SwiftType { return value } public static func lower(_ value: SwiftType) -> FfiType { return value } } // Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`. // Used for complex types where it's hard to write a custom lift/lower. fileprivate protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} extension FfiConverterRustBuffer { public static func lift(_ buf: RustBuffer) throws -> SwiftType { var reader = createReader(data: Data(rustBuffer: buf)) let value = try read(from: &reader) if hasRemaining(reader) { throw UniffiInternalError.incompleteData } buf.deallocate() return value } public static func lower(_ value: SwiftType) -> RustBuffer { var writer = createWriter() write(value, into: &writer) return RustBuffer(bytes: writer) } } // An error type for FFI errors. These errors occur at the UniFFI level, not // the library level. fileprivate enum UniffiInternalError: LocalizedError { case bufferOverflow case incompleteData case unexpectedOptionalTag case unexpectedEnumCase case unexpectedNullPointer case unexpectedRustCallStatusCode case unexpectedRustCallError case unexpectedStaleHandle case rustPanic(_ message: String) public var errorDescription: String? { switch self { case .bufferOverflow: return "Reading the requested value would read past the end of the buffer" case .incompleteData: return "The buffer still has data after lifting its containing value" case .unexpectedOptionalTag: return "Unexpected optional tag; should be 0 or 1" case .unexpectedEnumCase: return "Raw enum value doesn't match any cases" case .unexpectedNullPointer: return "Raw pointer value was null" case .unexpectedRustCallStatusCode: return "Unexpected RustCallStatus code" case .unexpectedRustCallError: return "CALL_ERROR but no errorClass specified" case .unexpectedStaleHandle: return "The object in the handle map has been dropped already" case let .rustPanic(message): return message } } } fileprivate let CALL_SUCCESS: Int8 = 0 fileprivate let CALL_ERROR: Int8 = 1 fileprivate let CALL_PANIC: Int8 = 2 fileprivate let CALL_CANCELLED: Int8 = 3 fileprivate extension RustCallStatus { init() { self.init( code: CALL_SUCCESS, errorBuf: RustBuffer.init( capacity: 0, len: 0, data: nil ) ) } } private func rustCall(_ callback: (UnsafeMutablePointer) -> T) throws -> T { try makeRustCall(callback, errorHandler: nil) } private func rustCallWithError( _ errorHandler: @escaping (RustBuffer) throws -> Error, _ callback: (UnsafeMutablePointer) -> T) throws -> T { try makeRustCall(callback, errorHandler: errorHandler) } private func makeRustCall( _ callback: (UnsafeMutablePointer) -> T, errorHandler: ((RustBuffer) throws -> Error)? ) throws -> T { uniffiEnsureInitialized() var callStatus = RustCallStatus.init() let returnedVal = callback(&callStatus) try uniffiCheckCallStatus(callStatus: callStatus, errorHandler: errorHandler) return returnedVal } private func uniffiCheckCallStatus( callStatus: RustCallStatus, errorHandler: ((RustBuffer) throws -> Error)? ) throws { switch callStatus.code { case CALL_SUCCESS: return case CALL_ERROR: if let errorHandler = errorHandler { throw try errorHandler(callStatus.errorBuf) } else { callStatus.errorBuf.deallocate() throw UniffiInternalError.unexpectedRustCallError } case CALL_PANIC: // When the rust code sees a panic, it tries to construct a RustBuffer // with the message. But if that code panics, then it just sends back // an empty buffer. if callStatus.errorBuf.len > 0 { throw UniffiInternalError.rustPanic(try FfiConverterString.lift(callStatus.errorBuf)) } else { callStatus.errorBuf.deallocate() throw UniffiInternalError.rustPanic("Rust panic") } case CALL_CANCELLED: throw CancellationError() default: throw UniffiInternalError.unexpectedRustCallStatusCode } } // Public interface members begin here. fileprivate struct FfiConverterBool : FfiConverter { typealias FfiType = Int8 typealias SwiftType = Bool public static func lift(_ value: Int8) throws -> Bool { return value != 0 } public static func lower(_ value: Bool) -> Int8 { return value ? 1 : 0 } public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Bool { return try lift(readInt(&buf)) } public static func write(_ value: Bool, into buf: inout [UInt8]) { writeInt(&buf, lower(value)) } } fileprivate struct FfiConverterString: FfiConverter { typealias SwiftType = String typealias FfiType = RustBuffer public static func lift(_ value: RustBuffer) throws -> String { defer { value.deallocate() } if value.data == nil { return String() } let bytes = UnsafeBufferPointer(start: value.data!, count: Int(value.len)) return String(bytes: bytes, encoding: String.Encoding.utf8)! } public static func lower(_ value: String) -> RustBuffer { return value.utf8CString.withUnsafeBufferPointer { ptr in // The swift string gives us int8_t, we want uint8_t. ptr.withMemoryRebound(to: UInt8.self) { ptr in // The swift string gives us a trailing null byte, we don't want it. let buf = UnsafeBufferPointer(rebasing: ptr.prefix(upTo: ptr.count - 1)) return RustBuffer.from(buf) } } } public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> String { let len: Int32 = try readInt(&buf) return String(bytes: try readBytes(&buf, count: Int(len)), encoding: String.Encoding.utf8)! } public static func write(_ value: String, into buf: inout [UInt8]) { let len = Int32(value.utf8.count) writeInt(&buf, len) writeBytes(&buf, value.utf8) } } public protocol EventNotifierProtocol { } public class EventNotifier: EventNotifierProtocol { fileprivate let pointer: UnsafeMutableRawPointer // TODO: We'd like this to be `private` but for Swifty reasons, // we can't implement `FfiConverter` without making this `required` and we can't // make it `required` without making it `public`. required init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) { self.pointer = pointer } deinit { try! rustCall { uniffi_pubkycore_fn_free_eventnotifier(pointer, $0) } } } public struct FfiConverterTypeEventNotifier: FfiConverter { typealias FfiType = UnsafeMutableRawPointer typealias SwiftType = EventNotifier public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> EventNotifier { let v: UInt64 = try readInt(&buf) // The Rust code won't compile if a pointer won't fit in a UInt64. // We have to go via `UInt` because that's the thing that's the size of a pointer. let ptr = UnsafeMutableRawPointer(bitPattern: UInt(truncatingIfNeeded: v)) if (ptr == nil) { throw UniffiInternalError.unexpectedNullPointer } return try lift(ptr!) } public static func write(_ value: EventNotifier, into buf: inout [UInt8]) { // This fiddling is because `Int` is the thing that's the same size as a pointer. // The Rust code won't compile if a pointer won't fit in a `UInt64`. writeInt(&buf, UInt64(bitPattern: Int64(Int(bitPattern: lower(value))))) } public static func lift(_ pointer: UnsafeMutableRawPointer) throws -> EventNotifier { return EventNotifier(unsafeFromRawPointer: pointer) } public static func lower(_ value: EventNotifier) -> UnsafeMutableRawPointer { return value.pointer } } public func FfiConverterTypeEventNotifier_lift(_ pointer: UnsafeMutableRawPointer) throws -> EventNotifier { return try FfiConverterTypeEventNotifier.lift(pointer) } public func FfiConverterTypeEventNotifier_lower(_ value: EventNotifier) -> UnsafeMutableRawPointer { return FfiConverterTypeEventNotifier.lower(value) } fileprivate extension NSLock { func withLock(f: () throws -> T) rethrows -> T { self.lock() defer { self.unlock() } return try f() } } fileprivate typealias UniFFICallbackHandle = UInt64 fileprivate class UniFFICallbackHandleMap { private var leftMap: [UniFFICallbackHandle: T] = [:] private var counter: [UniFFICallbackHandle: UInt64] = [:] private var rightMap: [ObjectIdentifier: UniFFICallbackHandle] = [:] private let lock = NSLock() private var currentHandle: UniFFICallbackHandle = 0 private let stride: UniFFICallbackHandle = 1 func insert(obj: T) -> UniFFICallbackHandle { lock.withLock { let id = ObjectIdentifier(obj as AnyObject) let handle = rightMap[id] ?? { currentHandle += stride let handle = currentHandle leftMap[handle] = obj rightMap[id] = handle return handle }() counter[handle] = (counter[handle] ?? 0) + 1 return handle } } func get(handle: UniFFICallbackHandle) -> T? { lock.withLock { leftMap[handle] } } func delete(handle: UniFFICallbackHandle) { remove(handle: handle) } @discardableResult func remove(handle: UniFFICallbackHandle) -> T? { lock.withLock { defer { counter[handle] = (counter[handle] ?? 1) - 1 } guard counter[handle] == 1 else { return leftMap[handle] } let obj = leftMap.removeValue(forKey: handle) if let obj = obj { rightMap.removeValue(forKey: ObjectIdentifier(obj as AnyObject)) } return obj } } } // Magic number for the Rust proxy to call using the same mechanism as every other method, // to free the callback once it's dropped by Rust. private let IDX_CALLBACK_FREE: Int32 = 0 // Callback return codes private let UNIFFI_CALLBACK_SUCCESS: Int32 = 0 private let UNIFFI_CALLBACK_ERROR: Int32 = 1 private let UNIFFI_CALLBACK_UNEXPECTED_ERROR: Int32 = 2 // Declaration and FfiConverters for EventListener Callback Interface public protocol EventListener : AnyObject { func onEventOccurred(eventData: String) } // The ForeignCallback that is passed to Rust. fileprivate let foreignCallbackCallbackInterfaceEventListener : ForeignCallback = { (handle: UniFFICallbackHandle, method: Int32, argsData: UnsafePointer, argsLen: Int32, out_buf: UnsafeMutablePointer) -> Int32 in func invokeOnEventOccurred(_ swiftCallbackInterface: EventListener, _ argsData: UnsafePointer, _ argsLen: Int32, _ out_buf: UnsafeMutablePointer) throws -> Int32 { var reader = createReader(data: Data(bytes: argsData, count: Int(argsLen))) func makeCall() throws -> Int32 { try swiftCallbackInterface.onEventOccurred( eventData: try FfiConverterString.read(from: &reader) ) return UNIFFI_CALLBACK_SUCCESS } return try makeCall() } switch method { case IDX_CALLBACK_FREE: FfiConverterCallbackInterfaceEventListener.drop(handle: handle) // Sucessful return // See docs of ForeignCallback in `uniffi_core/src/ffi/foreigncallbacks.rs` return UNIFFI_CALLBACK_SUCCESS case 1: let cb: EventListener do { cb = try FfiConverterCallbackInterfaceEventListener.lift(handle) } catch { out_buf.pointee = FfiConverterString.lower("EventListener: Invalid handle") return UNIFFI_CALLBACK_UNEXPECTED_ERROR } do { return try invokeOnEventOccurred(cb, argsData, argsLen, out_buf) } catch let error { out_buf.pointee = FfiConverterString.lower(String(describing: error)) return UNIFFI_CALLBACK_UNEXPECTED_ERROR } // This should never happen, because an out of bounds method index won't // ever be used. Once we can catch errors, we should return an InternalError. // https://github.com/mozilla/uniffi-rs/issues/351 default: // An unexpected error happened. // See docs of ForeignCallback in `uniffi_core/src/ffi/foreigncallbacks.rs` return UNIFFI_CALLBACK_UNEXPECTED_ERROR } } // FfiConverter protocol for callback interfaces fileprivate struct FfiConverterCallbackInterfaceEventListener { private static let initCallbackOnce: () = { // Swift ensures this initializer code will once run once, even when accessed by multiple threads. try! rustCall { (err: UnsafeMutablePointer) in uniffi_pubkycore_fn_init_callback_eventlistener(foreignCallbackCallbackInterfaceEventListener, err) } }() private static func ensureCallbackinitialized() { _ = initCallbackOnce } static func drop(handle: UniFFICallbackHandle) { handleMap.remove(handle: handle) } private static var handleMap = UniFFICallbackHandleMap() } extension FfiConverterCallbackInterfaceEventListener : FfiConverter { typealias SwiftType = EventListener // We can use Handle as the FfiType because it's a typealias to UInt64 typealias FfiType = UniFFICallbackHandle public static func lift(_ handle: UniFFICallbackHandle) throws -> SwiftType { ensureCallbackinitialized(); guard let callback = handleMap.get(handle: handle) else { throw UniffiInternalError.unexpectedStaleHandle } return callback } public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { ensureCallbackinitialized(); let handle: UniFFICallbackHandle = try readInt(&buf) return try lift(handle) } public static func lower(_ v: SwiftType) -> UniFFICallbackHandle { ensureCallbackinitialized(); return handleMap.insert(obj: v) } public static func write(_ v: SwiftType, into buf: inout [UInt8]) { ensureCallbackinitialized(); writeInt(&buf, lower(v)) } } fileprivate struct FfiConverterOptionString: FfiConverterRustBuffer { typealias SwiftType = String? public static func write(_ value: SwiftType, into buf: inout [UInt8]) { guard let value = value else { writeInt(&buf, Int8(0)) return } writeInt(&buf, Int8(1)) FfiConverterString.write(value, into: &buf) } public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { switch try readInt(&buf) as Int8 { case 0: return nil case 1: return try FfiConverterString.read(from: &buf) default: throw UniffiInternalError.unexpectedOptionalTag } } } fileprivate struct FfiConverterSequenceString: FfiConverterRustBuffer { typealias SwiftType = [String] public static func write(_ value: [String], into buf: inout [UInt8]) { let len = Int32(value.count) writeInt(&buf, len) for item in value { FfiConverterString.write(item, into: &buf) } } public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String] { let len: Int32 = try readInt(&buf) var seq = [String]() seq.reserveCapacity(Int(len)) for _ in 0 ..< len { seq.append(try FfiConverterString.read(from: &buf)) } return seq } } public func auth(url: String, secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_auth( FfiConverterString.lower(url), FfiConverterString.lower(secretKey),$0) } ) } public func createRecoveryFile(secretKey: String, passphrase: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_create_recovery_file( FfiConverterString.lower(secretKey), FfiConverterString.lower(passphrase),$0) } ) } public func decryptRecoveryFile(recoveryFile: String, passphrase: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_decrypt_recovery_file( FfiConverterString.lower(recoveryFile), FfiConverterString.lower(passphrase),$0) } ) } public func deleteFile(url: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_delete_file( FfiConverterString.lower(url),$0) } ) } public func generateSecretKey() -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_generate_secret_key($0) } ) } public func get(url: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_get( FfiConverterString.lower(url),$0) } ) } public func getPublicKeyFromSecretKey(secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_get_public_key_from_secret_key( FfiConverterString.lower(secretKey),$0) } ) } public func getSignupToken(homeserverPubky: String, adminPassword: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_get_signup_token( FfiConverterString.lower(homeserverPubky), FfiConverterString.lower(adminPassword),$0) } ) } public func list(url: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_list( FfiConverterString.lower(url),$0) } ) } public func parseAuthUrl(url: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_parse_auth_url( FfiConverterString.lower(url),$0) } ) } public func publish(recordName: String, recordContent: String, secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_publish( FfiConverterString.lower(recordName), FfiConverterString.lower(recordContent), FfiConverterString.lower(secretKey),$0) } ) } public func publishHttps(recordName: String, target: String, secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_publish_https( FfiConverterString.lower(recordName), FfiConverterString.lower(target), FfiConverterString.lower(secretKey),$0) } ) } public func put(url: String, content: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_put( FfiConverterString.lower(url), FfiConverterString.lower(content),$0) } ) } public func removeEventListener() { try! rustCall() { uniffi_pubkycore_fn_func_remove_event_listener($0) } } public func republishHomeserver(secretKey: String, homeserver: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_republish_homeserver( FfiConverterString.lower(secretKey), FfiConverterString.lower(homeserver),$0) } ) } public func resolve(publicKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_resolve( FfiConverterString.lower(publicKey),$0) } ) } public func resolveHttps(publicKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_resolve_https( FfiConverterString.lower(publicKey),$0) } ) } public func session(pubky: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_session( FfiConverterString.lower(pubky),$0) } ) } public func setEventListener(listener: EventListener) { try! rustCall() { uniffi_pubkycore_fn_func_set_event_listener( FfiConverterCallbackInterfaceEventListener.lower(listener),$0) } } public func signIn(secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_sign_in( FfiConverterString.lower(secretKey),$0) } ) } public func signOut(secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_sign_out( FfiConverterString.lower(secretKey),$0) } ) } public func signUp(secretKey: String, homeserver: String, signupToken: String?) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_sign_up( FfiConverterString.lower(secretKey), FfiConverterString.lower(homeserver), FfiConverterOptionString.lower(signupToken),$0) } ) } public func switchNetwork(useTestnet: Bool) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall() { uniffi_pubkycore_fn_func_switch_network( FfiConverterBool.lower(useTestnet),$0) } ) } private enum InitializationResult { case ok case contractVersionMismatch case apiChecksumMismatch } // Use a global variables to perform the versioning checks. Swift ensures that // the code inside is only computed once. private var initializationResult: InitializationResult { // Get the bindings contract version from our ComponentInterface let bindings_contract_version = 24 // Get the scaffolding contract version by calling the into the dylib let scaffolding_contract_version = ffi_pubkycore_uniffi_contract_version() if bindings_contract_version != scaffolding_contract_version { return InitializationResult.contractVersionMismatch } if (uniffi_pubkycore_checksum_func_auth() != 51826) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_create_recovery_file() != 48846) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_decrypt_recovery_file() != 26407) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_delete_file() != 9063) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_generate_secret_key() != 12800) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_get() != 6591) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_get_public_key_from_secret_key() != 40316) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_get_signup_token() != 47927) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_list() != 43198) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_parse_auth_url() != 27379) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_publish() != 48989) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_publish_https() != 5614) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_put() != 48150) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_remove_event_listener() != 23534) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_republish_homeserver() != 63919) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_resolve() != 34317) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_resolve_https() != 17266) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_session() != 59795) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_set_event_listener() != 60071) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_sign_in() != 21584) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_sign_out() != 34903) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_sign_up() != 48789) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_func_switch_network() != 64215) { return InitializationResult.apiChecksumMismatch } if (uniffi_pubkycore_checksum_method_eventlistener_on_event_occurred() != 11531) { return InitializationResult.apiChecksumMismatch } return InitializationResult.ok } private func uniffiEnsureInitialized() { switch initializationResult { case .ok: break case .contractVersionMismatch: fatalError("UniFFI contract version mismatch: try cleaning and rebuilding your project") case .apiChecksumMismatch: fatalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } }