rustler 0.13.0

Safe Rust wrappers for creating Erlang NIF functions
Documentation
use super::nif_interface;
use super::nif_interface::{ NIF_ENV, NIF_TERM, NIF_BINARY, c_uint };
use ::wrapper::nif_interface::{ size_t, c_void };

use std::mem::uninitialized;

#[repr(C)]
#[derive(Copy, Clone)]
pub struct ErlNifBinary {
    pub size: size_t,
    pub data: *mut u8,
    pub bin_term: NIF_TERM,
    ref_bin: *mut c_void,
}

impl ErlNifBinary {
    pub unsafe fn new_empty() -> Self {
        ErlNifBinary {
            size: uninitialized(),
            data: uninitialized(),
            bin_term: uninitialized(),
            ref_bin: uninitialized(),
        }
    }
    pub fn as_c_arg(&mut self) -> NIF_BINARY {
        (self as *mut ErlNifBinary) as NIF_BINARY
    }
}

pub unsafe fn alloc(size: size_t) -> Option<ErlNifBinary> {
    let mut binary = unsafe {ErlNifBinary::new_empty()};
    let success = unsafe { nif_interface::enif_alloc_binary(size, binary.as_c_arg()) };
    if success == 0 {
        return None;
    }
    Some(binary)
}

pub unsafe fn realloc(binary: &mut ErlNifBinary, size: size_t) -> bool {
    let success = unsafe { nif_interface::enif_realloc_binary(binary.as_c_arg(), size) };
    success != 0
}