Loading tools/pdl/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,10 @@ rust_test_host { "tests/generated/packet_decl_complex_scalars_little_endian.rs", "tests/generated/packet_decl_empty_big_endian.rs", "tests/generated/packet_decl_empty_little_endian.rs", "tests/generated/packet_decl_fixed_enum_field_big_endian.rs", "tests/generated/packet_decl_fixed_enum_field_little_endian.rs", "tests/generated/packet_decl_fixed_scalar_field_big_endian.rs", "tests/generated/packet_decl_fixed_scalar_field_little_endian.rs", "tests/generated/packet_decl_mask_scalar_value_big_endian.rs", "tests/generated/packet_decl_mask_scalar_value_little_endian.rs", "tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs", Loading tools/pdl/src/ast.rs +4 −1 Original line number Diff line number Diff line Loading @@ -350,7 +350,10 @@ impl<A: Annotation> Field<A> { | FieldDesc::Size { width, .. } | FieldDesc::Count { width, .. } | FieldDesc::ElementSize { width, .. } | FieldDesc::Reserved { width, .. } => Some(*width), | FieldDesc::Reserved { width, .. } | FieldDesc::FixedScalar { width, .. } => Some(*width), FieldDesc::FixedEnum { .. } => self.declaration(scope)?.width(scope, false), FieldDesc::Padding { .. } => todo!(), FieldDesc::Array { size: Some(size), width, .. } => { let width = width.or_else(|| self.declaration(scope)?.width(scope, false))?; Some(width * size) Loading tools/pdl/src/backends/rust.rs +25 −0 Original line number Diff line number Diff line Loading @@ -583,4 +583,29 @@ mod tests { } " ); test_pdl!( packet_decl_fixed_scalar_field, " packet Foo { _fixed_ = 7 : 7, b: 57, } " ); test_pdl!( packet_decl_fixed_enum_field, " enum Enum7 : 7 { A = 1, B = 2, } packet Foo { _fixed_ = A : Enum7, b: 57, } " ); } tools/pdl/src/backends/rust/parser.rs +23 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,29 @@ impl<'a> FieldParser<'a> { let #id = #v; } } ast::FieldDesc::FixedEnum { enum_id, tag_id, .. } => { let enum_id = format_ident!("{enum_id}"); let tag_id = format_ident!("{tag_id}"); quote! { if #v != #enum_id::#tag_id as #value_type { return Err(Error::InvalidFixedValue { expected: #enum_id::#tag_id as u64, actual: #v as u64, }); } } } ast::FieldDesc::FixedScalar { value, .. } => { let value = proc_macro2::Literal::usize_unsuffixed(*value); quote! { if #v != #value { return Err(Error::InvalidFixedValue { expected: #value, actual: #v as u64, }); } } } ast::FieldDesc::Typedef { id, type_id } => { let id = format_ident!("{id}"); let type_id = format_ident!("{type_id}"); Loading tools/pdl/src/backends/rust/preamble.rs +2 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ pub fn generate(path: &Path) -> String { InvalidPacketError, #[error("{field} was {value:x}, which is not known")] ConstraintOutOfBounds { field: String, value: u64 }, #[error("Got {actual:x}, expected {expected:x}")] InvalidFixedValue { expected: u64, actual: u64 }, #[error("when parsing {obj} needed length of {wanted} but got {got}")] InvalidLengthError { obj: String, wanted: usize, got: usize }, #[error("array size ({array} bytes) is not a multiple of the element size ({element} bytes)")] Loading Loading
tools/pdl/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,10 @@ rust_test_host { "tests/generated/packet_decl_complex_scalars_little_endian.rs", "tests/generated/packet_decl_empty_big_endian.rs", "tests/generated/packet_decl_empty_little_endian.rs", "tests/generated/packet_decl_fixed_enum_field_big_endian.rs", "tests/generated/packet_decl_fixed_enum_field_little_endian.rs", "tests/generated/packet_decl_fixed_scalar_field_big_endian.rs", "tests/generated/packet_decl_fixed_scalar_field_little_endian.rs", "tests/generated/packet_decl_mask_scalar_value_big_endian.rs", "tests/generated/packet_decl_mask_scalar_value_little_endian.rs", "tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs", Loading
tools/pdl/src/ast.rs +4 −1 Original line number Diff line number Diff line Loading @@ -350,7 +350,10 @@ impl<A: Annotation> Field<A> { | FieldDesc::Size { width, .. } | FieldDesc::Count { width, .. } | FieldDesc::ElementSize { width, .. } | FieldDesc::Reserved { width, .. } => Some(*width), | FieldDesc::Reserved { width, .. } | FieldDesc::FixedScalar { width, .. } => Some(*width), FieldDesc::FixedEnum { .. } => self.declaration(scope)?.width(scope, false), FieldDesc::Padding { .. } => todo!(), FieldDesc::Array { size: Some(size), width, .. } => { let width = width.or_else(|| self.declaration(scope)?.width(scope, false))?; Some(width * size) Loading
tools/pdl/src/backends/rust.rs +25 −0 Original line number Diff line number Diff line Loading @@ -583,4 +583,29 @@ mod tests { } " ); test_pdl!( packet_decl_fixed_scalar_field, " packet Foo { _fixed_ = 7 : 7, b: 57, } " ); test_pdl!( packet_decl_fixed_enum_field, " enum Enum7 : 7 { A = 1, B = 2, } packet Foo { _fixed_ = A : Enum7, b: 57, } " ); }
tools/pdl/src/backends/rust/parser.rs +23 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,29 @@ impl<'a> FieldParser<'a> { let #id = #v; } } ast::FieldDesc::FixedEnum { enum_id, tag_id, .. } => { let enum_id = format_ident!("{enum_id}"); let tag_id = format_ident!("{tag_id}"); quote! { if #v != #enum_id::#tag_id as #value_type { return Err(Error::InvalidFixedValue { expected: #enum_id::#tag_id as u64, actual: #v as u64, }); } } } ast::FieldDesc::FixedScalar { value, .. } => { let value = proc_macro2::Literal::usize_unsuffixed(*value); quote! { if #v != #value { return Err(Error::InvalidFixedValue { expected: #value, actual: #v as u64, }); } } } ast::FieldDesc::Typedef { id, type_id } => { let id = format_ident!("{id}"); let type_id = format_ident!("{type_id}"); Loading
tools/pdl/src/backends/rust/preamble.rs +2 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ pub fn generate(path: &Path) -> String { InvalidPacketError, #[error("{field} was {value:x}, which is not known")] ConstraintOutOfBounds { field: String, value: u64 }, #[error("Got {actual:x}, expected {expected:x}")] InvalidFixedValue { expected: u64, actual: u64 }, #[error("when parsing {obj} needed length of {wanted} but got {got}")] InvalidLengthError { obj: String, wanted: usize, got: usize }, #[error("array size ({array} bytes) is not a multiple of the element size ({element} bytes)")] Loading