nodex_api/value/name/
string.rs

1use crate::{api, prelude::*};
2use std::borrow::Cow;
3use std::mem::MaybeUninit;
4
5#[derive(Copy, Clone, Debug)]
6pub struct JsString(pub(crate) JsValue);
7
8impl JsString {
9    pub(crate) fn from_value(value: JsValue) -> JsString {
10        JsString(value)
11    }
12
13    /// Default js-string constructor.
14    #[inline]
15    pub fn new(env: NapiEnv, value: impl AsRef<str>) -> NapiResult<JsString> {
16        Self::utf8(env, value)
17    }
18
19    /// Default js-string getter.
20    #[inline]
21    pub fn get(&self) -> NapiResult<String> {
22        self.get_utf8()
23    }
24
25    /// This API creates a JavaScript string value from a UTF8-encoded C string. The native string is copied.
26    /// The JavaScript string type is described in Section 6.1.4 of the ECMAScript Language Specification.
27    pub fn utf8(env: NapiEnv, value: impl AsRef<str>) -> NapiResult<JsString> {
28        let value = napi_call!(
29            =napi_create_string_utf8,
30            env,
31            value.as_ref().as_ptr() as *const _,
32            value.as_ref().len(),
33        );
34
35        Ok(JsString(JsValue::from_raw(env, value)))
36    }
37
38    /// This API returns the UTF8-encoded string corresponding the value passed in.
39    pub fn get_utf8(&self) -> NapiResult<String> {
40        let size = napi_call!(
41            =napi_get_value_string_utf8,
42            self.env(),
43            self.raw(),
44            std::ptr::null_mut(),
45            0,
46        );
47
48        let mut buffer = vec![0u8; size + 1];
49        let size = napi_call!(
50            =napi_get_value_string_utf8,
51            self.env(),
52            self.raw(),
53            buffer.as_mut_ptr() as *mut _,
54            // should contains the NULL terminator
55            size + 1,
56        );
57
58        unsafe {
59            // remove trailing NULL
60            buffer.set_len(size);
61            Ok(String::from_utf8_unchecked(buffer))
62        }
63    }
64}
65
66napi_value_t!(JsString);
67
68impl From<JsString> for String {
69    fn from(js: JsString) -> String {
70        js.get_utf8().unwrap()
71    }
72}
73
74impl NapiValueCheck for JsString {
75    fn check(&self) -> NapiResult<bool> {
76        Ok(self.kind()? == NapiValuetype::String)
77    }
78}