moq_transfork/coding/
encode.rs1use std::sync::Arc;
2
3use super::Sizer;
4
5pub trait Encode: Sized {
6 fn encode<W: bytes::BufMut>(&self, w: &mut W);
9
10 fn encode_size(&self) -> usize {
13 let mut sizer = Sizer::default();
14 self.encode(&mut sizer);
15 sizer.size
16 }
17}
18
19impl Encode for u8 {
20 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
21 w.put_u8(*self);
22 }
23
24 fn encode_size(&self) -> usize {
25 1
26 }
27}
28
29impl Encode for String {
30 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
31 self.as_str().encode(w)
32 }
33}
34
35impl Encode for &str {
36 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
37 self.len().encode(w);
38 w.put(self.as_bytes());
39 }
40}
41
42impl Encode for std::time::Duration {
43 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
44 let v: u64 = self.as_micros().try_into().expect("duration too large");
45 v.encode(w);
46 }
47}
48
49impl Encode for i8 {
50 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
51 w.put_u8(((*self as i16) + 128) as u8);
55 }
56
57 fn encode_size(&self) -> usize {
58 1
59 }
60}
61
62impl<T: Encode> Encode for &[T] {
63 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
64 self.len().encode(w);
65 for item in self.iter() {
66 item.encode(w);
67 }
68 }
69}
70
71impl<T: Encode> Encode for Vec<T> {
72 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
73 self.len().encode(w);
74 for item in self.iter() {
75 item.encode(w);
76 }
77 }
78}
79
80impl Encode for bytes::Bytes {
81 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
82 self.len().encode(w);
83 w.put_slice(self);
84 }
85
86 fn encode_size(&self) -> usize {
87 self.len().encode_size() + self.len()
88 }
89}
90
91impl<T: Encode> Encode for Arc<T> {
92 fn encode<W: bytes::BufMut>(&self, w: &mut W) {
93 (**self).encode(w);
94 }
95
96 fn encode_size(&self) -> usize {
97 (**self).encode_size()
98 }
99}