commit
efb590447e
2 changed files with 52 additions and 15 deletions
|
@ -9,6 +9,7 @@ use std::ops::{Deref, DerefMut};
|
||||||
use std::os::raw::{c_char, c_void};
|
use std::os::raw::{c_char, c_void};
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
use std::str;
|
||||||
use std::string::String as RustString;
|
use std::string::String as RustString;
|
||||||
|
|
||||||
mod call_context;
|
mod call_context;
|
||||||
|
@ -53,7 +54,7 @@ pub enum Number {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct String;
|
pub struct JsString;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct Object;
|
pub struct Object;
|
||||||
|
@ -169,7 +170,7 @@ impl Error {
|
||||||
impl From<std::ffi::NulError> for Error {
|
impl From<std::ffi::NulError> for Error {
|
||||||
fn from(_error: std::ffi::NulError) -> Self {
|
fn from(_error: std::ffi::NulError) -> Self {
|
||||||
Error {
|
Error {
|
||||||
status: Status::StringContainsNull,
|
status: Status::StringExpected,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -236,7 +237,7 @@ impl Env {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_string<'a, 'b>(&'a self, s: &'b str) -> Result<Value<'a, String>> {
|
pub fn create_string<'a, 'b>(&'a self, s: &'b str) -> Result<Value<'a, JsString>> {
|
||||||
let mut raw_value = ptr::null_mut();
|
let mut raw_value = ptr::null_mut();
|
||||||
let status = unsafe {
|
let status = unsafe {
|
||||||
sys::napi_create_string_utf8(
|
sys::napi_create_string_utf8(
|
||||||
|
@ -247,16 +248,16 @@ impl Env {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
check_status(status)?;
|
check_status(status)?;
|
||||||
Ok(Value::from_raw_value(self, raw_value, String))
|
Ok(Value::from_raw_value(self, raw_value, JsString))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_string_utf16<'a, 'b>(&'a self, chars: &[u16]) -> Result<Value<'a, String>> {
|
pub fn create_string_utf16(&self, chars: &[u16]) -> Result<Value<JsString>> {
|
||||||
let mut raw_value = ptr::null_mut();
|
let mut raw_value = ptr::null_mut();
|
||||||
let status = unsafe {
|
let status = unsafe {
|
||||||
sys::napi_create_string_utf16(self.0, chars.as_ptr(), chars.len() as u64, &mut raw_value)
|
sys::napi_create_string_utf16(self.0, chars.as_ptr(), chars.len() as u64, &mut raw_value)
|
||||||
};
|
};
|
||||||
check_status(status)?;
|
check_status(status)?;
|
||||||
Ok(Value::from_raw_value(self, raw_value, String))
|
Ok(Value::from_raw_value(self, raw_value, JsString))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_object<'a>(&'a self) -> Result<Value<'a, Object>> {
|
pub fn create_object<'a>(&'a self) -> Result<Value<'a, Object>> {
|
||||||
|
@ -386,6 +387,12 @@ impl Env {
|
||||||
Ok(Value::from_raw_value(self, raw_result, Function))
|
Ok(Value::from_raw_value(self, raw_result, Function))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn throw_error(&self, msg: &str) -> Result<()> {
|
||||||
|
let status = unsafe { sys::napi_throw_error(self.0, ptr::null(), msg.as_ptr() as *const _) };
|
||||||
|
check_status(status)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn create_reference<T>(&self, value: &Value<T>) -> Result<Ref<T>> {
|
pub fn create_reference<T>(&self, value: &Value<T>) -> Result<Ref<T>> {
|
||||||
let mut raw_ref = ptr::null_mut();
|
let mut raw_ref = ptr::null_mut();
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -606,9 +613,9 @@ impl ValueType for Number {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ValueType for String {
|
impl ValueType for JsString {
|
||||||
fn from_raw(_env: sys::napi_env, _raw: sys::napi_value) -> Result<Self> {
|
fn from_raw(_env: sys::napi_env, _raw: sys::napi_value) -> Result<Self> {
|
||||||
Ok(String {})
|
Ok(JsString {})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn matches_raw_type(env: sys::napi_env, raw: sys::napi_value) -> bool {
|
fn matches_raw_type(env: sys::napi_env, raw: sys::napi_value) -> bool {
|
||||||
|
@ -724,7 +731,7 @@ impl<'env, T: ValueType> Value<'env, T> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn coerce_to_string(self) -> Result<Value<'env, String>> {
|
pub fn coerce_to_string(self) -> Result<Value<'env, JsString>> {
|
||||||
let mut new_raw_value = ptr::null_mut();
|
let mut new_raw_value = ptr::null_mut();
|
||||||
let status =
|
let status =
|
||||||
unsafe { sys::napi_coerce_to_string(self.env.0, self.raw_value, &mut new_raw_value) };
|
unsafe { sys::napi_coerce_to_string(self.env.0, self.raw_value, &mut new_raw_value) };
|
||||||
|
@ -732,7 +739,7 @@ impl<'env, T: ValueType> Value<'env, T> {
|
||||||
Ok(Value {
|
Ok(Value {
|
||||||
env: self.env,
|
env: self.env,
|
||||||
raw_value: self.raw_value,
|
raw_value: self.raw_value,
|
||||||
value: String,
|
value: JsString,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -773,7 +780,7 @@ fn get_raw_type(env: sys::napi_env, raw_value: sys::napi_value) -> sys::napi_val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'env> Value<'env, String> {
|
impl<'env> Value<'env, JsString> {
|
||||||
pub fn len(&self) -> Result<usize> {
|
pub fn len(&self) -> Result<usize> {
|
||||||
let mut raw_length = ptr::null_mut();
|
let mut raw_length = ptr::null_mut();
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -790,7 +797,8 @@ impl<'env> Value<'env, String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'env> Value<'env, String> {
|
impl<'env> Value<'env, JsString> {
|
||||||
|
#[inline]
|
||||||
pub fn get_ref(&self) -> Result<&[u8]> {
|
pub fn get_ref(&self) -> Result<&[u8]> {
|
||||||
let mut written_char_count: u64 = 0;
|
let mut written_char_count: u64 = 0;
|
||||||
let len = self.len()? + 1;
|
let len = self.len()? + 1;
|
||||||
|
@ -814,6 +822,10 @@ impl<'env> Value<'env, String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn as_str(&self) -> Result<&str> {
|
||||||
|
str::from_utf8(self.get_ref()?).map_err(|_| Error::new(Status::GenericFailure))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_ref_mut(&mut self) -> Result<&mut [u8]> {
|
pub fn get_ref_mut(&mut self) -> Result<&mut [u8]> {
|
||||||
let mut written_char_count: u64 = 0;
|
let mut written_char_count: u64 = 0;
|
||||||
let len = self.len()? + 1;
|
let len = self.len()? + 1;
|
||||||
|
@ -838,10 +850,10 @@ impl<'env> Value<'env, String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'env> TryFrom<Value<'env, String>> for Vec<u16> {
|
impl<'env> TryFrom<Value<'env, JsString>> for Vec<u16> {
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
|
|
||||||
fn try_from(value: Value<'env, String>) -> Result<Vec<u16>> {
|
fn try_from(value: Value<'env, JsString>) -> Result<Vec<u16>> {
|
||||||
let mut result = Vec::with_capacity(value.len()? + 1); // Leave room for trailing null byte
|
let mut result = Vec::with_capacity(value.len()? + 1); // Leave room for trailing null byte
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
@ -17,7 +17,6 @@ pub enum Status {
|
||||||
EscapeCalledTwice,
|
EscapeCalledTwice,
|
||||||
HandleScopeMismatch,
|
HandleScopeMismatch,
|
||||||
CallbackScopeMismatch,
|
CallbackScopeMismatch,
|
||||||
StringContainsNull,
|
|
||||||
QueueFull,
|
QueueFull,
|
||||||
Closing,
|
Closing,
|
||||||
BigintExpected,
|
BigintExpected,
|
||||||
|
@ -52,3 +51,29 @@ impl From<napi_status> for Status {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Into<self::napi_status> for Status {
|
||||||
|
fn into(self) -> napi_status {
|
||||||
|
match self {
|
||||||
|
Self::Ok => napi_status::napi_ok,
|
||||||
|
Self::InvalidArg => napi_status::napi_invalid_arg,
|
||||||
|
Self::ObjectExpected => napi_status::napi_object_expected,
|
||||||
|
Self::StringExpected => napi_status::napi_string_expected,
|
||||||
|
Self::NameExpected => napi_status::napi_name_expected,
|
||||||
|
Self::FunctionExpected => napi_status::napi_function_expected,
|
||||||
|
Self::NumberExpected => napi_status::napi_number_expected,
|
||||||
|
Self::BooleanExpected => napi_status::napi_boolean_expected,
|
||||||
|
Self::ArrayExpected => napi_status::napi_array_expected,
|
||||||
|
Self::GenericFailure => napi_status::napi_generic_failure,
|
||||||
|
Self::PendingException => napi_status::napi_pending_exception,
|
||||||
|
Self::Cancelled => napi_status::napi_cancelled,
|
||||||
|
Self::EscapeCalledTwice => napi_status::napi_escape_called_twice,
|
||||||
|
Self::HandleScopeMismatch => napi_status::napi_handle_scope_mismatch,
|
||||||
|
Self::CallbackScopeMismatch => napi_status::napi_callback_scope_mismatch,
|
||||||
|
Self::QueueFull => napi_status::napi_queue_full,
|
||||||
|
Self::Closing => napi_status::napi_closing,
|
||||||
|
Self::BigintExpected => napi_status::napi_bigint_expected,
|
||||||
|
Self::Unknown => napi_status::napi_generic_failure,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue