fix for raw struct

This commit is contained in:
Nikolay Volf 2016-04-20 19:10:41 +03:00
parent 8b1197b335
commit e3c20e1c64
2 changed files with 13 additions and 9 deletions

View File

@ -167,7 +167,10 @@ fn binary_expr_struct(
) -> Result<BinaryExpressions, Error> { ) -> Result<BinaryExpressions, Error> {
let size_exprs: Vec<P<ast::Expr>> = fields.iter().enumerate().map(|(index, field)| { let size_exprs: Vec<P<ast::Expr>> = fields.iter().enumerate().map(|(index, field)| {
let index_ident = builder.id(format!("__field{}", index)); let index_ident = builder.id(format!("__field{}", index));
value_ident.and_then(|x| Some(quote_expr!(cx, $x . $index_ident .size()))) value_ident.and_then(|x| {
let field_id = builder.id(field.ident.unwrap());
Some(quote_expr!(cx, $x . $field_id .size()))
})
.unwrap_or_else(|| quote_expr!(cx, $index_ident .size())) .unwrap_or_else(|| quote_expr!(cx, $index_ident .size()))
}).collect(); }).collect();
@ -184,9 +187,9 @@ fn binary_expr_struct(
write_stmts.push(quote_stmt!(cx, let next_line = offset + $size_expr; ).unwrap()); write_stmts.push(quote_stmt!(cx, let next_line = offset + $size_expr; ).unwrap());
match value_ident { match value_ident {
Some(x) => { Some(x) => {
let index_ident = builder.id(format!("{}", index)); let field_id = builder.id(field.ident.unwrap());
write_stmts.push( write_stmts.push(
quote_stmt!(cx, $x . $index_ident .to_bytes(&mut buffer[offset..next_line]);).unwrap()) quote_stmt!(cx, $x . $field_id .to_bytes(&mut buffer[offset..next_line]);).unwrap())
}, },
None => { None => {
let index_ident = builder.id(format!("__field{}", index)); let index_ident = builder.id(format!("__field{}", index));
@ -370,11 +373,5 @@ fn binary_expr_variant(
read: quote_arm!(cx, $pat => { $read_expr } ), read: quote_arm!(cx, $pat => { $read_expr } ),
}) })
}, },
// _ => {
// cx.span_bug(span,
// &format!("#[derive(Binary)] Unsupported enum variant content, expected tuple/struct, found: {:?}",
// variant));
// Err(Error)
// },
} }
} }

View File

@ -25,3 +25,10 @@ enum Root {
number2: u64, number2: u64,
}, },
} }
#[derive(Binary)]
struct DoubleRoot {
x1: u32,
x2: u64,
x3: u32,
}