napi_h/js_values/string/
utf16.rs

1use std::convert::TryFrom;
2use std::ops::Deref;
3
4use crate::{Error, JsString, Result, Status};
5
6pub struct JsStringUtf16 {
7  pub(crate) inner: JsString,
8  pub(crate) buf: Vec<u16>,
9}
10
11impl JsStringUtf16 {
12  pub fn as_str(&self) -> Result<String> {
13    if let Some((_, prefix)) = self.as_slice().split_last() {
14      String::from_utf16(prefix).map_err(|e| Error::new(Status::InvalidArg, format!("{}", e)))
15    } else {
16      Ok(String::new())
17    }
18  }
19
20  pub fn as_slice(&self) -> &[u16] {
21    self.buf.as_slice()
22  }
23
24  pub fn len(&self) -> usize {
25    self.buf.len()
26  }
27
28  pub fn is_empty(&self) -> bool {
29    self.buf.is_empty()
30  }
31
32  pub fn into_value(self) -> JsString {
33    self.inner
34  }
35}
36
37impl TryFrom<JsStringUtf16> for String {
38  type Error = Error;
39
40  fn try_from(value: JsStringUtf16) -> Result<String> {
41    value.as_str()
42  }
43}
44
45impl Deref for JsStringUtf16 {
46  type Target = [u16];
47
48  fn deref(&self) -> &[u16] {
49    self.buf.as_slice()
50  }
51}
52
53impl AsRef<Vec<u16>> for JsStringUtf16 {
54  fn as_ref(&self) -> &Vec<u16> {
55    &self.buf
56  }
57}
58
59impl From<JsStringUtf16> for Vec<u16> {
60  fn from(value: JsStringUtf16) -> Self {
61    value.as_slice().to_vec()
62  }
63}