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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
use std::mem; use std::ptr; use crate::{check_status, sys, Result, Value}; pub use latin1::JsStringLatin1; pub use utf16::JsStringUtf16; pub use utf8::JsStringUtf8; mod latin1; mod utf16; mod utf8; #[derive(Clone, Copy)] pub struct JsString(pub(crate) Value); impl JsString { #[inline] pub fn utf8_len(&self) -> Result<usize> { let mut length = 0; check_status!(unsafe { sys::napi_get_value_string_utf8(self.0.env, self.0.value, ptr::null_mut(), 0, &mut length) })?; Ok(length as usize) } #[inline] pub fn utf16_len(&self) -> Result<usize> { let mut length = 0; check_status!(unsafe { sys::napi_get_value_string_utf16(self.0.env, self.0.value, ptr::null_mut(), 0, &mut length) })?; Ok(length as usize) } #[inline] pub fn latin1_len(&self) -> Result<usize> { let mut length = 0; check_status!(unsafe { sys::napi_get_value_string_latin1(self.0.env, self.0.value, ptr::null_mut(), 0, &mut length) })?; Ok(length as usize) } #[inline] pub fn into_utf8(self) -> Result<JsStringUtf8> { let mut written_char_count = 0; let len = self.utf8_len()? + 1; let mut result = Vec::with_capacity(len); let buf_ptr = result.as_mut_ptr(); check_status!(unsafe { sys::napi_get_value_string_utf8( self.0.env, self.0.value, buf_ptr, len, &mut written_char_count, ) })?; mem::forget(result); Ok(JsStringUtf8 { inner: self, buf: mem::ManuallyDrop::new(unsafe { Vec::from_raw_parts(buf_ptr, written_char_count, written_char_count) }), }) } #[inline] pub fn into_utf16(self) -> Result<JsStringUtf16> { let mut written_char_count = 0usize; let len = self.utf16_len()? + 1; let mut result = Vec::with_capacity(len); let buf_ptr = result.as_mut_ptr(); check_status!(unsafe { sys::napi_get_value_string_utf16( self.0.env, self.0.value, buf_ptr, len, &mut written_char_count, ) })?; mem::forget(result); Ok(JsStringUtf16 { inner: self, buf: mem::ManuallyDrop::new(unsafe { Vec::from_raw_parts(buf_ptr, written_char_count, written_char_count) }), }) } #[inline] pub fn into_latin1(self) -> Result<JsStringLatin1> { let mut written_char_count = 0usize; let len = self.latin1_len()? + 1; let mut result = Vec::with_capacity(len); let buf_ptr = result.as_mut_ptr(); check_status!(unsafe { sys::napi_get_value_string_latin1( self.0.env, self.0.value, buf_ptr, len, &mut written_char_count, ) })?; mem::forget(result); Ok(JsStringLatin1 { inner: self, buf: mem::ManuallyDrop::new(unsafe { Vec::from_raw_parts(buf_ptr as *mut _, written_char_count, written_char_count) }), }) } }