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
use std::mem::ManuallyDrop; #[cfg(feature = "latin1")] use encoding_rs; use crate::JsString; #[cfg(feature = "latin1")] use crate::Result; pub struct JsStringLatin1 { pub(crate) inner: JsString, pub(crate) buf: ManuallyDrop<Vec<u8>>, } impl JsStringLatin1 { #[inline] pub fn as_slice(&self) -> &[u8] { &self.buf } #[inline] pub fn len(&self) -> usize { self.buf.len() } #[inline] pub fn is_empty(&self) -> bool { self.buf.is_empty() } #[inline] pub fn take(self) -> Vec<u8> { self.as_slice().to_vec() } #[inline] pub fn into_value(self) -> JsString { self.inner } #[cfg(feature = "latin1")] #[inline] pub fn into_latin1_string(self) -> Result<String> { let mut dst_str = unsafe { String::from_utf8_unchecked(vec![0; self.len() * 2 + 1]) }; encoding_rs::mem::convert_latin1_to_str(self.buf.as_slice(), dst_str.as_mut_str()); Ok(dst_str) } } impl From<JsStringLatin1> for Vec<u8> { fn from(value: JsStringLatin1) -> Self { value.take() } }