1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
use std::ptr; use std::slice; use env::NapiEnv; use result::{NapiError, NapiResult}; use sys; use super::{AsNapiObject, NapiAny, NapiString, NapiValue}; #[derive(Debug)] pub struct NapiArrayBuffer<'env, 'buf> { value: sys::napi_value, data: &'buf mut [u8], env: &'env NapiEnv, } impl<'env, 'buf> NapiArrayBuffer<'env, 'buf> { pub fn new(env: &'env NapiEnv, len: usize) -> NapiResult<Self> { let mut value = ptr::null_mut(); let mut data = ptr::null_mut(); env.handle_status(unsafe { sys::napi_create_arraybuffer( env.as_sys_env(), len, &mut data, &mut value, ) })?; Ok(Self { value, data: unsafe { slice::from_raw_parts_mut(data as *mut u8, len) }, env, }) } pub fn len(&self) -> usize { self.data.len() } pub fn is_empty(&self) -> bool { self.data.is_empty() } } impl<'env, 'buf> NapiValue<'env> for NapiArrayBuffer<'env, 'buf> { fn as_sys_value(&self) -> sys::napi_value { self.value } fn env(&self) -> &'env NapiEnv { self.env } fn from_sys_checked( env: &'env NapiEnv, value: sys::napi_value, ) -> NapiResult<Self> { if !NapiAny::with_value(env, value).is_arraybuffer()? { let message = NapiString::from_str(env, "ArrayBuffer expected")?; return Err(NapiError::type_error(env, &message)); } let mut data = ptr::null_mut(); let mut len = 0; env.handle_status(unsafe { sys::napi_get_arraybuffer_info( env.as_sys_env(), value, &mut data, &mut len, ) })?; Ok(Self { env, value, data: unsafe { slice::from_raw_parts_mut(data as *mut u8, len) }, }) } } impl<'env, 'buf> AsNapiObject<'env> for NapiArrayBuffer<'env, 'buf> {} impl<'env, 'buf> AsRef<[u8]> for NapiArrayBuffer<'env, 'buf> { fn as_ref(&self) -> &[u8] { self.data } } impl<'env, 'buf> AsMut<[u8]> for NapiArrayBuffer<'env, 'buf> { fn as_mut(&mut self) -> &mut [u8] { self.data } }