diff --git a/src/events.rs b/src/events.rs index e8ae9146c50..e7f45295d6a 100644 --- a/src/events.rs +++ b/src/events.rs @@ -156,8 +156,11 @@ impl EventsDecoder { } EventArg::Option(arg) => { match input.read_byte()? { - 0 => (), - 1 => self.decode_raw_bytes(&[*arg.clone()], input, output)?, + 0 => output.push_byte(0), + 1 => { + output.push_byte(1); + self.decode_raw_bytes(&[*arg.clone()], input, output)? + } _ => { return Err(Error::Other( "unexpected first byte decoding Option".into(), @@ -247,3 +250,31 @@ pub enum Raw { Event(RawEvent), Error(RuntimeError), } + +#[cfg(test)] +mod tests { + use super::*; + + type TestRuntime = crate::NodeTemplateRuntime; + + #[test] + fn test_decode_option() { + let decoder = EventsDecoder::::new(Metadata::default()); + + let value = Some(0u8); + let input = value.encode(); + let mut output = Vec::::new(); + + decoder + .decode_raw_bytes( + &[EventArg::Option(Box::new(EventArg::Primitive( + "u8".to_string(), + )))], + &mut &input[..], + &mut output, + ) + .unwrap(); + + assert_eq!(output, vec![1, 0]); + } +} diff --git a/src/metadata.rs b/src/metadata.rs index 176db3aa99e..8aaa0290af6 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -73,7 +73,7 @@ pub enum MetadataError { } /// Runtime metadata. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub struct Metadata { modules: HashMap, modules_with_calls: HashMap,