@@ -26,20 +26,62 @@ fn impl_napi_args(
26
26
_ => return Err ( "NapiArgs can only be derived for structs" ) ,
27
27
} ;
28
28
29
- let fields = match variant_data {
30
- & syn:: VariantData :: Tuple ( ref fields) => fields,
31
- _ => return Err ( "NapiArgs can only be derived for tuple-structs" ) ,
29
+ let ( init_list, count) = match * variant_data {
30
+ syn:: VariantData :: Struct ( ref fields) => {
31
+ let inner = fields
32
+ . iter ( )
33
+ . enumerate ( )
34
+ . map ( |( idx, field) | {
35
+ let ident = field. clone ( ) . ident . unwrap ( ) ;
36
+ quote ! {
37
+ #ident: <_ as NapiValue >:: from_sys_checked(
38
+ env,
39
+ argv[ #idx] ,
40
+ ) ?
41
+ }
42
+ } )
43
+ . collect :: < Vec < _ > > ( ) ;
44
+
45
+ let outer = quote ! {
46
+ { #( #inner) , * }
47
+ } ;
48
+
49
+ ( Some ( outer) , fields. len ( ) )
50
+ }
51
+
52
+ syn:: VariantData :: Tuple ( ref fields) => {
53
+ let inner = ( 0 ..fields. len ( ) )
54
+ . map ( |idx| {
55
+ quote ! {
56
+ <_ as NapiValue >:: from_sys_checked( env, argv[ #idx] ) ?
57
+ }
58
+ } )
59
+ . collect :: < Vec < _ > > ( ) ;
60
+
61
+ let outer = quote ! {
62
+ ( #( #inner) , * )
63
+ } ;
64
+
65
+ ( Some ( outer) , fields. len ( ) )
66
+ }
67
+
68
+ syn:: VariantData :: Unit => ( None , 0 ) ,
69
+ } ;
70
+
71
+ let construct = if let Some ( init_list) = init_list {
72
+ quote ! { #name #init_list }
73
+ } else {
74
+ quote ! { #name }
32
75
} ;
33
- let count = fields. len ( ) ;
34
76
35
77
Ok ( quote ! {
36
- impl NapiArgs for #name {
78
+ impl < ' env> NapiArgs < ' env> for #name< ' env> {
37
79
fn from_cb_info(
38
- env: & :: napi:: NapiEnv ,
80
+ env: & ' env :: napi:: NapiEnv ,
39
81
cb_info: :: napi:: sys:: napi_callback_info,
40
82
) -> :: napi:: NapiResult <Self > {
41
83
use :: napi:: sys;
42
- use :: napi:: { NapiError , NapiString } ;
84
+ use :: napi:: { NapiError , NapiString , NapiValue } ;
43
85
44
86
use :: std:: ptr;
45
87
@@ -66,7 +108,7 @@ fn impl_napi_args(
66
108
return Err ( NapiError :: type_error( env, & message) ) ;
67
109
}
68
110
69
- Ok ( #name ( ) )
111
+ Ok ( #construct )
70
112
}
71
113
}
72
114
} )
0 commit comments