Skip to main content

napi/js_values/string/
utf8.rs

1use std::convert::TryFrom;
2use std::str;
3
4use crate::{bindgen_prelude::ToNapiValue, sys, Error, JsString, Result, Status};
5
6pub struct JsStringUtf8<'env> {
7  pub(crate) inner: JsString<'env>,
8  pub(crate) buf: Vec<u8>,
9}
10
11impl<'env> JsStringUtf8<'env> {
12  pub fn as_str(&self) -> Result<&str> {
13    str::from_utf8(self.buf.as_slice())
14      .map_err(|err| Error::new(Status::InvalidArg, err.to_string()))
15  }
16
17  pub fn as_slice(&self) -> &[u8] {
18    self.buf.as_slice()
19  }
20
21  pub fn len(&self) -> usize {
22    self.buf.len()
23  }
24
25  pub fn is_empty(&self) -> bool {
26    self.buf.is_empty()
27  }
28
29  pub fn into_owned(self) -> Result<String> {
30    Ok(unsafe { String::from_utf8_unchecked(self.buf.to_vec()) })
31  }
32
33  pub fn take(self) -> Vec<u8> {
34    self.buf.to_vec()
35  }
36
37  pub fn into_value(self) -> JsString<'env> {
38    self.inner
39  }
40}
41
42impl TryFrom<JsStringUtf8<'_>> for String {
43  type Error = Error;
44
45  fn try_from(value: JsStringUtf8) -> Result<String> {
46    value.into_owned()
47  }
48}
49
50impl From<JsStringUtf8<'_>> for Vec<u8> {
51  fn from(value: JsStringUtf8) -> Self {
52    value.take()
53  }
54}
55
56impl ToNapiValue for JsStringUtf8<'_> {
57  unsafe fn to_napi_value(_: sys::napi_env, val: JsStringUtf8) -> Result<sys::napi_value> {
58    Ok(val.inner.0.value)
59  }
60}