diff --git a/lib/src/packstream/de.rs b/lib/src/packstream/de.rs index 89435696..f723448d 100644 --- a/lib/src/packstream/de.rs +++ b/lib/src/packstream/de.rs @@ -377,6 +377,9 @@ impl<'a, 'de> SeqAccess<'de> for ItemsParser<'a> { self.len -= 1; let bytes = self.bytes.get(); + if bytes.is_empty() { + return Ok(None); + } seed.deserialize(Deserializer { bytes }).map(Some) } @@ -398,6 +401,9 @@ impl<'a, 'de> MapAccess<'de> for ItemsParser<'a> { self.len -= 1; let bytes = self.bytes.get(); + if bytes.is_empty() { + return Ok(None); + } seed.deserialize(Deserializer { bytes }).map(Some) } diff --git a/lib/src/packstream/mod.rs b/lib/src/packstream/mod.rs index cf19a1e5..b199dff7 100644 --- a/lib/src/packstream/mod.rs +++ b/lib/src/packstream/mod.rs @@ -611,4 +611,24 @@ mod tests { let expected = Bytes::copy_from_slice(input); assert_eq!(actual, expected); } + + #[test] + fn dont_fail_on_wrong_lengths() { + let wrong_list = bolt() + .tiny_list(3) // says it's three elements + .tiny_int(42) // but it's not + .build(); + + assert_eq!(from_bytes::>(wrong_list).unwrap(), vec![42]); + + let wrong_map = bolt() + .tiny_map(3) // says it's three elements + .tiny_string("key") // but it's not + .tiny_int(42) + .build(); + + let data = from_bytes::>(wrong_map).unwrap(); + assert_eq!(data.len(), 1); + assert_eq!(data.get("key").copied(), Some(42)); + } }