diff --git a/ssz_derive/src/lib.rs b/ssz_derive/src/lib.rs index 988a2cd..b914c98 100644 --- a/ssz_derive/src/lib.rs +++ b/ssz_derive/src/lib.rs @@ -818,7 +818,7 @@ fn ssz_decode_derive_struct(item: &DeriveInput, struct_data: &DataStruct) -> Tok } fixed_decodes.push(quote! { - let (slice, bytes) = bytes.split_at(#ssz_fixed_len); + let (slice, __bytes) = __bytes.split_at(#ssz_fixed_len); let #ident = #from_ssz_bytes?; }); is_fixed_lens.push(is_ssz_fixed_len); @@ -848,11 +848,11 @@ fn ssz_decode_derive_struct(item: &DeriveInput, struct_data: &DataStruct) -> Tok } } - fn from_ssz_bytes(bytes: &[u8]) -> std::result::Result { + fn from_ssz_bytes(__bytes: &[u8]) -> std::result::Result { if ::is_ssz_fixed_len() { - if bytes.len() != ::ssz_fixed_len() { + if __bytes.len() != ::ssz_fixed_len() { return Err(ssz::DecodeError::InvalidByteLength { - len: bytes.len(), + len: __bytes.len(), expected: ::ssz_fixed_len(), }); } @@ -867,7 +867,7 @@ fn ssz_decode_derive_struct(item: &DeriveInput, struct_data: &DataStruct) -> Tok )* }) } else { - let mut builder = ssz::SszDecoderBuilder::new(bytes); + let mut builder = ssz::SszDecoderBuilder::new(__bytes); #( #register_types @@ -932,7 +932,7 @@ fn ssz_decode_derive_struct_transparent( }); } else { fields.push(quote! { - #name: <_>::from_ssz_bytes(bytes)?, + #name: <_>::from_ssz_bytes(__bytes)?, }); wrapped_type = Some(ty); } @@ -944,7 +944,7 @@ fn ssz_decode_derive_struct_transparent( }); } else { fields.push(quote! { - #index:<_>::from_ssz_bytes(bytes)?, + #index:<_>::from_ssz_bytes(__bytes)?, }); wrapped_type = Some(ty); } @@ -963,7 +963,7 @@ fn ssz_decode_derive_struct_transparent( <#ty as ssz::Decode>::ssz_fixed_len() } - fn from_ssz_bytes(bytes: &[u8]) -> std::result::Result { + fn from_ssz_bytes(__bytes: &[u8]) -> std::result::Result { Ok(Self { #( #fields @@ -1009,8 +1009,8 @@ fn ssz_decode_derive_enum_tag(derive_input: &DeriveInput, enum_data: &DataEnum) 1 } - fn from_ssz_bytes(bytes: &[u8]) -> std::result::Result { - let byte = bytes + fn from_ssz_bytes(__bytes: &[u8]) -> std::result::Result { + let byte = __bytes .first() .copied() .ok_or(ssz::DecodeError::OutOfBoundsByte { i: 0 })?; @@ -1061,12 +1061,12 @@ fn ssz_decode_derive_enum_union(derive_input: &DeriveInput, enum_data: &DataEnum false } - fn from_ssz_bytes(bytes: &[u8]) -> Result { + fn from_ssz_bytes(__bytes: &[u8]) -> Result { // Sanity check to ensure the definition here does not drift from the one defined in // `ssz`. debug_assert_eq!(#MAX_UNION_SELECTOR, ssz::MAX_UNION_SELECTOR); - let (selector, body) = ssz::split_union_bytes(bytes)?; + let (selector, body) = ssz::split_union_bytes(__bytes)?; match selector.into() { #( @@ -1128,9 +1128,9 @@ fn ssz_decode_derive_enum_transparent( false } - fn from_ssz_bytes(bytes: &[u8]) -> Result { + fn from_ssz_bytes(__bytes: &[u8]) -> Result { #( - if let Ok(var) = <#var_types as ssz::Decode>::from_ssz_bytes(bytes) { + if let Ok(var) = <#var_types as ssz::Decode>::from_ssz_bytes(__bytes) { return Ok(#constructors(var)); } )* diff --git a/ssz_derive/tests/tests.rs b/ssz_derive/tests/tests.rs index b2ddabf..2a2f545 100644 --- a/ssz_derive/tests/tests.rs +++ b/ssz_derive/tests/tests.rs @@ -258,6 +258,22 @@ fn transparent_struct_newtype_skipped_field_reverse() { ); } +#[derive(PartialEq, Debug, Encode, Decode)] +struct StructWithMoreThanOneFieldAndFirstFieldAsBytes { + bytes: Vec, + length: u8, +} + +#[test] +fn struct_with_more_than_one_field_and_first_field_as_bytes() { + let test_struct = StructWithMoreThanOneFieldAndFirstFieldAsBytes { + bytes: vec![42_u8], + length: 7, + }; + + assert_encode_decode(&test_struct, &[5, 0, 0, 0, 7, 42]); +} + #[derive(PartialEq, Debug, Encode)] #[ssz(struct_behaviour = "transparent")] struct TransparentStructSkippedFieldEncodeOnly {