Skip to content

Commit f32c991

Browse files
authored
Merge pull request #1502 from Shourya742/2025-02-24-fix-binary-sv2-proc-macro
Fix binary sv2 proc macro
2 parents e9fbb4c + 5d1160d commit f32c991

File tree

1 file changed

+45
-19
lines changed
  • protocols/v2/binary-sv2/derive_codec/src

1 file changed

+45
-19
lines changed

protocols/v2/binary-sv2/derive_codec/src/lib.rs

+45-19
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ use alloc::{
5656
use core::iter::FromIterator;
5757
use proc_macro::{Group, TokenStream, TokenTree};
5858

59+
// Reserved field names to avoid conflicts
60+
const RESERVED_FIELDS: [&str; 2] = ["__decodable_internal_data", "__decodable_internal_offset"];
61+
5962
// Checks if a `TokenStream` contains a group with a bracket delimiter (`[]`),
6063
// and further examines if the group has an identifier called `already_sized`.
6164
//
@@ -491,38 +494,38 @@ fn parse_struct_fields(group: Vec<TokenTree>) -> Vec<ParsedField> {
491494
/// }
492495
///
493496
/// 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> {
495498
/// let mut fields = Vec::new();
496-
/// let mut offset = 0;
499+
/// let mut __decodable_internal_offset = 0;
497500
///
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)?;
500503
/// let a = a.try_into()?;
501504
/// fields.push(a);
502505
///
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)?;
505508
/// let b = b.try_into()?;
506509
/// fields.push(b);
507510
///
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)?;
510513
/// let c = c.try_into()?;
511514
/// fields.push(c);
512515
///
513516
/// Ok(fields)
514517
/// }
515518
///
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> {
517520
/// Ok(Self {
518521
/// c: U24::from_decoded_fields(
519-
/// data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
522+
/// __decodable_internal_data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
520523
/// )?,
521524
/// b: u8::from_decoded_fields(
522-
/// data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
525+
/// __decodable_internal_data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
523526
/// )?,
524527
/// a: u32::from_decoded_fields(
525-
/// data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
528+
/// __decodable_internal_data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
526529
/// )?,
527530
/// })
528531
/// }
@@ -557,20 +560,39 @@ fn parse_struct_fields(group: Vec<TokenTree>) -> Vec<ParsedField> {
557560
pub fn decodable(item: TokenStream) -> TokenStream {
558561
let parsed_struct = get_struct_properties(item);
559562

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+
560577
let mut derive_fields = String::new();
561578

562579
for f in parsed_struct.fields.clone() {
563580
let field = format!(
564581
"
565-
let {}: Vec<FieldMarker> = {}{}::get_structure(& data[offset..])?;
566-
offset += {}.size_hint_(&data, offset)?;
582+
let {}: Vec<FieldMarker> = {}{}::get_structure(& {}[{}..])?;
583+
{} += {}.size_hint_(&{}, {})?;
567584
let {} = {}.try_into()?;
568585
fields.push({});
569586
",
570587
f.name,
571588
f.type_,
572589
f.get_generics(),
590+
data_ident,
591+
offset_ident,
592+
offset_ident,
573593
f.name,
594+
data_ident,
595+
offset_ident,
574596
f.name,
575597
f.name,
576598
f.name
@@ -602,11 +624,12 @@ pub fn decodable(item: TokenStream) -> TokenStream {
602624
for f in fields.clone() {
603625
let field = format!(
604626
"
605-
{}: {}{}::from_decoded_fields(data.pop().ok_or(Error::NoDecodableFieldPassed)?.into())?,
627+
{}: {}{}::from_decoded_fields({}.pop().ok_or(Error::NoDecodableFieldPassed)?.into())?,
606628
",
607629
f.name,
608630
f.type_,
609-
f.get_generics()
631+
f.get_generics(),
632+
data_ident
610633
);
611634
derive_decoded_fields.push_str(&field)
612635
}
@@ -624,14 +647,14 @@ pub fn decodable(item: TokenStream) -> TokenStream {
624647
use super::*;
625648
626649
impl{} Decodable<'decoder> for {}{} {{
627-
fn get_structure(data: &[u8]) -> Result<Vec<FieldMarker>, Error> {{
650+
fn get_structure({}: &[u8]) -> Result<Vec<FieldMarker>, Error> {{
628651
let mut fields = Vec::new();
629-
let mut offset = 0;
652+
let mut {} = 0;
630653
{}
631654
Ok(fields)
632655
}}
633656
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> {{
635658
Ok(Self {{
636659
{}
637660
}})
@@ -659,7 +682,10 @@ pub fn decodable(item: TokenStream) -> TokenStream {
659682
impl_generics,
660683
parsed_struct.name,
661684
parsed_struct.generics,
685+
data_ident,
686+
offset_ident,
662687
derive_fields,
688+
data_ident,
663689
derive_decoded_fields,
664690
// impl into_static
665691
impl_generics,

0 commit comments

Comments
 (0)