diff --git a/src/events.rs b/src/events.rs index 9a05de14cc516..e8ae9146c50c1 100644 --- a/src/events.rs +++ b/src/events.rs @@ -154,6 +154,17 @@ impl EventsDecoder { self.decode_raw_bytes(&[*arg.clone()], input, output)? } } + EventArg::Option(arg) => { + match input.read_byte()? { + 0 => (), + 1 => self.decode_raw_bytes(&[*arg.clone()], input, output)?, + _ => { + return Err(Error::Other( + "unexpected first byte decoding Option".into(), + )) + } + } + } EventArg::Tuple(args) => self.decode_raw_bytes(args, input, output)?, EventArg::Primitive(name) => { let result = match name.as_str() { diff --git a/src/metadata.rs b/src/metadata.rs index 3ef160cfc938b..176db3aa99e5d 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -398,6 +398,7 @@ pub enum EventArg { Primitive(String), Vec(Box), Tuple(Vec), + Option(Box), } impl FromStr for EventArg { @@ -413,6 +414,15 @@ impl FromStr for EventArg { "Expected closing `>` for `Vec`", )) } + } else if s.starts_with("Option<") { + if s.ends_with('>') { + Ok(EventArg::Option(Box::new(s[7..s.len() - 1].parse()?))) + } else { + Err(ConversionError::InvalidEventArg( + s.to_string(), + "Expected closing `>` for `Option`", + )) + } } else if s.starts_with('(') { if s.ends_with(')') { let mut args = Vec::new(); @@ -439,6 +449,7 @@ impl EventArg { match self { EventArg::Primitive(p) => vec![p.clone()], EventArg::Vec(arg) => arg.primitives(), + EventArg::Option(arg) => arg.primitives(), EventArg::Tuple(args) => { let mut primitives = Vec::new(); for arg in args {