nodex_api/value/name/
string.rs1use 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 #[inline]
15 pub fn new(env: NapiEnv, value: impl AsRef<str>) -> NapiResult<JsString> {
16 Self::utf8(env, value)
17 }
18
19 #[inline]
21 pub fn get(&self) -> NapiResult<String> {
22 self.get_utf8()
23 }
24
25 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 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 size + 1,
56 );
57
58 unsafe {
59 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}