mkv_element/functional/
coding.rs1use super::*;
4use crate::{Result, base::Header, element::Element, error::Error};
5
6pub trait Decode: Sized {
8 fn decode(buf: &mut &[u8]) -> Result<Self>;
10}
11
12pub trait DecodeElement: Sized + Element {
14 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
110pub trait Encode {
112 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}