From f568eca7076f4c0e0946ac0a0d18a243d72752ee Mon Sep 17 00:00:00 2001 From: wcampbell Date: Tue, 16 Jan 2024 08:48:50 -0500 Subject: [PATCH] Fix unknown id Type for EnumExt::deku_id() (#398) * Fix unknown id Type for EnumExt::deku_id() Remove unwrap causing the following error when the EnumExt tried to infer what type is was to return. An attribute could be added in the future to aid this, but for now we will just not emit the deku_id() for this type of enum. I decided in other causes (which aren't tested), to also remove the error and just not emit the function also. help: message: called `Result::unwrap()` on an `Err` value: Error("expected `,`") See #397 * clippy --------- Co-authored-by: Emmanuel Thompson --- deku-derive/src/macros/deku_read.rs | 8 +------- deku-derive/src/macros/mod.rs | 4 +++- tests/test_regression.rs | 32 +++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/deku-derive/src/macros/deku_read.rs b/deku-derive/src/macros/deku_read.rs index 9e7a788d..d5b20d05 100644 --- a/deku-derive/src/macros/deku_read.rs +++ b/deku-derive/src/macros/deku_read.rs @@ -4,7 +4,6 @@ use darling::ast::{Data, Fields}; use darling::ToTokens; use proc_macro2::TokenStream; use quote::quote; -use syn::spanned::Spanned; use crate::macros::{ gen_ctx_types_and_arg, gen_field_args, gen_internal_field_ident, gen_internal_field_idents, @@ -397,12 +396,7 @@ fn emit_enum(input: &DekuData) -> Result { let deku_id_type = if let Some(id_type) = id_type { Some(quote! {#id_type}) } else if let (Some(ctx), Some(id)) = (input.ctx.as_ref(), input.id.as_ref()) { - Some(gen_type_from_ctx_id(ctx, id).ok_or_else(|| { - syn::Error::new( - id.span(), - "DekuReader: cannot determine `id` type from `ctx`", - ) - })?) + gen_type_from_ctx_id(ctx, id) } else { None }; diff --git a/deku-derive/src/macros/mod.rs b/deku-derive/src/macros/mod.rs index b24d0ba2..2fa865c3 100644 --- a/deku-derive/src/macros/mod.rs +++ b/deku-derive/src/macros/mod.rs @@ -199,7 +199,9 @@ fn gen_type_from_ctx_id( id: &crate::Id, ) -> Option { let parser = Punctuated::::parse_terminated; - let s = parser.parse(id.to_token_stream().into()).unwrap(); + let Ok(s) = parser.parse(id.to_token_stream().into()) else { + return None; + }; let mut matching_types = quote! {}; for s in s { let id = syn::Ident::new(&s.to_string(), id.span()); diff --git a/tests/test_regression.rs b/tests/test_regression.rs index c3afb70d..84ff9904 100644 --- a/tests/test_regression.rs +++ b/tests/test_regression.rs @@ -359,3 +359,35 @@ fn issue_310() { #[derive(DekuRead, DekuWrite)] struct Test {} } + +#[test] +fn issue_397() { + use deku::prelude::*; + + #[derive(Debug, Copy, Clone, PartialEq, DekuRead, DekuWrite)] + struct Header { + kind: PacketType, + } + + #[derive(Debug, Copy, Clone, PartialEq, DekuRead, DekuWrite)] + #[deku(type = "u8", endian = "big")] + enum PacketType { + #[deku(id = 0)] + Zero, + } + + #[derive(Debug, Copy, Clone, PartialEq, DekuRead, DekuWrite)] + struct Packet { + header: Header, + #[deku(ctx = "header")] + payload: Payload, + } + + #[derive(Debug, Copy, Clone, PartialEq, DekuRead, DekuWrite)] + #[deku(ctx = "header: &Header", id = "header.kind")] + enum Payload { + #[deku(id = "PacketType::Zero")] + Zero(u8), + } + let _ = Packet::from_bytes((&[0x00, 0x01], 0)); +}