diff --git a/deku-derive/src/macros/deku_write.rs b/deku-derive/src/macros/deku_write.rs index 331aea5d..236b9690 100644 --- a/deku-derive/src/macros/deku_write.rs +++ b/deku-derive/src/macros/deku_write.rs @@ -534,8 +534,8 @@ fn emit_field_write( if let Some(temp_value) = &f.temp_value { let field_type = &f.ty; quote! { - let #field_ident: #field_type = #temp_value; - ::#crate_::DekuWrite::write(#object_prefix &#field_ident, __deku_output, (#write_args)) + let #field_ident: &#field_type = &#temp_value; + ::#crate_::DekuWrite::write(#object_prefix #field_ident, __deku_output, (#write_args)) } } else { quote! { core::result::Result::<(), ::#crate_::DekuError>::Ok(()) } diff --git a/src/attributes.rs b/src/attributes.rs index 45b70fc7..e4756666 100644 --- a/src/attributes.rs +++ b/src/attributes.rs @@ -511,7 +511,7 @@ Example: #[deku_derive(DekuRead, DekuWrite)] #[derive(Debug, PartialEq)] struct DekuTest { - #[deku(temp, temp_value = "items.len() as u8")] + #[deku(temp, temp_value = "(items.len() as u8)")] num_items: u8, #[deku(count = "num_items", endian = "big")] diff --git a/tests/test_attributes/test_temp.rs b/tests/test_attributes/test_temp.rs index 3893ad96..f5223082 100644 --- a/tests/test_attributes/test_temp.rs +++ b/tests/test_attributes/test_temp.rs @@ -6,7 +6,7 @@ fn test_temp_field_write() { #[deku_derive(DekuRead, DekuWrite)] #[derive(PartialEq, Debug)] struct TestStruct { - #[deku(temp, temp_value = "self.field_b.len() as _")] + #[deku(temp, temp_value = "(self.field_b.len() as _)")] field_a: u8, #[deku(count = "field_a")] field_b: Vec, @@ -88,7 +88,7 @@ fn test_temp_field_unnamed_write() { #[deku_derive(DekuRead, DekuWrite)] #[derive(PartialEq, Debug)] struct TestStruct( - #[deku(temp, temp_value = "self.0.len() as _")] u8, + #[deku(temp, temp_value = "(self.0.len() as _)")] u8, #[deku(count = "field_0")] Vec, ); @@ -160,3 +160,33 @@ fn test_temp_enum_field_write() { let ret_write: Vec = TestEnum::VarB(0x10).to_bytes().unwrap(); assert_eq!(test_data, ret_write); } + +#[test] +fn test_context() { + use deku::prelude::*; + use std::convert::TryInto; + + #[deku_derive(DekuRead, DekuWrite)] + #[derive(Debug, PartialEq)] + #[deku(ctx = "_field1: u8, _field2: u8")] + struct Child {} + + #[deku_derive(DekuRead, DekuWrite)] + #[derive(Debug, PartialEq)] + struct Parent { + pub field1: u8, + + #[deku(temp, temp_value = "self.field1")] + pub field2: u8, + + #[deku(ctx = "*field1, *field2")] + pub field3: Child, + } + + let value = Parent { + field1: 0x01, + field3: Child {}, + }; + let value: Vec = value.try_into().unwrap(); + assert_eq!(vec![0x01, 0x01], value); +}