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 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}