mkv_element/functional/
coding.rs

1//! Encoding and decoding Element or other types from buffers in memory.
2
3use super::*;
4use crate::{Result, base::Header, element::Element, error::Error};
5
6/// Decode an element from a buffer.
7pub trait Decode: Sized {
8    /// Decode an element from the buffer.
9    fn decode(buf: &mut &[u8]) -> Result<Self>;
10}
11
12/// Decode an element using the provided header
13pub trait DecodeElement: Sized + Element {
14    /// Decode an element using the provided header
15    /// implemented for all `Element`s.
16    fn decode_element(header: &Header, buf: &mut &[u8]) -> Result<Self> {
17        let size = *header.size as usize;
18        if size > buf.remaining() {
19            return Err(crate::error::Error::OutOfBounds);
20        }
21        let mut body = buf.slice(size);
22        let element = match Self::decode_body(&mut body) {
23            Ok(e) => e,
24            Err(Error::OutOfBounds) => return Err(Error::OverDecode(Self::ID)),
25            Err(Error::ShortRead) => return Err(Error::UnderDecode(Self::ID)),
26            Err(e) => return Err(e),
27        };
28
29        if body.has_remaining() {
30            return Err(Error::UnderDecode(Self::ID));
31        }
32
33        buf.advance(size);
34        Ok(element)
35    }
36}
37impl<T: Element> DecodeElement for T {}
38
39impl<const N: usize> Decode for [u8; N] {
40    fn decode(buf: &mut &[u8]) -> Result<Self> {
41        if buf.len() < N {
42            return Err(Error::OutOfBounds);
43        }
44        let mut v = [0u8; N];
45        v.copy_from_slice(buf.slice(N));
46        buf.advance(N);
47        Ok(v)
48    }
49}
50
51impl Decode for u8 {
52    fn decode(buf: &mut &[u8]) -> Result<Self> {
53        Ok(Self::from_be_bytes(<[u8; 1]>::decode(buf)?))
54    }
55}
56
57impl Decode for i8 {
58    fn decode(buf: &mut &[u8]) -> Result<Self> {
59        Ok(Self::from_be_bytes(<[u8; 1]>::decode(buf)?))
60    }
61}
62
63impl Decode for u16 {
64    fn decode(buf: &mut &[u8]) -> Result<Self> {
65        Ok(Self::from_be_bytes(<[u8; 2]>::decode(buf)?))
66    }
67}
68
69impl Decode for i16 {
70    fn decode(buf: &mut &[u8]) -> Result<Self> {
71        Ok(Self::from_be_bytes(<[u8; 2]>::decode(buf)?))
72    }
73}
74
75impl Decode for u32 {
76    fn decode(buf: &mut &[u8]) -> Result<Self> {
77        Ok(Self::from_be_bytes(<[u8; 4]>::decode(buf)?))
78    }
79}
80
81impl Decode for i32 {
82    fn decode(buf: &mut &[u8]) -> Result<Self> {
83        Ok(Self::from_be_bytes(<[u8; 4]>::decode(buf)?))
84    }
85}
86
87impl Decode for u64 {
88    fn decode(buf: &mut &[u8]) -> Result<Self> {
89        Ok(Self::from_be_bytes(<[u8; 8]>::decode(buf)?))
90    }
91}
92
93impl Decode for i64 {
94    fn decode(buf: &mut &[u8]) -> Result<Self> {
95        Ok(Self::from_be_bytes(<[u8; 8]>::decode(buf)?))
96    }
97}
98
99impl<T: Decode> Decode for Vec<T> {
100    fn decode(buf: &mut &[u8]) -> Result<Self> {
101        let mut vec = Vec::new();
102        while buf.has_remaining() {
103            let item = T::decode(buf)?;
104            vec.push(item);
105        }
106        Ok(vec)
107    }
108}
109
110/// Encode an element to a buffer.
111pub trait Encode {
112    /// Encode self to the buffer.
113    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()>;
114}
115
116impl Encode for u8 {
117    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
118        self.to_be_bytes().encode(buf)
119    }
120}
121
122impl Encode for i8 {
123    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
124        self.to_be_bytes().encode(buf)
125    }
126}
127
128impl Encode for i16 {
129    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
130        self.to_be_bytes().encode(buf)
131    }
132}
133
134impl Encode for u16 {
135    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
136        self.to_be_bytes().encode(buf)
137    }
138}
139
140impl Encode for u32 {
141    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
142        self.to_be_bytes().encode(buf)
143    }
144}
145
146impl Encode for i32 {
147    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
148        self.to_be_bytes().encode(buf)
149    }
150}
151
152impl Encode for u64 {
153    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
154        self.to_be_bytes().encode(buf)
155    }
156}
157
158impl Encode for i64 {
159    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
160        self.to_be_bytes().encode(buf)
161    }
162}
163
164impl<const N: usize> Encode for [u8; N] {
165    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
166        buf.append_slice(self);
167        Ok(())
168    }
169}
170
171impl<T: Encode> Encode for &[T] {
172    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
173        for item in self.iter() {
174            item.encode(buf)?;
175        }
176
177        Ok(())
178    }
179}
180
181impl<T: Encode> Encode for Option<T> {
182    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
183        match self {
184            Some(v) => v.encode(buf),
185            None => Ok(()),
186        }
187    }
188}
189
190impl Encode for &str {
191    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
192        self.as_bytes().encode(buf)?;
193        0u8.encode(buf)?;
194        Ok(())
195    }
196}
197
198impl<T: Encode> Encode for Vec<T> {
199    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
200        for item in self.iter() {
201            item.encode(buf)?;
202        }
203
204        Ok(())
205    }
206}