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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
use std::mem; use std::ptr; use super::Value; use crate::check_status; use crate::{sys, Ref, Result}; 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_utf8_ref(self) -> Result<Ref<JsStringUtf8>> { Ref::new(self.0, 1, self.into_utf8()?) } #[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_utf16_ref(self) -> Result<Ref<JsStringUtf16>> { Ref::new(self.0, 1, self.into_utf16()?) } #[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) }), }) } #[inline] pub fn into_latin1_ref(self) -> Result<Ref<JsStringLatin1>> { Ref::new(self.0, 1, self.into_latin1()?) } }