encdec_base/decode/
prefixed.rs1use core::fmt::Debug;
2
3use super::Decode;
4use crate::Error;
5
6pub trait DecodePrefixed<'a, P: Decode<'a>> {
8 type Output: Debug;
10
11 type Error: Debug;
13
14 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 let (len, n) = P::decode(&buff)?;
35 index += n;
36
37 let (b, n) = T::decode(&buff[index..][..len.as_()])?;
39 index += n;
40
41 Ok((b, index))
42 }
43}