nj_core/
property.rs

1use std::ptr;
2use std::ffi::CString;
3
4use crate::sys::napi_property_descriptor;
5use crate::sys::napi_property_attributes_napi_default;
6use crate::sys::napi_callback_raw;
7use crate::sys::napi_callback;
8
9#[derive(Debug, Clone)]
10pub struct Property {
11    name: CString,
12    method: napi_callback,
13    getter: napi_callback,
14    setter: napi_callback,
15}
16
17impl Property {
18    pub fn new(name: &str) -> Self {
19        Self {
20            name: CString::new(name).expect("c-string should not fail"),
21            method: None,
22            getter: None,
23            setter: None,
24        }
25    }
26
27    pub fn method(mut self, method: napi_callback_raw) -> Self {
28        self.method = Some(method);
29        self
30    }
31
32    pub fn getter(mut self, getter: napi_callback_raw) -> Self {
33        self.getter = Some(getter);
34        self
35    }
36
37    pub fn setter(mut self, setter: napi_callback_raw) -> Self {
38        self.setter = Some(setter);
39        self
40    }
41
42    pub fn as_raw_property(&self) -> napi_property_descriptor {
43        napi_property_descriptor {
44            utf8name: self.name.as_ptr(),
45            name: ptr::null_mut(),
46            method: self.method,
47            getter: self.getter,
48            setter: self.setter,
49            value: ptr::null_mut(),
50            attributes: napi_property_attributes_napi_default,
51            data: ptr::null_mut(),
52        }
53    }
54}
55
56#[derive(Default, Debug)]
57pub struct PropertiesBuilder(Vec<Property>);
58
59impl PropertiesBuilder {
60    pub fn new() -> Self {
61        Self::default()
62    }
63
64    pub fn append(mut self, property: Property) -> Self {
65        self.0.push(property);
66        self
67    }
68
69    pub fn mut_append(&mut self, property: Property) {
70        self.0.push(property);
71    }
72
73    // define into env
74    pub fn as_raw_properties(&self) -> Vec<napi_property_descriptor> {
75        self.0.iter().map(|p| p.as_raw_property()).collect()
76    }
77}
78
79impl From<Vec<Property>> for PropertiesBuilder {
80    fn from(properties: Vec<Property>) -> Self {
81        Self(properties)
82    }
83}