Skip to content

Commit

Permalink
Pass temp value as ref into ctx.
Browse files Browse the repository at this point in the history
  • Loading branch information
SneakyBerry committed Jul 25, 2023
1 parent d045596 commit 55b44fb
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 5 deletions.
4 changes: 2 additions & 2 deletions deku-derive/src/macros/deku_write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(()) }
Expand Down
2 changes: 1 addition & 1 deletion src/attributes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down
34 changes: 32 additions & 2 deletions tests/test_attributes/test_temp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<u8>,
Expand Down Expand Up @@ -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<u8>,
);

Expand Down Expand Up @@ -160,3 +160,33 @@ fn test_temp_enum_field_write() {
let ret_write: Vec<u8> = 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<u8> = value.try_into().unwrap();
assert_eq!(vec![0x01, 0x01], value);
}

0 comments on commit 55b44fb

Please sign in to comment.