moq_transfork/coding/
encode.rs

1use std::sync::Arc;
2
3use super::Sizer;
4
5pub trait Encode: Sized {
6	// Encode the value to the given writer.
7	// This will panic if the Buf is not large enough; use a Vec or encode_size() to check.
8	fn encode<W: bytes::BufMut>(&self, w: &mut W);
9
10	// Return the size of the encoded value
11	// Implementations can override this to provide a more efficient implementation
12	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		// This is not the usual way of encoding negative numbers.
52		// i8 doesn't exist in the draft, but we use it instead of u8 for priority.
53		// A default of 0 is more ergonomic for the user than a default of 128.
54		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}