Skip to content

Commit

Permalink
Implement Pack for enums with primitive repr
Browse files Browse the repository at this point in the history
  • Loading branch information
fwcd committed Jul 31, 2023
1 parent 4b0653e commit 5003001
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
4 changes: 3 additions & 1 deletion derive/src/pack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,11 @@ pub fn derive_pack(input: TokenStream) -> TokenStream {
Data::Enum(_) => {
let repr_type: Type = repr_type(&input)
.expect("#[derive(Pack)] currently only supports enums with a #[repr]");

// TODO: Verify that enum also derives Copy?

quote! {
self as #repr_type
(*self as #repr_type).pack::<B>(buffer)
}
},
Data::Union(_) => unimplemented!("#[derive(Pack)] is not supported for unions yet!"),
Expand Down
22 changes: 22 additions & 0 deletions tests/pack_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,25 @@ fn derived_structs() {
assert_eq!(pack_vec::<BigEndian, _>(Unit), vec![]);
}

#[test]
fn derived_enums() {
#[derive(Size, Pack, Clone, Copy)]
#[repr(u8)]
#[allow(dead_code)]
enum X {
A = 1,
B = 4,
C = 8,
}

#[derive(Size, Pack, Clone, Copy)]
#[repr(i32)]
#[allow(dead_code)]
enum Y {
A = -9,
}

assert_eq!(pack_vec::<BigEndian, _>(X::A), vec![1]);
assert_eq!(pack_vec::<BigEndian, _>(X::B), vec![4]);
assert_eq!(pack_vec::<BigEndian, _>(X::C), vec![8]);
}

0 comments on commit 5003001

Please sign in to comment.