#ffi #value #box #structures #pass #error #bindings

value-box

允许开发者在ffi中传递Rust分配的结构体

17个稳定版本

2.3.3 2024年3月13日
2.3.2 2023年3月10日
2.3.0 2023年2月7日
2.2.3 2023年1月26日
1.1.1 2022年10月30日

#317 in Rust模式

30 每月下载量
用于 2 crates

MIT 许可证

30KB
694

ValueBox

Crates.io MIT licensed

ValueBox 允许开发者通过ffi传递Rust分配的结构体。The value-box crate处理了创建ffi绑定到Rust库(如

  • 返回新分配的Rust结构体,并将所有权传递给调用者。
  • 接收之前创建的价值盒并调用关联函数,通过引用、可变引用、克隆值或获取值来处理Rust结构体。
  • 最后,丢弃包含Rust结构体的盒子。
  • 支持 Box<dyn MyTrait>
  • ValueBox 被定义为 #[transparent]
  • 通过自定义 ErrorResult 进行错误处理。

示例

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(())
    }
}

依赖

~0.4–6.5MB
~24K SLoC