bufferfish_core/
decodable.rs

1//! Base trait for types that can be decoded from a `Bufferfish`. Implements decoding for primitive types.
2
3use crate::{Bufferfish, BufferfishError};
4
5/// Types implementing this trait are able to be decoded from a `Bufferfish`.
6pub trait Decodable: Sized {
7    /// Decode the type from a `Bufferfish`.
8    fn decode(bf: &mut Bufferfish) -> Result<Self, BufferfishError>;
9}
10
11impl Decodable for u8 {
12    fn decode(bf: &mut Bufferfish) -> Result<u8, BufferfishError> {
13        bf.read_u8().map_err(BufferfishError::from)
14    }
15}
16
17impl Decodable for u16 {
18    fn decode(bf: &mut Bufferfish) -> Result<u16, BufferfishError> {
19        bf.read_u16().map_err(BufferfishError::from)
20    }
21}
22
23impl Decodable for u32 {
24    fn decode(bf: &mut Bufferfish) -> Result<u32, BufferfishError> {
25        bf.read_u32().map_err(BufferfishError::from)
26    }
27}
28
29impl Decodable for i8 {
30    fn decode(bf: &mut Bufferfish) -> Result<i8, BufferfishError> {
31        bf.read_i8().map_err(BufferfishError::from)
32    }
33}
34
35impl Decodable for i16 {
36    fn decode(bf: &mut Bufferfish) -> Result<i16, BufferfishError> {
37        bf.read_i16().map_err(BufferfishError::from)
38    }
39}
40
41impl Decodable for i32 {
42    fn decode(bf: &mut Bufferfish) -> Result<i32, BufferfishError> {
43        bf.read_i32().map_err(BufferfishError::from)
44    }
45}
46
47impl Decodable for bool {
48    fn decode(bf: &mut Bufferfish) -> Result<bool, BufferfishError> {
49        bf.read_bool().map_err(BufferfishError::from)
50    }
51}
52
53impl Decodable for String {
54    fn decode(bf: &mut Bufferfish) -> Result<String, BufferfishError> {
55        bf.read_string().map_err(BufferfishError::from)
56    }
57}
58
59impl<T: Decodable> Decodable for Vec<T> {
60    fn decode(bf: &mut Bufferfish) -> Result<Vec<T>, BufferfishError> {
61        let len = bf.read_u16()? as usize;
62        let mut vec = Vec::with_capacity(len);
63        for _ in 0..len {
64            vec.push(T::decode(bf)?);
65        }
66        Ok(vec)
67    }
68}