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 fn encoded_size<V: VarInt>(&self, field_number: V) -> usize;
12 fn encode(&self, s: &mut ProtobufSerializer<impl BufMut>);
13
14 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 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}