napi/js_values/string/
utf8.rs1use 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}