ci: add cargo clippy
This commit is contained in:
parent
96f3a45709
commit
c184ab3926
17 changed files with 50 additions and 32 deletions
6
.github/workflows/lint.yaml
vendored
6
.github/workflows/lint.yaml
vendored
|
@ -25,6 +25,7 @@ jobs:
|
||||||
toolchain: stable
|
toolchain: stable
|
||||||
profile: default
|
profile: default
|
||||||
override: true
|
override: true
|
||||||
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Generate Cargo.lock
|
- name: Generate Cargo.lock
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
|
@ -55,9 +56,12 @@ jobs:
|
||||||
- name: 'Lint JS/TS'
|
- name: 'Lint JS/TS'
|
||||||
run: yarn lint
|
run: yarn lint
|
||||||
|
|
||||||
- name: 'Lint rust'
|
- name: Cargo fmt
|
||||||
run: cargo fmt -- --check
|
run: cargo fmt -- --check
|
||||||
|
|
||||||
|
- name: Clippy
|
||||||
|
run: cargo clippy
|
||||||
|
|
||||||
- name: Clear the cargo caches
|
- name: Clear the cargo caches
|
||||||
run: |
|
run: |
|
||||||
cargo install cargo-cache --no-default-features --features ci-autoclean
|
cargo install cargo-cache --no-default-features --features ci-autoclean
|
||||||
|
|
|
@ -18,8 +18,8 @@ impl Parse for ArgLength {
|
||||||
Ok(ArgLength {
|
Ok(ArgLength {
|
||||||
length: vars
|
length: vars
|
||||||
.first()
|
.first()
|
||||||
.map(|i| i.clone())
|
.cloned()
|
||||||
.unwrap_or(Literal::usize_unsuffixed(0)),
|
.unwrap_or_else(|| Literal::usize_unsuffixed(0)),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ impl<'env> AsyncWorkPromise<'env> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn run<'env, T: Task>(env: &'env Env, task: T) -> Result<AsyncWorkPromise<'env>> {
|
pub fn run<T: Task>(env: &Env, task: T) -> Result<AsyncWorkPromise<'_>> {
|
||||||
let mut raw_resource = ptr::null_mut();
|
let mut raw_resource = ptr::null_mut();
|
||||||
check_status!(unsafe { sys::napi_create_object(env.0, &mut raw_resource) })?;
|
check_status!(unsafe { sys::napi_create_object(env.0, &mut raw_resource) })?;
|
||||||
let mut raw_promise = ptr::null_mut();
|
let mut raw_promise = ptr::null_mut();
|
||||||
|
@ -86,7 +86,7 @@ unsafe extern "C" fn execute<T: Task>(_env: sys::napi_env, data: *mut c_void) {
|
||||||
let mut work = Box::from_raw(data as *mut AsyncWork<T>);
|
let mut work = Box::from_raw(data as *mut AsyncWork<T>);
|
||||||
let _ = mem::replace(
|
let _ = mem::replace(
|
||||||
&mut work.value,
|
&mut work.value,
|
||||||
work.inner_task.compute().map(|v| mem::MaybeUninit::new(v)),
|
work.inner_task.compute().map(mem::MaybeUninit::new),
|
||||||
);
|
);
|
||||||
Box::leak(work);
|
Box::leak(work);
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,12 +53,10 @@ impl<'env> CallContext<'env> {
|
||||||
status: Status::GenericFailure,
|
status: Status::GenericFailure,
|
||||||
reason: "Arguments index out of range".to_owned(),
|
reason: "Arguments index out of range".to_owned(),
|
||||||
})
|
})
|
||||||
|
} else if index < self.length {
|
||||||
|
unsafe { ArgType::from_raw(self.env.0, self.args[index]) }.map(Either::A)
|
||||||
} else {
|
} else {
|
||||||
if index < self.length {
|
self.env.get_undefined().map(Either::B)
|
||||||
unsafe { ArgType::from_raw(self.env.0, self.args[index]) }.map(Either::A)
|
|
||||||
} else {
|
|
||||||
self.env.get_undefined().map(Either::B)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
pub(crate) struct CleanupEnvHookData<T: 'static> {
|
pub(crate) struct CleanupEnvHookData<T: 'static> {
|
||||||
pub(crate) data: T,
|
pub(crate) data: T,
|
||||||
pub(crate) hook: Box<dyn FnOnce(T) -> ()>,
|
pub(crate) hook: Box<dyn FnOnce(T)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use std::any::TypeId;
|
use std::any::TypeId;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::mem;
|
|
||||||
use std::os::raw::{c_char, c_void};
|
use std::os::raw::{c_char, c_void};
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
|
@ -37,6 +36,7 @@ pub struct Env(pub(crate) sys::napi_env);
|
||||||
|
|
||||||
impl Env {
|
impl Env {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
#[allow(clippy::missing_safety_doc)]
|
||||||
pub unsafe fn from_raw(env: sys::napi_env) -> Self {
|
pub unsafe fn from_raw(env: sys::napi_env) -> Self {
|
||||||
Env(env)
|
Env(env)
|
||||||
}
|
}
|
||||||
|
@ -461,9 +461,9 @@ impl Env {
|
||||||
&mut unknown_tagged_object,
|
&mut unknown_tagged_object,
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
let type_id: *const TypeId = mem::transmute(unknown_tagged_object);
|
let type_id = unknown_tagged_object as *const TypeId;
|
||||||
if *type_id == TypeId::of::<T>() {
|
if *type_id == TypeId::of::<T>() {
|
||||||
let tagged_object: *mut TaggedObject<T> = mem::transmute(unknown_tagged_object);
|
let tagged_object = unknown_tagged_object as *mut TaggedObject<T>;
|
||||||
(*tagged_object).object.as_mut().ok_or(Error {
|
(*tagged_object).object.as_mut().ok_or(Error {
|
||||||
status: Status::InvalidArg,
|
status: Status::InvalidArg,
|
||||||
reason: "Invalid argument, nothing attach to js_object".to_owned(),
|
reason: "Invalid argument, nothing attach to js_object".to_owned(),
|
||||||
|
@ -487,9 +487,9 @@ impl Env {
|
||||||
&mut unknown_tagged_object,
|
&mut unknown_tagged_object,
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
let type_id: *const TypeId = mem::transmute(unknown_tagged_object);
|
let type_id = unknown_tagged_object as *const TypeId;
|
||||||
if *type_id == TypeId::of::<T>() {
|
if *type_id == TypeId::of::<T>() {
|
||||||
let tagged_object: *mut TaggedObject<T> = mem::transmute(unknown_tagged_object);
|
let tagged_object = unknown_tagged_object as *mut TaggedObject<T>;
|
||||||
(*tagged_object).object = None;
|
(*tagged_object).object = None;
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
|
@ -527,9 +527,9 @@ impl Env {
|
||||||
&mut unknown_tagged_object,
|
&mut unknown_tagged_object,
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
let type_id: *const TypeId = mem::transmute(unknown_tagged_object);
|
let type_id = unknown_tagged_object as *const TypeId;
|
||||||
if *type_id == TypeId::of::<T>() {
|
if *type_id == TypeId::of::<T>() {
|
||||||
let tagged_object: *mut TaggedObject<T> = mem::transmute(unknown_tagged_object);
|
let tagged_object = unknown_tagged_object as *mut TaggedObject<T>;
|
||||||
(*tagged_object).object.as_mut().ok_or(Error {
|
(*tagged_object).object.as_mut().ok_or(Error {
|
||||||
status: Status::InvalidArg,
|
status: Status::InvalidArg,
|
||||||
reason: "nothing attach to js_external".to_owned(),
|
reason: "nothing attach to js_external".to_owned(),
|
||||||
|
@ -610,7 +610,7 @@ impl Env {
|
||||||
) -> Result<CleanupEnvHook<T>>
|
) -> Result<CleanupEnvHook<T>>
|
||||||
where
|
where
|
||||||
T: 'static,
|
T: 'static,
|
||||||
F: 'static + FnOnce(T) -> (),
|
F: 'static + FnOnce(T),
|
||||||
{
|
{
|
||||||
let hook = CleanupEnvHookData {
|
let hook = CleanupEnvHookData {
|
||||||
data: cleanup_data,
|
data: cleanup_data,
|
||||||
|
@ -793,7 +793,7 @@ unsafe extern "C" fn raw_finalize<T>(
|
||||||
finalize_data: *mut c_void,
|
finalize_data: *mut c_void,
|
||||||
_finalize_hint: *mut c_void,
|
_finalize_hint: *mut c_void,
|
||||||
) {
|
) {
|
||||||
let tagged_object: *mut TaggedObject<T> = mem::transmute(finalize_data);
|
let tagged_object = finalize_data as *mut TaggedObject<T>;
|
||||||
Box::from_raw(tagged_object);
|
Box::from_raw(tagged_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ impl<'x, 'de, 'env> serde::de::Deserializer<'x> for &'de mut De<'env> {
|
||||||
ValueType::String => visitor.visit_enum(JsEnumAccess::new(
|
ValueType::String => visitor.visit_enum(JsEnumAccess::new(
|
||||||
unsafe { JsString::from_raw_unchecked(self.0.env, self.0.value) }
|
unsafe { JsString::from_raw_unchecked(self.0.env, self.0.value) }
|
||||||
.into_utf8()?
|
.into_utf8()?
|
||||||
.to_owned()?,
|
.into_owned()?,
|
||||||
None,
|
None,
|
||||||
)),
|
)),
|
||||||
ValueType::Object => {
|
ValueType::Object => {
|
||||||
|
@ -128,7 +128,7 @@ impl<'x, 'de, 'env> serde::de::Deserializer<'x> for &'de mut De<'env> {
|
||||||
let key = properties.get_element::<JsString>(0)?;
|
let key = properties.get_element::<JsString>(0)?;
|
||||||
let value: JsUnknown = js_object.get_property(&key)?;
|
let value: JsUnknown = js_object.get_property(&key)?;
|
||||||
visitor.visit_enum(JsEnumAccess::new(
|
visitor.visit_enum(JsEnumAccess::new(
|
||||||
key.into_utf8()?.to_owned()?,
|
key.into_utf8()?.into_owned()?,
|
||||||
Some(&value.0),
|
Some(&value.0),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ impl<T: NapiValue> EscapableHandleScope<T> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn close(self, env: Env) -> Result<()> {
|
pub fn close(self, env: Env) -> Result<()> {
|
||||||
check_status!(unsafe { sys::napi_close_escapable_handle_scope(env.0, self.handle_scope) })
|
check_status!(unsafe { sys::napi_close_escapable_handle_scope(env.0, self.handle_scope) })
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,10 +32,7 @@ impl JsFunction {
|
||||||
.ok()
|
.ok()
|
||||||
.map(|u| unsafe { u.raw() })
|
.map(|u| unsafe { u.raw() })
|
||||||
})
|
})
|
||||||
.ok_or(Error::new(
|
.ok_or_else(|| Error::new(Status::GenericFailure, "Get raw this failed".to_owned()))?;
|
||||||
Status::GenericFailure,
|
|
||||||
"Get raw this failed".to_owned(),
|
|
||||||
))?;
|
|
||||||
let raw_args = args
|
let raw_args = args
|
||||||
.iter()
|
.iter()
|
||||||
.map(|arg| arg.0.value)
|
.map(|arg| arg.0.value)
|
||||||
|
@ -57,6 +54,7 @@ impl JsFunction {
|
||||||
|
|
||||||
/// https://nodejs.org/api/n-api.html#n_api_napi_new_instance
|
/// https://nodejs.org/api/n-api.html#n_api_napi_new_instance
|
||||||
/// This method is used to instantiate a new `JavaScript` value using a given `JsFunction` that represents the constructor for the object.
|
/// This method is used to instantiate a new `JavaScript` value using a given `JsFunction` that represents the constructor for the object.
|
||||||
|
#[allow(clippy::new_ret_no_self)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new<V>(&self, args: &[V]) -> Result<JsObject>
|
pub fn new<V>(&self, args: &[V]) -> Result<JsObject>
|
||||||
where
|
where
|
||||||
|
|
|
@ -516,10 +516,13 @@ macro_rules! impl_object_methods {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait NapiValue: Sized {
|
pub trait NapiValue: Sized {
|
||||||
|
#[allow(clippy::missing_safety_doc)]
|
||||||
unsafe fn from_raw(env: sys::napi_env, value: sys::napi_value) -> Result<Self>;
|
unsafe fn from_raw(env: sys::napi_env, value: sys::napi_value) -> Result<Self>;
|
||||||
|
|
||||||
|
#[allow(clippy::missing_safety_doc)]
|
||||||
unsafe fn from_raw_unchecked(env: sys::napi_env, value: sys::napi_value) -> Self;
|
unsafe fn from_raw_unchecked(env: sys::napi_env, value: sys::napi_value) -> Self;
|
||||||
|
|
||||||
|
#[allow(clippy::missing_safety_doc)]
|
||||||
unsafe fn raw(&self) -> sys::napi_value;
|
unsafe fn raw(&self) -> sys::napi_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,11 @@ impl JsStringLatin1 {
|
||||||
self.buf.len()
|
self.buf.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.buf.is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn take(self) -> Vec<u8> {
|
pub fn take(self) -> Vec<u8> {
|
||||||
self.as_slice().to_vec()
|
self.as_slice().to_vec()
|
||||||
|
|
|
@ -26,6 +26,11 @@ impl JsStringUtf16 {
|
||||||
self.buf.len()
|
self.buf.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.buf.is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn into_value(self) -> JsString {
|
pub fn into_value(self) -> JsString {
|
||||||
self.inner
|
self.inner
|
||||||
|
|
|
@ -27,7 +27,12 @@ impl JsStringUtf8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn to_owned(self) -> Result<String> {
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.buf.is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn into_owned(self) -> Result<String> {
|
||||||
Ok(self.as_str()?.to_owned())
|
Ok(self.as_str()?.to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,6 @@ impl<T> Ref<T> {
|
||||||
Ok(self.count)
|
Ok(self.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn unref(mut self, env: Env) -> Result<u32> {
|
pub fn unref(mut self, env: Env) -> Result<u32> {
|
||||||
check_status!(unsafe { sys::napi_reference_unref(env.0, self.raw_ref, &mut self.count) })?;
|
check_status!(unsafe { sys::napi_reference_unref(env.0, self.raw_ref, &mut self.count) })?;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![deny(clippy::all)]
|
||||||
|
|
||||||
//! High level NodeJS [N-API](https://nodejs.org/api/n-api.html) binding
|
//! High level NodeJS [N-API](https://nodejs.org/api/n-api.html) binding
|
||||||
//!
|
//!
|
||||||
//! **napi-rs** provides minimal overhead to write N-API modules in `Rust`.
|
//! **napi-rs** provides minimal overhead to write N-API modules in `Rust`.
|
||||||
|
|
|
@ -127,7 +127,7 @@ async fn read_file_content(filepath: &Path) -> Result<Vec<u8>> {
|
||||||
pub fn test_tokio_readfile(ctx: CallContext) -> Result<JsUndefined> {
|
pub fn test_tokio_readfile(ctx: CallContext) -> Result<JsUndefined> {
|
||||||
let js_filepath = ctx.get::<JsString>(0)?;
|
let js_filepath = ctx.get::<JsString>(0)?;
|
||||||
let js_func = ctx.get::<JsFunction>(1)?;
|
let js_func = ctx.get::<JsFunction>(1)?;
|
||||||
let path_str = js_filepath.into_utf8()?.to_owned()?;
|
let path_str = js_filepath.into_utf8()?.into_owned()?;
|
||||||
|
|
||||||
let tsfn =
|
let tsfn =
|
||||||
ctx
|
ctx
|
||||||
|
|
|
@ -5,7 +5,7 @@ use tokio;
|
||||||
#[js_function(1)]
|
#[js_function(1)]
|
||||||
pub fn test_execute_tokio_readfile(ctx: CallContext) -> Result<JsObject> {
|
pub fn test_execute_tokio_readfile(ctx: CallContext) -> Result<JsObject> {
|
||||||
let js_filepath = ctx.get::<JsString>(0)?;
|
let js_filepath = ctx.get::<JsString>(0)?;
|
||||||
let path_str = js_filepath.into_utf8()?.to_owned()?;
|
let path_str = js_filepath.into_utf8()?.into_owned()?;
|
||||||
ctx.env.execute_tokio_future(
|
ctx.env.execute_tokio_future(
|
||||||
tokio::fs::read(path_str).map(|v| {
|
tokio::fs::read(path_str).map(|v| {
|
||||||
v.map_err(|e| {
|
v.map_err(|e| {
|
||||||
|
@ -22,7 +22,7 @@ pub fn test_execute_tokio_readfile(ctx: CallContext) -> Result<JsObject> {
|
||||||
#[js_function(1)]
|
#[js_function(1)]
|
||||||
pub fn error_from_tokio_future(ctx: CallContext) -> Result<JsObject> {
|
pub fn error_from_tokio_future(ctx: CallContext) -> Result<JsObject> {
|
||||||
let js_filepath = ctx.get::<JsString>(0)?;
|
let js_filepath = ctx.get::<JsString>(0)?;
|
||||||
let path_str = js_filepath.into_utf8()?.to_owned()?;
|
let path_str = js_filepath.into_utf8()?.into_owned()?;
|
||||||
ctx.env.execute_tokio_future(
|
ctx.env.execute_tokio_future(
|
||||||
tokio::fs::read(path_str)
|
tokio::fs::read(path_str)
|
||||||
.map_err(Error::from)
|
.map_err(Error::from)
|
||||||
|
|
Loading…
Reference in a new issue