1
1
extern crate napi_sys;
2
2
3
+ mod args;
3
4
mod env;
4
5
mod result;
5
6
mod value;
6
7
8
+ pub use args:: NapiArgs ;
7
9
pub use env:: NapiEnv ;
8
10
pub use result:: { NapiError , NapiErrorKind , NapiResult } ;
9
11
pub use value:: { AsNapiObject , NapiAny , NapiArray , NapiArrayBuffer ,
@@ -13,3 +15,64 @@ pub use value::{AsNapiObject, NapiAny, NapiArray, NapiArrayBuffer,
13
15
pub mod sys {
14
16
pub use napi_sys:: * ;
15
17
}
18
+
19
+ #[ macro_export]
20
+ macro_rules! napi_callback {
21
+ ( $wrapper: ident, $handler: expr) => {
22
+ #[ no_mangle]
23
+ pub extern "C" fn $wrapper(
24
+ env: $crate:: sys:: napi_env,
25
+ cb_info: $crate:: sys:: napi_callback_info,
26
+ ) -> $crate:: sys:: napi_value {
27
+ use std:: error:: Error ;
28
+ use std:: ffi:: CString ;
29
+ use std:: ptr;
30
+
31
+ use $crate:: { NapiArgs , NapiEnv , NapiResult , NapiValue } ;
32
+ use $crate:: sys:: { napi_get_undefined, napi_throw,
33
+ napi_throw_error, napi_value} ;
34
+
35
+ let env_wrapper = NapiEnv :: from( env) ;
36
+
37
+ fn typecheck_result<' a, T : NapiValue <' a>>( _: & NapiResult <T >) { }
38
+
39
+ let result = <_ as NapiArgs >:: from_cb_info( & env_wrapper, cb_info)
40
+ . and_then( |args| {
41
+ let result = $handler( & env_wrapper, args) ;
42
+ typecheck_result( & result) ;
43
+ result
44
+ } ) ;
45
+
46
+ match result {
47
+ Ok ( value) => value. as_sys_value( ) ,
48
+ Err ( error) => {
49
+ if let Some ( exception) = error. exception {
50
+ unsafe {
51
+ napi_throw( env, exception) ;
52
+ }
53
+ } else {
54
+ let message = format!( "{}" , & error) ;
55
+ let c_string =
56
+ CString :: new( message) . unwrap_or_else( |_| {
57
+ CString :: new( error. description( ) ) . unwrap( )
58
+ } ) ;
59
+
60
+ unsafe {
61
+ napi_throw_error(
62
+ env,
63
+ ptr:: null( ) ,
64
+ c_string. as_ptr( ) ,
65
+ ) ;
66
+ }
67
+ }
68
+
69
+ let mut result: napi_value = ptr:: null_mut( ) ;
70
+ unsafe {
71
+ napi_get_undefined( env, & mut result) ;
72
+ }
73
+ result
74
+ }
75
+ }
76
+ }
77
+ } ;
78
+ }
0 commit comments