otopr/
encoding.rs

1use std::marker::PhantomData;
2
3use bytes::BufMut;
4
5use crate::{traits::Signable, wire_types::*, Fixed32, Fixed64, Signed, VarInt};
6
7pub trait Encodable {
8    type Wire: WireType;
9
10    /// returns the size in bytes when encoded, including the field number.
11    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize;
12    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>);
13
14    /// The entry point to encoding `Encodable`s in a message.
15    ///
16    /// the default implementation writes field_number << 3 | wire_type as an varint and calls [`encode()`].
17    fn encode_field<V: VarInt>(&self, s: &mut ProtobufSerializer<impl BufMut>, field_number: V) {
18        let var = field_number << 3 | V::from(Self::Wire::BITS);
19        s.write_varint(var);
20        self.encode(s);
21    }
22
23    /// Encodes a field using precomputed bytes for the field number and the wire type varint.
24    ///
25    /// # Safety
26    /// You must ensure that the bytes are valid varint. That is, all bytes except the last has the MSB set.
27    unsafe fn encode_field_precomputed(
28        &self,
29        s: &mut ProtobufSerializer<impl BufMut>,
30        field_number: &[u8],
31    ) {
32        s.buf.put_slice(field_number);
33        self.encode(s);
34    }
35}
36
37pub trait EncodableMessage {
38    fn encoded_size(&self) -> usize;
39    fn encode<T: BufMut>(&self, s: &mut ProtobufSerializer<T>);
40}
41
42pub struct EncodeAsRef<T, U: ?Sized>(T, PhantomData<U>);
43
44impl<T, U: ?Sized> EncodeAsRef<T, U> {
45    pub fn new(t: T) -> Self {
46        Self(t, PhantomData)
47    }
48}
49
50impl<T: AsRef<U>, U: ?Sized + Encodable> Encodable for EncodeAsRef<T, U> {
51    type Wire = U::Wire;
52
53    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
54        self.0.as_ref().encoded_size(field_number)
55    }
56
57    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>) {
58        self.0.as_ref().encode(s)
59    }
60
61    fn encode_field<V: VarInt>(&self, s: &mut ProtobufSerializer<impl BufMut>, field_number: V) {
62        self.0.as_ref().encode_field(s, field_number)
63    }
64
65    unsafe fn encode_field_precomputed(&self, s: &mut ProtobufSerializer<impl BufMut>, field_number: &[u8]) {
66        self.0.as_ref().encode_field_precomputed(s, field_number)
67    }
68}
69
70pub struct ProtobufSerializer<T> {
71    pub(crate) buf: T,
72}
73
74impl<T: bytes::BufMut> ProtobufSerializer<T> {
75    #[inline]
76    pub fn new(buf: T) -> Self {
77        Self { buf }
78    }
79
80    #[inline]
81    pub fn write_varint(&mut self, value: impl VarInt) {
82        value.write(&mut self.buf)
83    }
84
85    fn _write_str(&mut self, s: &str) {
86        self.write_varint(s.len());
87        self.buf.put_slice(s.as_bytes());
88    }
89
90    #[inline]
91    pub fn write_str(&mut self, s: impl AsRef<str>) {
92        self._write_str(s.as_ref())
93    }
94
95    #[inline]
96    pub fn write_u8(&mut self, n: u8) {
97        self.buf.put_u8(n);
98    }
99
100    #[inline]
101    pub fn write_u32(&mut self, n: u32) {
102        self.buf.put_u32_le(n)
103    }
104
105    #[inline]
106    pub fn write_u64(&mut self, n: u64) {
107        self.buf.put_u64_le(n)
108    }
109
110    #[inline]
111    pub fn write_bytes(&mut self, bytes: &[u8]) {
112        self.buf.put_slice(bytes)
113    }
114
115    #[inline]
116    pub fn encode_field<F: Encodable, V: VarInt>(&mut self, field_number: V, field: &F) {
117        field.encode_field(self, field_number);
118    }
119}
120
121impl<T: BufMut> From<T> for ProtobufSerializer<T> {
122    fn from(buf: T) -> Self {
123        Self::new(buf)
124    }
125}
126
127impl Encodable for Fixed32 {
128    type Wire = Fixed32Wire;
129
130    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
131        field_number.size() + 4
132    }
133
134    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>) {
135        s.write_u32(self.0)
136    }
137}
138
139impl Encodable for Fixed64 {
140    type Wire = Fixed64Wire;
141
142    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
143        field_number.size() + 8
144    }
145
146    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>) {
147        s.write_u64(self.0)
148    }
149}
150
151impl<T: Signable> Encodable for Signed<T> {
152    type Wire = <T::Storage as Encodable>::Wire;
153
154    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
155        self.0.encoded_size(field_number)
156    }
157
158    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>) {
159        self.0.encode(s)
160    }
161}
162
163impl Encodable for [u8] {
164    type Wire = LengthDelimitedWire;
165
166    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
167        field_number.size() + self.len().size() + self.len()
168    }
169
170    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>) {
171        s.write_varint(self.len());
172        s.write_bytes(self)
173    }
174}
175
176impl Encodable for Vec<u8> {
177    type Wire = <[u8] as Encodable>::Wire;
178
179    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
180        <[u8] as Encodable>::encoded_size(self, field_number)
181    }
182
183    fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>) {
184        <[u8] as Encodable>::encode(self, s)
185    }
186}
187
188impl<'a, T: Encodable + ?Sized> Encodable for &'a T {
189    type Wire = T::Wire;
190
191    fn encoded_size<V: VarInt>(&self, field_number: V) -> usize {
192        T::encoded_size(*self, field_number)
193    }
194
195    fn encode(&self, s: &mut crate::encoding::ProtobufSerializer<impl BufMut>) {
196        T::encode(*self, s)
197    }
198
199    fn encode_field<V: VarInt>(&self, s: &mut ProtobufSerializer<impl BufMut>, field_number: V) {
200        (*self).encode_field(s, field_number)
201    }
202
203    unsafe fn encode_field_precomputed(
204        &self,
205        s: &mut ProtobufSerializer<impl BufMut>,
206        field_number: &[u8],
207    ) {
208        (*self).encode_field_precomputed(s, field_number)
209    }
210}