This crate provides the small amount of runtime code that is required by the generated uniffi component scaffolding in order to transfer data back and forth across the C-style FFI layer, as well as some utilities for testing the generated bindings.
The key concept here is the
FfiConverter trait, which is responsible for converting between
a Rust type and a low-level C-style type that can be passed across the FFI:
- How to represent values of the Rust type in the low-level C-style type system of the FFI layer.
- How to “lower” values of the Rust type into an appropriate low-level FFI value.
- How to “lift” low-level FFI values back into values of the Rust type.
- How to write values of the Rust type into a buffer, for cases where they are part of a compound data structure that is serialized for transfer.
- How to read values of the Rust type from buffer, for cases where they are received as part of a compound data structure that was serialized for transfer.
This logic encapsulates the Rust-side handling of data transfer. Each foreign-language binding must also implement a matching set of data-handling rules for each data type.
In addition to the core
FfiConverter trait, we provide a handful of struct definitions useful
for passing core rust types over the FFI, such as
Assert that the uniffi runtime version matches an expected value.
Trait defining how to transfer values via the FFI layer.
A helper trait to implement lowering/lifting using a
Check whether the uniffi runtime version is compatible a given uniffi_bindgen version.
A helper function to ensure we don’t read past the end of a buffer.