blob: cdd21acab20b86e3f72f035855f61952207ebaab [file] [view]
# Bridge types as struct fields
## Overview
Crubit does not support exposing struct or union fields with bridge types.
Bridge types are types that are converted at runtime between C++ and Rust
(`std::optional` mapping to `Option`), but have different underlying
representations. (See crubit.rs/types)
If a field is a bridge type, this conversion is impossible: field accesses do
not run any conversion logic, and the field is required to have identical
representation across both languages. As a result, the field will not have the
bridge type conversion applied, but instead will be replaced by an opaque blob
of bytes.
## Example
Consider the following C++ struct:
```c++
#include <optional>
#include <cstdint>
struct Config {
std::optional<int> foo;
};
```
Crubit will treat the `foo` field of `Config` as an opaque blob of bytes that
cannot be accessed directly from Rust.
## Workaround: Add getter and setter methods {#workaround}
To access or modify the field from Rust, you can add getter and setter methods.
Crubit *can* generate bindings for functions that accept or return bridge types
by value.
For example:
```c++
#include <optional>
struct Config {
std::optional<int> foo;
// Getter returning by value (mapped to Option<i32> in Rust)
std::optional<int> get_foo() const { return foo; }
// Setter accepting by value
void set_foo(std::optional<int> val) { foo = val; }
};
```
Then in Rust, you can use these methods:
```rust
let mut config = Config::default();
config.set_foo(Some(42));
assert_eq!(config.get_foo(), Some(42));
```
See crubit.rs/cpp/best_practices#bridging for more information.