rust/bt-common: Add Decodable::decode_multiple
Decodes multiple decodable items that are concurrently included in a
buffer.
Change-Id: I29cb6f1ef7ba885e5733d5c231061c66103ea047
Reviewed-on: https://bluetooth-review.git.corp.google.com/c/bluetooth/+/1721
Reviewed-by: Dayeong Lee <dayeonglee@google.com>
Reviewed-by: Ani Ramakrishnan <aniramakri@google.com>
diff --git a/rust/bt-common/src/packet_encoding.rs b/rust/bt-common/src/packet_encoding.rs
index 2516dcb..9ff05d4 100644
--- a/rust/bt-common/src/packet_encoding.rs
+++ b/rust/bt-common/src/packet_encoding.rs
@@ -12,6 +12,29 @@
/// Decodes into a new object with the number of bytes that were decoded, or
/// returns an error.
fn decode(buf: &[u8]) -> ::core::result::Result<(Self, usize), Self::Error>;
+
+ /// Tries to decode a collection of a decodable item from a buffer.
+ /// If any item fails to decode, fails with an Error and the previously
+ /// decoded items.
+ /// Will only decode up to max items. If None, will decode the entire
+ /// buffer.
+ fn decode_multiple(
+ buf: &[u8],
+ max: Option<usize>,
+ ) -> ::core::result::Result<(Vec<Self>, usize), (Vec<Self>, usize, Self::Error)> {
+ let mut idx = 0;
+ let mut result = Vec::new();
+ while idx < buf.len() && Some(result.len()) != max {
+ match Self::decode(&buf[idx..]) {
+ Err(e) => return Err((result, idx, e)),
+ Ok((item, consumed)) => {
+ result.push(item);
+ idx += consumed;
+ }
+ }
+ }
+ Ok((result, idx))
+ }
}
/// An encodable type can write itself into a byte buffer.