yuuang_test_napi/js_values/
buffer.rs

1use std::mem;
2use std::ops::{Deref, DerefMut};
3use std::ptr;
4
5use super::Value;
6#[cfg(feature = "serde-json")]
7use super::ValueType;
8use crate::check_status;
9use crate::{sys, JsUnknown, NapiValue, Ref, Result};
10
11pub struct JsBuffer(pub(crate) Value);
12
13pub struct JsBufferValue {
14  pub(crate) value: JsBuffer,
15  data: mem::ManuallyDrop<Vec<u8>>,
16}
17
18impl JsBuffer {
19  #[inline]
20  pub fn into_value(self) -> Result<JsBufferValue> {
21    let mut data = ptr::null_mut();
22    let mut len: usize = 0;
23    check_status!(unsafe {
24      sys::napi_get_buffer_info(self.0.env, self.0.value, &mut data, &mut len)
25    })?;
26    Ok(JsBufferValue {
27      data: mem::ManuallyDrop::new(unsafe { Vec::from_raw_parts(data as *mut _, len, len) }),
28      value: self,
29    })
30  }
31
32  #[inline]
33  pub fn into_ref(self) -> Result<Ref<JsBufferValue>> {
34    Ref::new(self.0, 1, self.into_value()?)
35  }
36}
37
38impl JsBufferValue {
39  #[cfg(feature = "serde-json")]
40  #[inline]
41  pub(crate) fn from_raw(env: sys::napi_env, value: sys::napi_value) -> Result<Self> {
42    let mut data = ptr::null_mut();
43    let mut len = 0usize;
44    check_status!(unsafe {
45      sys::napi_get_buffer_info(env, value, &mut data, &mut len as *mut usize as *mut _)
46    })?;
47    Ok(Self {
48      value: JsBuffer(Value {
49        env,
50        value,
51        value_type: ValueType::Object,
52      }),
53      data: mem::ManuallyDrop::new(unsafe { Vec::from_raw_parts(data as *mut _, len, len) }),
54    })
55  }
56
57  #[inline]
58  pub fn new(value: JsBuffer, data: mem::ManuallyDrop<Vec<u8>>) -> Self {
59    JsBufferValue { value, data }
60  }
61
62  #[inline]
63  pub fn into_raw(self) -> JsBuffer {
64    self.value
65  }
66
67  #[inline]
68  pub fn into_unknown(self) -> JsUnknown {
69    unsafe { JsUnknown::from_raw_unchecked(self.value.0.env, self.value.0.value) }
70  }
71}
72
73impl AsRef<[u8]> for JsBufferValue {
74  fn as_ref(&self) -> &[u8] {
75    self.data.as_slice()
76  }
77}
78
79impl AsMut<[u8]> for JsBufferValue {
80  fn as_mut(&mut self) -> &mut [u8] {
81    self.data.as_mut_slice()
82  }
83}
84
85impl Deref for JsBufferValue {
86  type Target = [u8];
87
88  fn deref(&self) -> &[u8] {
89    self.data.as_slice()
90  }
91}
92
93impl DerefMut for JsBufferValue {
94  fn deref_mut(&mut self) -> &mut Self::Target {
95    self.data.as_mut_slice()
96  }
97}