value-box

Crates.iovalue-box
lib.rsvalue-box
version2.3.3
sourcesrc
created_at2022-10-21 12:46:01.914095
updated_at2024-03-13 08:10:17.878587
descriptionAllows developers to pass Rust-allocated structures over ffi.
homepage
repositoryhttps://github.com/feenkcom/boxes-rs/tree/main/value-box
max_upload_size
id693501
size31,192
Aliaksei Syrel (syrel)

documentation

README

ValueBox

Crates.io MIT licensed

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:

  • Return newly allocated Rust structures passing ownership to the caller.
  • Receiving the previously created value box and calling associated functions taking the rust structure by reference, mutable reference, cloning the value or taking the value.
  • Finally, dropping the box with the Rust structure in it.
  • Supports Box<dyn MyTrait>.
  • ValueBox is defined as #[transparent]
  • Error handling via custom Error and Result.

Example:

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(())
    }
}
Commit count: 0

cargo fmt