Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 92fe6c7

Browse files
Merge 54edfbe into f2aeeb1
2 parents f2aeeb1 + 54edfbe commit 92fe6c7

4 files changed

Lines changed: 55 additions & 0 deletions

File tree

deku-derive/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ enum Id {
2525
TokenStream(TokenStream),
2626
LitByteStr(syn::LitByteStr),
2727
Int(syn::LitInt),
28+
Bool(syn::LitBool),
2829
}
2930

3031
impl Display for Id {
@@ -39,6 +40,7 @@ impl ToTokens for Id {
3940
Id::TokenStream(v) => v.to_tokens(tokens),
4041
Id::LitByteStr(v) => v.to_tokens(tokens),
4142
Id::Int(v) => v.to_tokens(tokens),
43+
Id::Bool(v) => v.to_tokens(tokens),
4244
}
4345
}
4446
}
@@ -53,6 +55,7 @@ impl FromMeta for Id {
5355
.expect("could not parse token stream"),
5456
)),
5557
syn::Lit::Int(ref s) => Ok(Id::Int(s.clone())),
58+
syn::Lit::Bool(ref s) => Ok(Id::Bool(s.clone())),
5659
syn::Lit::ByteStr(ref s) => Ok(Id::LitByteStr(s.clone())),
5760
_ => Err(darling::Error::unexpected_lit_type(value)),
5861
})

deku-derive/src/macros/deku_read.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
233233
Id::TokenStream(v) => quote! {&#v}.into_token_stream(),
234234
Id::LitByteStr(v) => v.into_token_stream(),
235235
Id::Int(v) => v.into_token_stream(),
236+
Id::Bool(v) => v.into_token_stream(),
236237
}
237238
} else if let Some(variant_id_pat) = &variant.id_pat {
238239
// If user has supplied an id, then we have an id_pat that and the id variant doesn't
@@ -285,6 +286,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
285286
let deref = match variant_id {
286287
Id::TokenStream(_) => quote! {},
287288
Id::Int(_) => quote! {},
289+
Id::Bool(_) => quote! {},
288290
Id::LitByteStr(_) => quote! {*},
289291
};
290292

deku-derive/src/macros/deku_write.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,12 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
231231
__deku_variant_id.to_writer(__deku_writer, (#id_args))?;
232232
}
233233
}
234+
Id::Bool(v) => {
235+
quote! {
236+
let mut __deku_variant_id: #id_type = #v;
237+
__deku_variant_id.to_writer(__deku_writer, (#id_args))?;
238+
}
239+
}
234240
Id::LitByteStr(v) => {
235241
quote! {
236242
let mut __deku_variant_id: #id_type = *#v;

tests/test_enum.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,3 +227,47 @@ fn test_id_pat_with_id() {
227227
assert_eq!(v, IdPatBitsTuple::B((0, 1)));
228228
assert_eq!(input, &*v.to_bytes().unwrap());
229229
}
230+
231+
#[test]
232+
fn test_litbool_as_id() {
233+
use deku::prelude::*;
234+
235+
#[derive(DekuRead, DekuWrite, Debug, PartialEq, Eq)]
236+
pub struct A {
237+
#[deku(bits = 1)]
238+
bit: bool,
239+
#[deku(ctx = "*bit")]
240+
var: Var,
241+
}
242+
243+
#[derive(DekuRead, DekuWrite, Debug, PartialEq, Eq)]
244+
#[deku(id = "bit", ctx = "bit: bool")]
245+
pub enum Var {
246+
#[deku(id = false)]
247+
False(#[deku(bits = 15)] u16),
248+
#[deku(id = true)]
249+
True(#[deku(bits = 15)] u16),
250+
}
251+
let input = [0b1000_0000, 0xff];
252+
let mut cursor = Cursor::new(input);
253+
let (_, v) = A::from_reader((&mut cursor, 0)).unwrap();
254+
assert_eq!(
255+
v,
256+
A {
257+
bit: true,
258+
var: Var::True(0x7f01),
259+
}
260+
);
261+
assert_eq!(input, &*v.to_bytes().unwrap());
262+
let input = [0b0000_0000, 0xff];
263+
let mut cursor = Cursor::new(input);
264+
let (_, v) = A::from_reader((&mut cursor, 0)).unwrap();
265+
assert_eq!(
266+
v,
267+
A {
268+
bit: false,
269+
var: Var::False(0x7f01),
270+
}
271+
);
272+
assert_eq!(input, &*v.to_bytes().unwrap());
273+
}

0 commit comments

Comments
 (0)