rustler 0.37.3

Safe Rust wrappers for creating Erlang NIF functions
Documentation
pub(crate) use crate::sys::ErlNifBinary;
use crate::{
    sys::{enif_alloc_binary, enif_make_new_binary, enif_realloc_binary},
    wrapper::size_t,
    Env, Term,
};
use std::mem::MaybeUninit;

pub use crate::sys::enif_make_sub_binary as make_subbinary;

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

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

pub unsafe fn new_binary(env: Env, size: size_t) -> (*mut u8, Term) {
    let mut term = MaybeUninit::uninit();
    let buf = enif_make_new_binary(env.as_c_arg(), size, term.as_mut_ptr());
    if buf.is_null() {
        panic!("enif_make_new_binary: allocation failed");
    }
    (buf, Term::new(env, term.assume_init()))
}