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
use crate::{api, prelude::*};
use std::{mem::MaybeUninit, os::raw::c_char};

/// Js Dataview
///
/// * N - Offset
/// * M - Length
#[derive(Copy, Clone, Debug)]
pub struct JsDataView(pub(crate) JsValue);

impl JsDataView {
    pub(crate) fn from_value(value: JsValue) -> JsDataView {
        JsDataView(value)
    }

    /// Any of the out parameters may be NULL if that property is unneeded.
    ///
    /// This API returns various properties of a DataView.
    ///
    /// Info includes (void* data, ArrayBuffer, offset, length)
    pub fn info(&self) -> NapiResult<(DataPointer, JsArrayBuffer, usize, usize)> {
        let mut length = MaybeUninit::uninit();
        let mut data = MaybeUninit::uninit();
        let mut buffer = MaybeUninit::uninit();
        let offset = napi_call!(
            =napi_get_dataview_info,
            self.env(),
            self.raw(),
            length.as_mut_ptr(),
            data.as_mut_ptr(),
            buffer.as_mut_ptr(),
        );
        unsafe {
            let length = length.assume_init();
            let data = data.assume_init();
            let buffer = buffer.assume_init();
            Ok((
                data,
                JsArrayBuffer::from_raw(self.env(), buffer),
                offset,
                length,
            ))
        }
    }
}

napi_value_t!(JsDataView);

impl NapiValueCheck for JsDataView {
    fn check(&self) -> NapiResult<bool> {
        Ok(napi_call!(=napi_is_dataview, self.env(), self.raw()))
    }
}