1
1
use proc_macro:: TokenStream ;
2
- use quote:: { format_ident, quote} ;
2
+ use quote:: { format_ident, quote, ToTokens } ;
3
3
use syn:: { parse_macro_input, DeriveInput } ;
4
4
5
5
mod deserialize_impl;
@@ -49,11 +49,26 @@ mod zero_copy_struct_inner;
49
49
/// 3. rename deserialize traits to ZeroCopy and ZeroCopyMut
50
50
/// 4. check generated code by hand
51
51
/// 5. fix partial eq generation for options
52
- #[ proc_macro_derive( ZeroCopy ) ]
52
+ #[ proc_macro_derive( ZeroCopy , attributes ( poseidon ) ) ]
53
53
pub fn derive_zero_copy ( input : TokenStream ) -> TokenStream {
54
54
// Parse the input DeriveInput
55
55
let input = parse_macro_input ! ( input as DeriveInput ) ;
56
56
57
+ println ! ( "input {}" , input. ident. to_token_stream( ) . to_string( ) ) ;
58
+ println ! (
59
+ "input data {}" ,
60
+ input. generics. to_token_stream( ) . to_string( )
61
+ ) ;
62
+
63
+ // Check for both the poseidon_hasher attribute and LightHasher in derive
64
+ let hasher = input. attrs . iter ( ) . any ( |attr| {
65
+ if attr. path ( ) . is_ident ( "poseidon" ) {
66
+ return true ;
67
+ }
68
+ false
69
+ } ) ;
70
+ println ! ( "hasher {}" , hasher) ;
71
+
57
72
// Process the input to extract struct information
58
73
let ( name, z_struct_name, z_struct_meta_name, fields) = utils:: process_input ( & input) ;
59
74
@@ -62,21 +77,23 @@ pub fn derive_zero_copy(input: TokenStream) -> TokenStream {
62
77
63
78
// Generate each implementation part using the respective modules
64
79
let meta_struct_def_mut =
65
- meta_struct:: generate_meta_struct :: < true > ( & z_struct_meta_name, & meta_fields) ;
80
+ meta_struct:: generate_meta_struct :: < true > ( & z_struct_meta_name, & meta_fields, hasher ) ;
66
81
let meta_struct_def =
67
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
82
+ meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields, hasher ) ;
68
83
69
84
let z_struct_def_mut = z_struct:: generate_z_struct :: < true > (
70
85
& z_struct_name,
71
86
& z_struct_meta_name,
72
87
& struct_fields,
73
88
& meta_fields,
89
+ hasher,
74
90
) ;
75
91
let z_struct_def = z_struct:: generate_z_struct :: < false > (
76
92
& z_struct_name,
77
93
& z_struct_meta_name,
78
94
& struct_fields,
79
95
& meta_fields,
96
+ hasher,
80
97
) ;
81
98
82
99
let zero_copy_struct_inner_impl_mut =
@@ -142,6 +159,20 @@ pub fn derive_zero_copy_eq(input: TokenStream) -> TokenStream {
142
159
// Parse the input DeriveInput
143
160
let input = parse_macro_input ! ( input as DeriveInput ) ;
144
161
162
+ // Check for LightHasher in derive attributes (same logic as in derive_zero_copy)
163
+ let hasher = input. attrs . iter ( ) . any ( |attr| {
164
+ if attr. path ( ) . is_ident ( "poseidon_hasher" ) {
165
+ return true ;
166
+ }
167
+
168
+ if attr. path ( ) . is_ident ( "derive" ) {
169
+ let derive_string = attr. to_token_stream ( ) . to_string ( ) ;
170
+ return derive_string. contains ( "LightHasher" ) ;
171
+ }
172
+
173
+ false
174
+ } ) ;
175
+
145
176
// Process the input to extract struct information
146
177
let ( name, z_struct_name, z_struct_meta_name, fields) = utils:: process_input ( & input) ;
147
178
@@ -360,12 +391,13 @@ mod tests {
360
391
361
392
// Generate each implementation part using the respective modules
362
393
let meta_struct_def =
363
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
394
+ meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields, false ) ;
364
395
let z_struct_def = z_struct:: generate_z_struct :: < false > (
365
396
& z_struct_name,
366
397
& z_struct_meta_name,
367
398
& struct_fields,
368
399
& meta_fields,
400
+ false ,
369
401
) ;
370
402
let zero_copy_struct_inner_impl =
371
403
zero_copy_struct_inner:: generate_zero_copy_struct_inner :: < false > ( name, & z_struct_name) ;
@@ -475,12 +507,13 @@ mod tests {
475
507
476
508
// Generate each implementation part
477
509
let meta_struct_def =
478
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
510
+ meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields, false ) ;
479
511
let z_struct_def = z_struct:: generate_z_struct :: < false > (
480
512
& z_struct_name,
481
513
& z_struct_meta_name,
482
514
& struct_fields,
483
515
& meta_fields,
516
+ false ,
484
517
) ;
485
518
let zero_copy_struct_inner_impl =
486
519
zero_copy_struct_inner:: generate_zero_copy_struct_inner :: < false > ( name, & z_struct_name) ;
@@ -547,12 +580,13 @@ mod tests {
547
580
548
581
// Generate the implementation
549
582
let meta_struct_def =
550
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
583
+ meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields, false ) ;
551
584
let z_struct_def = z_struct:: generate_z_struct :: < false > (
552
585
& z_struct_name,
553
586
& z_struct_meta_name,
554
587
& struct_fields,
555
588
& meta_fields,
589
+ false ,
556
590
) ;
557
591
558
592
// Check meta struct has bool converted to u8
@@ -586,12 +620,13 @@ mod tests {
586
620
587
621
// Generate code from ZeroCopy
588
622
let meta_struct_def =
589
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
623
+ meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields, false ) ;
590
624
let z_struct_def = z_struct:: generate_z_struct :: < false > (
591
625
& z_struct_name,
592
626
& z_struct_meta_name,
593
627
& struct_fields,
594
628
& meta_fields,
629
+ false ,
595
630
) ;
596
631
let zero_copy_struct_inner_impl =
597
632
zero_copy_struct_inner:: generate_zero_copy_struct_inner :: < false > ( name, & z_struct_name) ;
@@ -676,7 +711,7 @@ mod tests {
676
711
677
712
// Generate the implementation
678
713
let meta_struct_def =
679
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
714
+ meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields, false ) ;
680
715
let result = meta_struct_def. to_string ( ) ;
681
716
682
717
// Verify the meta struct has the right fields
@@ -718,12 +753,13 @@ mod tests {
718
753
719
754
// Generate the expanded code
720
755
let meta_struct_def =
721
- meta_struct:: generate_meta_struct :: < true > ( & z_struct_meta_name, & meta_fields) ;
756
+ meta_struct:: generate_meta_struct :: < true > ( & z_struct_meta_name, & meta_fields, false ) ;
722
757
let z_struct_def = z_struct:: generate_z_struct :: < true > (
723
758
& z_struct_name,
724
759
& z_struct_meta_name,
725
760
& struct_fields,
726
761
& meta_fields,
762
+ false ,
727
763
) ;
728
764
let zero_copy_struct_inner_impl = zero_copy_struct_inner:: generate_zero_copy_struct_inner :: <
729
765
false ,
@@ -955,13 +991,17 @@ mod tests {
955
991
) ;
956
992
957
993
// Generate code
958
- let meta_struct_def =
959
- meta_struct:: generate_meta_struct :: < false > ( & z_struct_meta_name, & meta_fields) ;
994
+ let meta_struct_def = meta_struct:: generate_meta_struct :: < false > (
995
+ & z_struct_meta_name,
996
+ & meta_fields,
997
+ false ,
998
+ ) ;
960
999
let z_struct_def = z_struct:: generate_z_struct :: < false > (
961
1000
& z_struct_name,
962
1001
& z_struct_meta_name,
963
1002
& struct_fields,
964
1003
& meta_fields,
1004
+ false ,
965
1005
) ;
966
1006
let zero_copy_struct_inner_impl =
967
1007
zero_copy_struct_inner:: generate_zero_copy_struct_inner :: < false > (
0 commit comments