@@ -56,6 +56,9 @@ use alloc::{
56
56
use core:: iter:: FromIterator ;
57
57
use proc_macro:: { Group , TokenStream , TokenTree } ;
58
58
59
+ // Reserved field names to avoid conflicts
60
+ const RESERVED_FIELDS : [ & str ; 2 ] = [ "__decodable_internal_data" , "__decodable_internal_offset" ] ;
61
+
59
62
// Checks if a `TokenStream` contains a group with a bracket delimiter (`[]`),
60
63
// and further examines if the group has an identifier called `already_sized`.
61
64
//
@@ -491,38 +494,38 @@ fn parse_struct_fields(group: Vec<TokenTree>) -> Vec<ParsedField> {
491
494
/// }
492
495
///
493
496
/// impl<'decoder> Decodable<'decoder> for Test {
494
- /// fn get_structure(data : &[u8]) -> Result<Vec<FieldMarker>, Error> {
497
+ /// fn get_structure(__decodable_internal_data : &[u8]) -> Result<Vec<FieldMarker>, Error> {
495
498
/// let mut fields = Vec::new();
496
- /// let mut offset = 0;
499
+ /// let mut __decodable_internal_offset = 0;
497
500
///
498
- /// let a: Vec<FieldMarker> = u32::get_structure(&data[offset ..])?;
499
- /// offset += a.size_hint_(&data, offset )?;
501
+ /// let a: Vec<FieldMarker> = u32::get_structure(&__decodable_internal_data[__decodable_internal_offset ..])?;
502
+ /// __decodable_internal_offset += a.size_hint_(&__decodable_internal_data, __decodable_internal_offset )?;
500
503
/// let a = a.try_into()?;
501
504
/// fields.push(a);
502
505
///
503
- /// let b: Vec<FieldMarker> = u8::get_structure(&data[offset ..])?;
504
- /// offset += b.size_hint_(&data, offset )?;
506
+ /// let b: Vec<FieldMarker> = u8::get_structure(&__decodable_internal_data[__decodable_internal_offset ..])?;
507
+ /// __decodable_internal_offset += b.size_hint_(&__decodable_internal_data, __decodable_internal_offset )?;
505
508
/// let b = b.try_into()?;
506
509
/// fields.push(b);
507
510
///
508
- /// let c: Vec<FieldMarker> = U24::get_structure(&data[offset ..])?;
509
- /// offset += c.size_hint_(&data, offset )?;
511
+ /// let c: Vec<FieldMarker> = U24::get_structure(&__decodable_internal_data[__decodable_internal_offset ..])?;
512
+ /// __decodable_internal_offset += c.size_hint_(&__decodable_internal_data, __decodable_internal_offset )?;
510
513
/// let c = c.try_into()?;
511
514
/// fields.push(c);
512
515
///
513
516
/// Ok(fields)
514
517
/// }
515
518
///
516
- /// fn from_decoded_fields(mut data : Vec<DecodableField<'decoder>>) -> Result<Self, Error> {
519
+ /// fn from_decoded_fields(mut __decodable_internal_data : Vec<DecodableField<'decoder>>) -> Result<Self, Error> {
517
520
/// Ok(Self {
518
521
/// c: U24::from_decoded_fields(
519
- /// data .pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
522
+ /// __decodable_internal_data .pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
520
523
/// )?,
521
524
/// b: u8::from_decoded_fields(
522
- /// data .pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
525
+ /// __decodable_internal_data .pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
523
526
/// )?,
524
527
/// a: u32::from_decoded_fields(
525
- /// data .pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
528
+ /// __decodable_internal_data .pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
526
529
/// )?,
527
530
/// })
528
531
/// }
@@ -557,20 +560,39 @@ fn parse_struct_fields(group: Vec<TokenTree>) -> Vec<ParsedField> {
557
560
pub fn decodable ( item : TokenStream ) -> TokenStream {
558
561
let parsed_struct = get_struct_properties ( item) ;
559
562
563
+ let data_ident = RESERVED_FIELDS [ 0 ] ;
564
+ let offset_ident = RESERVED_FIELDS [ 1 ] ;
565
+
566
+ for field in & parsed_struct. fields {
567
+ if RESERVED_FIELDS . contains ( & field. name . as_str ( ) ) {
568
+ return format ! (
569
+ "compile_error!(\" Field name '{}' is reserved and cannot be used in struct '{}'. Rename it to avoid conflicts.\" );" ,
570
+ field. name, parsed_struct. name
571
+ )
572
+ . parse ( )
573
+ . unwrap ( ) ;
574
+ }
575
+ }
576
+
560
577
let mut derive_fields = String :: new ( ) ;
561
578
562
579
for f in parsed_struct. fields . clone ( ) {
563
580
let field = format ! (
564
581
"
565
- let {}: Vec<FieldMarker> = {}{}::get_structure(& data[offset ..])?;
566
- offset += {}.size_hint_(&data, offset )?;
582
+ let {}: Vec<FieldMarker> = {}{}::get_structure(& {}[{} ..])?;
583
+ {} += {}.size_hint_(&{}, {} )?;
567
584
let {} = {}.try_into()?;
568
585
fields.push({});
569
586
" ,
570
587
f. name,
571
588
f. type_,
572
589
f. get_generics( ) ,
590
+ data_ident,
591
+ offset_ident,
592
+ offset_ident,
573
593
f. name,
594
+ data_ident,
595
+ offset_ident,
574
596
f. name,
575
597
f. name,
576
598
f. name
@@ -602,11 +624,12 @@ pub fn decodable(item: TokenStream) -> TokenStream {
602
624
for f in fields. clone ( ) {
603
625
let field = format ! (
604
626
"
605
- {}: {}{}::from_decoded_fields(data .pop().ok_or(Error::NoDecodableFieldPassed)?.into())?,
627
+ {}: {}{}::from_decoded_fields({} .pop().ok_or(Error::NoDecodableFieldPassed)?.into())?,
606
628
" ,
607
629
f. name,
608
630
f. type_,
609
- f. get_generics( )
631
+ f. get_generics( ) ,
632
+ data_ident
610
633
) ;
611
634
derive_decoded_fields. push_str ( & field)
612
635
}
@@ -624,14 +647,14 @@ pub fn decodable(item: TokenStream) -> TokenStream {
624
647
use super::*;
625
648
626
649
impl{} Decodable<'decoder> for {}{} {{
627
- fn get_structure(data : &[u8]) -> Result<Vec<FieldMarker>, Error> {{
650
+ fn get_structure({} : &[u8]) -> Result<Vec<FieldMarker>, Error> {{
628
651
let mut fields = Vec::new();
629
- let mut offset = 0;
652
+ let mut {} = 0;
630
653
{}
631
654
Ok(fields)
632
655
}}
633
656
634
- fn from_decoded_fields(mut data : Vec<DecodableField<'decoder>>) -> Result<Self, Error> {{
657
+ fn from_decoded_fields(mut {} : Vec<DecodableField<'decoder>>) -> Result<Self, Error> {{
635
658
Ok(Self {{
636
659
{}
637
660
}})
@@ -659,7 +682,10 @@ pub fn decodable(item: TokenStream) -> TokenStream {
659
682
impl_generics,
660
683
parsed_struct. name,
661
684
parsed_struct. generics,
685
+ data_ident,
686
+ offset_ident,
662
687
derive_fields,
688
+ data_ident,
663
689
derive_decoded_fields,
664
690
// impl into_static
665
691
impl_generics,
0 commit comments