1use std::{array, iter};
2
3pub trait Reader {
5 fn read_byte(&mut self) -> u8;
7
8 fn try_read_byte(&mut self) -> Option<u8>;
10}
11
12pub trait ReaderHelper {
13 fn read<T>(&mut self) -> T
14 where
15 T: Readable;
16}
17
18impl ReaderHelper for dyn Reader + '_ {
19 fn read<T>(&mut self) -> T
20 where
21 T: Readable,
22 {
23 T::read(self)
24 }
25}
26
27pub trait Readable {
29 fn read(rx: &mut dyn Reader) -> Self;
30}
31
32impl Readable for u8 {
33 fn read(rx: &mut dyn Reader) -> Self {
34 rx.read_byte()
35 }
36}
37
38impl Readable for Option<u8> {
39 fn read(rx: &mut dyn Reader) -> Self {
40 rx.try_read_byte()
41 }
42}
43
44impl<const N: usize> Readable for [u8; N] {
45 fn read(rx: &mut dyn Reader) -> Self {
46 array::from_fn(|_| rx.read())
47 }
48}
49
50impl Readable for Vec<u8> {
51 fn read(rx: &mut dyn Reader) -> Self {
52 iter::from_fn(|| rx.try_read_byte()).collect()
53 }
54}
55
56impl Readable for String {
57 fn read(rx: &mut dyn Reader) -> Self {
58 let bytes: Vec<u8> = Readable::read(rx);
59
60 String::from_utf8_lossy(&bytes).to_string()
61 }
62}