encdec_base/decode/
prefixed.rs

1use core::fmt::Debug;
2
3use super::Decode;
4use crate::Error;
5
6/// Decode helper trait for fields with length prefixes
7pub trait DecodePrefixed<'a, P: Decode<'a>> {
8    /// Output type (required for lifetime bounds)
9    type Output: Debug;
10
11    /// Error type returned on parse error
12    type Error: Debug;
13
14    /// Decode consumes a slice and returns an object
15    fn decode_prefixed(buff: &'a [u8]) -> Result<(Self::Output, usize), Self::Error>;
16}
17
18impl<'a, T, P> DecodePrefixed<'a, P> for T
19where
20    T: Decode<'a>,
21    P: Decode<'a, Error = Error>,
22    <P as Decode<'a>>::Output: num_traits::AsPrimitive<usize>,
23    <T as Decode<'a>>::Error: From<Error>,
24{
25    type Output = <T as Decode<'a>>::Output;
26    type Error = <T as Decode<'a>>::Error;
27
28    fn decode_prefixed(buff: &'a [u8]) -> Result<(Self::Output, usize), Self::Error> {
29        use num_traits::AsPrimitive;
30
31        let mut index = 0;
32
33        // First, decode prefix
34        let (len, n) = P::decode(&buff)?;
35        index += n;
36
37        // Then, decode the body using this length
38        let (b, n) = T::decode(&buff[index..][..len.as_()])?;
39        index += n;
40
41        Ok((b, index))
42    }
43}