yuuang_test_napi/js_values/
buffer.rs1use 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}