+/// A wrapper for reading a message as a TLV stream `T` from a byte sequence, while still
+/// maintaining ownership of the bytes for later use.
+pub(super) struct ParsedMessage<T: SeekReadable> {
+ pub bytes: Vec<u8>,
+ pub tlv_stream: T,
+}
+
+impl<T: SeekReadable> TryFrom<Vec<u8>> for ParsedMessage<T> {
+ type Error = DecodeError;
+
+ fn try_from(bytes: Vec<u8>) -> Result<Self, Self::Error> {
+ let mut cursor = io::Cursor::new(bytes);
+ let tlv_stream: T = SeekReadable::read(&mut cursor)?;
+
+ // Ensure that there are no more TLV records left to parse.
+ if cursor.position() < cursor.get_ref().len() as u64 {
+ return Err(DecodeError::InvalidValue);
+ }
+
+ let bytes = cursor.into_inner();
+ Ok(Self { bytes, tlv_stream })
+ }
+}
+