1pub trait Writer {
3 fn write_byte(&mut self, value: u8);
4}
5
6pub trait WriterHelper {
7 fn write<T>(&mut self, value: T)
8 where
9 T: Writable;
10}
11
12impl WriterHelper for dyn Writer + '_ {
13 fn write<T>(&mut self, value: T)
14 where
15 T: Writable,
16 {
17 value.write(self);
18 }
19}
20
21pub trait Writable {
23 fn write(&self, tx: &mut dyn Writer);
24}
25
26impl<T> Writable for &T
27where
28 T: Writable + ?Sized,
29{
30 fn write(&self, tx: &mut dyn Writer) {
31 T::write(self, tx)
32 }
33}
34
35impl Writable for u8 {
36 fn write(&self, tx: &mut dyn Writer) {
37 tx.write_byte(*self);
38 }
39}
40
41impl Writable for [u8] {
42 fn write(&self, tx: &mut dyn Writer) {
43 for value in self {
44 tx.write(value);
45 }
46 }
47}
48
49impl<const N: usize> Writable for [u8; N] {
50 fn write(&self, tx: &mut dyn Writer) {
51 tx.write(self.as_slice());
52 }
53}
54
55impl Writable for str {
56 fn write(&self, tx: &mut dyn Writer) {
57 tx.write(self.as_bytes());
58 }
59}
60
61impl Writable for String {
62 fn write(&self, tx: &mut dyn Writer) {
63 tx.write(self.as_str());
64 }
65}