| Crates.io | value-box |
| lib.rs | value-box |
| version | 2.3.3 |
| created_at | 2022-10-21 12:46:01.914095+00 |
| updated_at | 2024-03-13 08:10:17.878587+00 |
| description | Allows developers to pass Rust-allocated structures over ffi. |
| homepage | |
| repository | https://github.com/feenkcom/boxes-rs/tree/main/value-box |
| max_upload_size | |
| id | 693501 |
| size | 31,192 |
ValueBox allows developers to pass Rust-allocated structures over ffi.
The value-box crate handles most typical use-cases when creating ffi bindings to rust libraries such as:
Box<dyn MyTrait>.ValueBox is defined as #[transparent]Error and Result.use value_box::{ReturnBoxerResult, ValueBox, ValueBoxPointer};
#[no_mangle]
pub fn library_object_create() -> *mut ValueBox<MyObject> {
ValueBox::new(MyObject::new()).into_raw()
}
#[no_mangle]
pub fn library_object_is_something(object: *mut ValueBox<MyObject>) -> bool {
object
// with_ref_ok() wraps the returned value into Result:Ok,
// hence the name
.with_ref_ok(|object| object.is_something())
.unwrap_or(false)
}
#[no_mangle]
pub fn library_object_try_something(object: *mut ValueBox<MyObject>) {
object
// with_ref() expects the closure to return a Result
.with_ref(|object| object.try_something())
.log();
}
#[no_mangle]
pub fn library_object_by_ref(object: *mut ValueBox<MyObject>) {
object.with_ref_ok(|object| object.by_ref()).log();
}
#[no_mangle]
pub fn library_object_by_mut(object: *mut ValueBox<MyObject>) {
object.with_mut_ok(|mut object| object.by_mut()).log();
}
#[no_mangle]
pub fn library_object_by_value(object: *mut ValueBox<MyObject>) {
object.take_value().map(|object| object.by_value()).log();
}
#[no_mangle]
pub fn library_object_by_value_clone(object: *mut ValueBox<MyObject>) {
object
.with_clone_ok(|object| object.by_value())
.log();
}
#[no_mangle]
pub fn library_object_release(object: *mut ValueBox<MyObject>) {
object.release();
}
#[derive(Debug, Clone)]
pub struct MyObject {}
impl MyObject {
pub fn new() -> Self {
Self {}
}
pub fn by_ref(&self) {}
pub fn by_mut(&mut self) {}
pub fn by_value(self) {}
pub fn is_something(&self) -> bool {
true
}
pub fn try_something(&self) -> Result<()> {
Ok(())
}
}