Skip to content

Commit 6008934

Browse files
committed
feat: exporting a list of struct fields
1 parent b01477d commit 6008934

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

raw_struct/src/view.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::CopyConstructable;
77

88
pub trait Viewable {
99
fn name() -> &'static str;
10-
// fn fields() -> &'static [&'static dyn ViewableField];
10+
fn fields() -> &'static [&'static dyn ViewableField];
1111
}
1212

1313
pub trait ViewableSized: Viewable {

raw_struct/tests/metadata.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use raw_struct::{
2+
raw_struct,
3+
Viewable,
4+
};
5+
6+
#[test]
7+
fn test_struct_metadata() {
8+
#[raw_struct]
9+
struct MyStruct {
10+
#[field(0x00)]
11+
pub FieldA: u32,
12+
13+
#[field(0x08)]
14+
pub FieldB: u32,
15+
16+
#[field(0xEB)]
17+
pub FieldX: u8,
18+
}
19+
20+
assert_eq!(MyStruct::name(), "MyStruct");
21+
22+
let fields = MyStruct::fields()
23+
.iter()
24+
.map(|field| format!("{:X}->{}", field.offset(), field.name()))
25+
.collect::<Vec<_>>();
26+
27+
assert_eq!(fields, &["0->FieldA", "8->FieldB", "EB->FieldX"]);
28+
}

raw_struct_derive/src/derive_raw_struct.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,12 @@ pub fn raw_struct(attr: TokenStream, input: TokenStream) -> Result<TokenStream>
234234
let (impl_generics, ty_generics, where_clause) = target.generics.split_for_impl();
235235

236236
let struct_def = self::generate_struct_definition(&args, &target)?;
237+
let field_names = target
238+
.fields
239+
.iter()
240+
.filter_map(|field| field.ident.clone())
241+
.map(|ident| quote! { Self:: #ident })
242+
.collect::<Vec<_>>();
237243

238244
let sized_impl = args.memory.map(|memory| quote! {
239245
impl #impl_generics ::raw_struct::ViewableSized for #struct_name #ty_generics #where_clause {
@@ -252,6 +258,10 @@ pub fn raw_struct(attr: TokenStream, input: TokenStream) -> Result<TokenStream>
252258
fn name() -> &'static str {
253259
#struct_name_str
254260
}
261+
262+
fn fields() -> &'static [&'static dyn ::raw_struct::ViewableField] {
263+
&[ #(#field_names,)* ]
264+
}
255265
}
256266

257267
#sized_impl

0 commit comments

Comments
 (0)