From d1e2985ce81443c4d0ca5d86741cdebb21f9ac5f Mon Sep 17 00:00:00 2001 From: sander2 Date: Wed, 12 Jan 2022 17:46:24 +0100 Subject: [PATCH] fix: use index override when decoding enums in events (#382) * fix: use index override when decoding enums in events * fix: ignore clippy warning in test Co-authored-by: Niklas Adolfsson Co-authored-by: Niklas Adolfsson --- src/events.rs | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/events.rs b/src/events.rs index 15b74dca6f..082f1e0189 100644 --- a/src/events.rs +++ b/src/events.rs @@ -187,13 +187,13 @@ where TypeDef::Variant(variant) => { let variant_index = u8::decode(input)?; variant_index.encode_to(output); - let variant = - variant - .variants() - .get(variant_index as usize) - .ok_or_else(|| { - Error::Other(format!("Variant {} not found", variant_index)) - })?; + let variant = variant + .variants() + .iter() + .find(|v| v.index() == variant_index) + .ok_or_else(|| { + Error::Other(format!("Variant {} not found", variant_index)) + })?; for field in variant.fields() { self.decode_type(field.ty().id(), input, output)?; } @@ -522,4 +522,36 @@ mod tests { assert_eq!(events[0].1.variant_index, encoded_event[0]); assert_eq!(events[0].1.data.0, encoded_event[1..]); } + + #[test] + fn event_containing_explicit_index() { + #[derive(Clone, Encode, TypeInfo)] + #[repr(u8)] + #[allow(trivial_numeric_casts, clippy::unnecessary_cast)] // required because the Encode derive produces a warning otherwise + pub enum MyType { + B = 10u8, + } + + #[derive(Clone, Encode, TypeInfo)] + enum Event { + A(MyType), + } + + let pallet_index = 0; + let pallet = pallet_metadata::(pallet_index); + let decoder = init_decoder(vec![pallet]); + + let event = Event::A(MyType::B); + let encoded_event = event.encode(); + let event_records = vec![event_record(pallet_index, event)]; + + let mut input = Vec::new(); + event_records.encode_to(&mut input); + + // this would panic if the explicit enum item index were not correctly used + let events = decoder.decode_events(&mut &input[..]).unwrap(); + + assert_eq!(events[0].1.variant_index, encoded_event[0]); + assert_eq!(events[0].1.data.0, encoded_event[1..]); + } }