3 个版本
0.0.3 | 2022年6月6日 |
---|---|
0.0.2 | 2022年5月30日 |
0.0.1 | 2022年4月30日 |
#4 在 #gem
5KB
68 代码行
Coffret
MRI C API 的华丽包装。
旨在成为 nix
用于 Ruby gem 开发的工具。
示例
之前
use rb_sys::*;
fn test_show_self() // ...
#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn Init_hi_rust() {
let name = CString::new("Rust").unwrap();
let object = unsafe { rb_cObject };
let klass = unsafe { rb_define_class(name.as_ptr(), object) };
let function_name = CString::new("mostrarme").unwrap();
let callback = unsafe {
std::mem::transmute::<unsafe extern "C" fn(VALUE) -> VALUE, unsafe extern "C" fn() -> VALUE>(
test_show_self,
)
};
unsafe { rb_define_method(klass, function_name.as_ptr(), Some(callback), 0) }
}
之后
use coffret::class;
use coffret::exception;
fn test_show_self() // ...
fn init_hi_rust_internal() -> Result<(), Box<dyn Error>> {
let object = class::object_class();
let klass = class::define_class("Rust", object);
let callback = class::make_callback(&test_show_self);
class::define_method(klass, "mostrarme", callback, 0);
Ok(())
}
#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn Init_hi_rust() {
match init_hi_rust_internal() {
// Rust Error to Ruby's Exception. Isn't it cool?
Err(e) => exception::rustly_raise(e.as_ref()),
Ok(_) => {}
}
}
MRI 有很多 API,因此目前正在建设中,并欢迎任何 Pull/Requests。
许可证
MIT.
依赖项
~0.1–2.4MB
~39K SLoC