1use core::fmt;
2
3use musli::en::{
4 Encode, Encoder, EntriesEncoder, EntryEncoder, MapEncoder, SequenceEncoder, VariantEncoder,
5};
6use musli::hint::{MapHint, SequenceHint};
7use musli::{Buf, Context};
8use musli_storage::en::StorageEncoder;
9use musli_utils::writer::BufWriter;
10use musli_utils::{Options, Writer};
11
12use crate::tag::{Kind, Tag};
13
14pub struct WireEncoder<'a, W, const OPT: Options, C: ?Sized> {
16 cx: &'a C,
17 writer: W,
18}
19
20impl<'a, W, const OPT: Options, C> WireEncoder<'a, W, OPT, C>
21where
22 W: Writer,
23 C: ?Sized + Context,
24{
25 #[inline]
27 pub(crate) fn new(cx: &'a C, writer: W) -> Self {
28 Self { cx, writer }
29 }
30
31 #[inline]
32 fn encode_map_len(&mut self, len: usize) -> Result<(), C::Error> {
33 let Some(len) = len.checked_mul(2) else {
34 return Err(self.cx.message("Map length overflow"));
35 };
36
37 let (tag, embedded) = Tag::with_len(Kind::Sequence, len);
38 self.writer.write_byte(self.cx, tag.byte())?;
39
40 if !embedded {
41 musli_utils::int::encode_usize::<_, _, OPT>(self.cx, self.writer.borrow_mut(), len)?;
42 }
43
44 Ok(())
45 }
46
47 #[inline]
48 fn encode_sequence_len(&mut self, len: usize) -> Result<(), C::Error> {
49 let (tag, embedded) = Tag::with_len(Kind::Sequence, len);
50 self.writer.write_byte(self.cx, tag.byte())?;
51
52 if !embedded {
53 musli_utils::int::encode_usize::<_, _, OPT>(self.cx, self.writer.borrow_mut(), len)?;
54 }
55
56 Ok(())
57 }
58}
59
60pub struct WireSequenceEncoder<'a, W, B, const OPT: Options, C: ?Sized> {
61 cx: &'a C,
62 writer: W,
63 buffer: BufWriter<B>,
64}
65
66impl<'a, W, B, const OPT: Options, C: ?Sized> WireSequenceEncoder<'a, W, B, OPT, C> {
67 #[inline]
69 pub(crate) fn new(cx: &'a C, writer: W, buffer: B) -> Self {
70 Self {
71 cx,
72 writer,
73 buffer: BufWriter::new(buffer),
74 }
75 }
76}
77
78#[musli::encoder]
79impl<'a, W, const OPT: Options, C> Encoder for WireEncoder<'a, W, OPT, C>
80where
81 C: ?Sized + Context,
82 W: Writer,
83{
84 type Cx = C;
85 type Error = C::Error;
86 type Ok = ();
87 type Mode = C::Mode;
88 type WithContext<'this, U> = WireEncoder<'this, W, OPT, U> where U: 'this + Context;
89 type EncodePack = WireSequenceEncoder<'a, W, C::Buf<'a>, OPT, C>;
90 type EncodeSome = Self;
91 type EncodeSequence = Self;
92 type EncodeMap = Self;
93 type EncodeMapEntries = Self;
94 type EncodeVariant = Self;
95 type EncodeSequenceVariant = Self;
96 type EncodeMapVariant = Self;
97
98 #[inline]
99 fn cx(&self) -> &Self::Cx {
100 self.cx
101 }
102
103 #[inline]
104 fn with_context<U>(self, cx: &U) -> Result<Self::WithContext<'_, U>, C::Error>
105 where
106 U: Context,
107 {
108 Ok(WireEncoder::new(cx, self.writer))
109 }
110
111 #[inline]
112 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
113 write!(f, "type supported by the wire encoder")
114 }
115
116 #[inline]
117 fn encode<T>(self, value: T) -> Result<Self::Ok, C::Error>
118 where
119 T: Encode<Self::Mode>,
120 {
121 value.encode(self.cx, self)
122 }
123
124 #[inline]
125 fn encode_unit(mut self) -> Result<Self::Ok, C::Error> {
126 self.writer
127 .write_byte(self.cx, Tag::new(Kind::Sequence, 0).byte())?;
128 Ok(())
129 }
130
131 #[inline]
132 fn encode_pack(self) -> Result<Self::EncodePack, C::Error> {
133 let Some(buf) = self.cx.alloc() else {
134 return Err(self.cx.message("Failed to allocate pack buffer"));
135 };
136
137 Ok(WireSequenceEncoder::new(self.cx, self.writer, buf))
138 }
139
140 #[inline]
141 fn encode_array<const N: usize>(self, array: &[u8; N]) -> Result<Self::Ok, C::Error> {
142 self.encode_bytes(array)
143 }
144
145 #[inline]
146 fn encode_bytes(mut self, bytes: &[u8]) -> Result<Self::Ok, C::Error> {
147 encode_prefix::<_, _, OPT>(self.cx, self.writer.borrow_mut(), bytes.len())?;
148 self.writer.write_bytes(self.cx, bytes)?;
149 Ok(())
150 }
151
152 #[inline]
153 fn encode_bytes_vectored<I>(mut self, len: usize, vectors: I) -> Result<Self::Ok, C::Error>
154 where
155 I: IntoIterator,
156 I::Item: AsRef<[u8]>,
157 {
158 encode_prefix::<_, _, OPT>(self.cx, self.writer.borrow_mut(), len)?;
159
160 for bytes in vectors {
161 self.writer.write_bytes(self.cx, bytes.as_ref())?;
162 }
163
164 Ok(())
165 }
166
167 #[inline]
168 fn encode_string(self, string: &str) -> Result<Self::Ok, C::Error> {
169 self.encode_bytes(string.as_bytes())
170 }
171
172 #[inline]
173 fn collect_string<T>(self, value: &T) -> Result<Self::Ok, <Self::Cx as Context>::Error>
174 where
175 T: ?Sized + fmt::Display,
176 {
177 let buf = self.cx.collect_string(value)?;
178 self.encode_string(buf.as_ref())
179 }
180
181 #[inline]
182 fn encode_usize(mut self, value: usize) -> Result<Self::Ok, C::Error> {
183 crate::wire_int::encode_length::<_, _, OPT>(self.cx, self.writer.borrow_mut(), value)
184 }
185
186 #[inline]
187 fn encode_isize(mut self, value: isize) -> Result<Self::Ok, C::Error> {
188 crate::wire_int::encode_length::<_, _, OPT>(
189 self.cx,
190 self.writer.borrow_mut(),
191 value as usize,
192 )
193 }
194
195 #[inline]
196 fn encode_bool(mut self, value: bool) -> Result<Self::Ok, C::Error> {
197 self.writer.write_byte(
198 self.cx,
199 Tag::new(Kind::Continuation, if value { 1 } else { 0 }).byte(),
200 )
201 }
202
203 #[inline]
204 fn encode_char(self, value: char) -> Result<Self::Ok, C::Error> {
205 self.encode_u32(value as u32)
206 }
207
208 #[inline]
209 fn encode_u8(mut self, value: u8) -> Result<Self::Ok, C::Error> {
210 crate::wire_int::encode_unsigned::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
211 }
212
213 #[inline]
214 fn encode_u16(mut self, value: u16) -> Result<Self::Ok, C::Error> {
215 crate::wire_int::encode_unsigned::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
216 }
217
218 #[inline]
219 fn encode_u32(mut self, value: u32) -> Result<Self::Ok, C::Error> {
220 crate::wire_int::encode_unsigned::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
221 }
222
223 #[inline]
224 fn encode_u64(mut self, value: u64) -> Result<Self::Ok, C::Error> {
225 crate::wire_int::encode_unsigned::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
226 }
227
228 #[inline]
229 fn encode_u128(mut self, value: u128) -> Result<Self::Ok, C::Error> {
230 crate::wire_int::encode_unsigned::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
231 }
232
233 #[inline]
234 fn encode_i8(self, value: i8) -> Result<Self::Ok, C::Error> {
235 self.encode_u8(value as u8)
236 }
237
238 #[inline]
239 fn encode_i16(mut self, value: i16) -> Result<Self::Ok, C::Error> {
240 crate::wire_int::encode_signed::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
241 }
242
243 #[inline]
244 fn encode_i32(mut self, value: i32) -> Result<Self::Ok, C::Error> {
245 crate::wire_int::encode_signed::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
246 }
247
248 #[inline]
249 fn encode_i64(mut self, value: i64) -> Result<Self::Ok, C::Error> {
250 crate::wire_int::encode_signed::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
251 }
252
253 #[inline]
254 fn encode_i128(mut self, value: i128) -> Result<Self::Ok, C::Error> {
255 crate::wire_int::encode_signed::<_, _, _, OPT>(self.cx, self.writer.borrow_mut(), value)
256 }
257
258 #[inline]
259 fn encode_f32(self, value: f32) -> Result<Self::Ok, C::Error> {
260 self.encode_u32(value.to_bits())
261 }
262
263 #[inline]
264 fn encode_f64(self, value: f64) -> Result<Self::Ok, C::Error> {
265 self.encode_u64(value.to_bits())
266 }
267
268 #[inline]
269 fn encode_some(mut self) -> Result<Self::EncodeSome, C::Error> {
270 self.writer
271 .write_byte(self.cx, Tag::new(Kind::Sequence, 1).byte())?;
272 Ok(self)
273 }
274
275 #[inline]
276 fn encode_none(mut self) -> Result<Self::Ok, C::Error> {
277 self.writer
278 .write_byte(self.cx, Tag::new(Kind::Sequence, 0).byte())?;
279 Ok(())
280 }
281
282 #[inline]
283 fn encode_sequence(mut self, hint: &SequenceHint) -> Result<Self::EncodeSequence, C::Error> {
284 self.encode_sequence_len(hint.size)?;
285 Ok(self)
286 }
287
288 #[inline]
289 fn encode_map(mut self, hint: &MapHint) -> Result<Self::EncodeMap, C::Error> {
290 self.encode_map_len(hint.size)?;
291 Ok(self)
292 }
293
294 #[inline]
295 fn encode_map_entries(self, hint: &MapHint) -> Result<Self::EncodeMapEntries, C::Error> {
296 self.encode_map(hint)
297 }
298
299 #[inline]
300 fn encode_variant(mut self) -> Result<Self::EncodeVariant, C::Error> {
301 self.writer
302 .write_byte(self.cx, Tag::new(Kind::Sequence, 2).byte())?;
303 Ok(self)
304 }
305
306 #[inline]
307 fn encode_sequence_variant<T>(
308 mut self,
309 tag: &T,
310 hint: &SequenceHint,
311 ) -> Result<Self::EncodeSequenceVariant, C::Error>
312 where
313 T: ?Sized + Encode<C::Mode>,
314 {
315 self.writer
316 .write_byte(self.cx, Tag::new(Kind::Sequence, 2).byte())?;
317 WireEncoder::<_, OPT, _>::new(self.cx, self.writer.borrow_mut()).encode(tag)?;
318 self.encode_sequence(hint)
319 }
320
321 #[inline]
322 fn encode_map_variant<T>(
323 mut self,
324 tag: &T,
325 hint: &MapHint,
326 ) -> Result<Self::EncodeSequenceVariant, C::Error>
327 where
328 T: ?Sized + Encode<C::Mode>,
329 {
330 self.writer
331 .write_byte(self.cx, Tag::new(Kind::Sequence, 2).byte())?;
332 WireEncoder::<_, OPT, _>::new(self.cx, self.writer.borrow_mut()).encode(tag)?;
333 self.encode_map(hint)
334 }
335}
336
337impl<'a, W, B, const OPT: Options, C> SequenceEncoder for WireSequenceEncoder<'a, W, B, OPT, C>
338where
339 C: ?Sized + Context,
340 W: Writer,
341 B: Buf,
342{
343 type Cx = C;
344 type Ok = ();
345 type EncodeNext<'this> = StorageEncoder<'a, &'this mut BufWriter<B>, OPT, C> where Self: 'this, B: Buf;
346
347 #[inline]
348 fn encode_next(&mut self) -> Result<Self::EncodeNext<'_>, C::Error> {
349 Ok(StorageEncoder::new(self.cx, &mut self.buffer))
350 }
351
352 #[inline]
353 fn finish_sequence(mut self) -> Result<Self::Ok, C::Error> {
354 let buffer = self.buffer.into_inner();
355 encode_prefix::<_, _, OPT>(self.cx, self.writer.borrow_mut(), buffer.len())?;
356 self.writer.write_buffer(self.cx, buffer)?;
357 Ok(())
358 }
359}
360
361impl<'a, W, const OPT: Options, C> SequenceEncoder for WireEncoder<'a, W, OPT, C>
362where
363 C: ?Sized + Context,
364 W: Writer,
365{
366 type Cx = C;
367 type Ok = ();
368 type EncodeNext<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
369
370 #[inline]
371 fn encode_next(&mut self) -> Result<Self::EncodeNext<'_>, C::Error> {
372 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
373 }
374
375 #[inline]
376 fn finish_sequence(self) -> Result<Self::Ok, C::Error> {
377 Ok(())
378 }
379}
380
381impl<'a, W, const OPT: Options, C> MapEncoder for WireEncoder<'a, W, OPT, C>
382where
383 C: ?Sized + Context,
384 W: Writer,
385{
386 type Cx = C;
387 type Ok = ();
388 type EncodeEntry<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
389
390 #[inline]
391 fn encode_entry(&mut self) -> Result<Self::EncodeEntry<'_>, C::Error> {
392 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
393 }
394
395 #[inline]
396 fn finish_map(self) -> Result<Self::Ok, C::Error> {
397 Ok(())
398 }
399}
400
401impl<'a, W, const OPT: Options, C> EntriesEncoder for WireEncoder<'a, W, OPT, C>
402where
403 C: ?Sized + Context,
404 W: Writer,
405{
406 type Cx = C;
407 type Ok = ();
408 type EncodeEntryKey<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
409 type EncodeEntryValue<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
410
411 #[inline]
412 fn encode_entry_key(&mut self) -> Result<Self::EncodeEntryKey<'_>, C::Error> {
413 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
414 }
415
416 #[inline]
417 fn encode_entry_value(&mut self) -> Result<Self::EncodeEntryValue<'_>, C::Error> {
418 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
419 }
420
421 #[inline]
422 fn finish_entries(self) -> Result<Self::Ok, C::Error> {
423 Ok(())
424 }
425}
426
427impl<'a, W, const OPT: Options, C> EntryEncoder for WireEncoder<'a, W, OPT, C>
428where
429 C: ?Sized + Context,
430 W: Writer,
431{
432 type Cx = C;
433 type Ok = ();
434 type EncodeKey<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
435 type EncodeValue<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
436
437 #[inline]
438 fn encode_key(&mut self) -> Result<Self::EncodeKey<'_>, C::Error> {
439 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
440 }
441
442 #[inline]
443 fn encode_value(&mut self) -> Result<Self::EncodeValue<'_>, C::Error> {
444 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
445 }
446
447 #[inline]
448 fn finish_entry(self) -> Result<Self::Ok, C::Error> {
449 Ok(())
450 }
451}
452
453impl<'a, W, const OPT: Options, C> VariantEncoder for WireEncoder<'a, W, OPT, C>
454where
455 C: ?Sized + Context,
456 W: Writer,
457{
458 type Cx = C;
459 type Ok = ();
460 type EncodeTag<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
461 type EncodeData<'this> = WireEncoder<'a, W::Mut<'this>, OPT, C> where Self: 'this;
462
463 #[inline]
464 fn encode_tag(&mut self) -> Result<Self::EncodeTag<'_>, C::Error> {
465 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
466 }
467
468 #[inline]
469 fn encode_data(&mut self) -> Result<Self::EncodeData<'_>, C::Error> {
470 Ok(WireEncoder::new(self.cx, self.writer.borrow_mut()))
471 }
472
473 #[inline]
474 fn finish_variant(self) -> Result<Self::Ok, C::Error> {
475 Ok(())
476 }
477}
478
479#[inline]
481fn encode_prefix<C, W, const OPT: Options>(
482 cx: &C,
483 mut writer: W,
484 len: usize,
485) -> Result<(), C::Error>
486where
487 C: ?Sized + Context,
488 W: Writer,
489{
490 let (tag, embedded) = Tag::with_len(Kind::Prefix, len);
491 writer.write_byte(cx, tag.byte())?;
492
493 if !embedded {
494 musli_utils::int::encode_usize::<_, _, OPT>(cx, writer, len)?;
495 }
496
497 Ok(())
498}