Sha256: 18b4dfd3420b3b344769eec10c29904a92100a88bf902ccdcd7792f0eac6a59e

Contents?: true

Size: 1.58 KB

Versions: 23

Compression:

Stored size: 1.58 KB

Contents

extern crate rb_sys;

use rb_sys::{
    rb_define_module, rb_define_module_function, rb_string_value_cstr, rb_utf8_str_new, VALUE,
};
use std::ffi::{CStr, CString};
use std::os::raw::{c_char, c_long};

#[inline]
unsafe fn cstr_to_string(str: *const c_char) -> String {
    CStr::from_ptr(str).to_string_lossy().into_owned()
}

#[no_mangle]
unsafe extern "C" fn pub_reverse(_klass: VALUE, mut input: VALUE) -> VALUE {
    let ruby_string = cstr_to_string(rb_string_value_cstr(&mut input));
    let reversed = ruby_string.to_string().chars().rev().collect::<String>();
    let reversed_cstring = CString::new(reversed).unwrap();
    let size = ruby_string.len() as c_long;

    rb_utf8_str_new(reversed_cstring.as_ptr(), size)
}

#[cfg(rubygems)]
#[no_mangle]
pub extern "C" fn hello_from_rubygems() {}

#[cfg(rubygems_0_0_0)]
#[no_mangle]
pub extern "C" fn should_never_exist() {}

#[cfg(rubygems_x_x_x)]
#[no_mangle]
pub extern "C" fn hello_from_rubygems_version() {}

#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn Init_rust_ruby_example() {
    let name = CString::new("RustRubyExample").unwrap();
    let function_name = CString::new("reverse").unwrap();
    // bindgen does not properly detect the arity of the ruby callback function, so we have to transmute
    let callback = unsafe {
        std::mem::transmute::<
            unsafe extern "C" fn(VALUE, VALUE) -> VALUE,
            unsafe extern "C" fn() -> VALUE,
        >(pub_reverse)
    };
    let klass = unsafe { rb_define_module(name.as_ptr()) };

    unsafe { rb_define_module_function(klass, function_name.as_ptr(), Some(callback), 1) }
}

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
rubygems-update-3.4.22 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.21 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.20 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.19 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.18 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.17 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.16 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.15 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.14 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.13 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.12 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.11 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.10 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.9 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.8 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.7 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.6 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.5 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.4 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs
rubygems-update-3.4.3 test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs