1use super::*;
2use crate::{base::Header, element::Element, functional::Encode};
3use std::io::{Read, Write};
4
5pub trait ReadFrom: Sized {
8 fn read_from<R: Read>(r: &mut R) -> Result<Self>;
10}
11
12pub trait ReadElement: Sized + Element {
14 fn read_element<R: Read>(header: &Header, r: &mut R) -> Result<Self> {
16 let body = header.read_body(r)?;
17 Self::decode_body(&mut &body[..])
18 }
19}
20impl<T: Element> ReadElement for T {}
21
22pub trait ReadUntil: Sized {
24 fn read_until<R: Read>(r: &mut R) -> Result<Self>;
26}
27
28pub trait WriteTo {
30 fn write_to<W: Write>(&self, w: &mut W) -> Result<()>;
32}
33
34impl<T: Encode> WriteTo for T {
35 fn write_to<W: Write>(&self, w: &mut W) -> Result<()> {
36 let mut buf = vec![];
38 self.encode(&mut buf)?;
39 w.write_all(&buf)?;
40 Ok(())
41 }
42}
43
44pub trait ReadExt: Read {
46 fn read_u8(&mut self) -> Result<u8> {
48 let mut buf = [0u8; 1];
49 self.read_exact(&mut buf)?;
50 Ok(buf[0])
51 }
52}
53impl<T: Read> ReadExt for T {}