1use super::error::{Error, Result};
2
3use serde_core as serde;
4
5use serde::ser::{self, Serialize};
6
7use core::mem;
8
9use crate::consts::*;
10
11pub trait Writer {
12 type Error: Into<Error>;
14
15 fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error>;
17}
18
19impl Writer for &mut [u8] {
20 type Error = Error;
21 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
22 let l = buf.len();
23 if self.len() < l {
24 return Err(Error::SerializeBufferFull);
26 }
27 let (current, rem) = mem::take(self).split_at_mut(l);
28 current.copy_from_slice(buf);
29 *self = rem;
30 Ok(())
31 }
32}
33
34#[cfg(feature = "heapless-bytes-v0-3")]
35impl<const N: usize> Writer for heapless_bytes_v0_3::Bytes<N> {
36 type Error = Error;
37 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
38 self.extend_from_slice(buf)
39 .or(Err(Error::SerializeBufferFull))
40 }
41}
42
43#[cfg(feature = "heapless-bytes-v0-4")]
44impl<const N: usize> Writer for heapless_bytes_v0_4::Bytes<N> {
45 type Error = Error;
46 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
47 self.extend_from_slice(buf)
48 .or(Err(Error::SerializeBufferFull))
49 }
50}
51
52#[cfg(feature = "heapless-bytes-v0-5")]
53impl<S: heapless_bytes_v0_5::BytesStorage + ?Sized, LenT: heapless_v0_9::LenType> Writer
54 for heapless_bytes_v0_5::BytesInner<LenT, S>
55{
56 type Error = Error;
57 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
58 self.extend_from_slice(buf)
59 .or(Err(Error::SerializeBufferFull))
60 }
61}
62
63#[cfg(feature = "heapless-v0-7")]
64impl<const N: usize> Writer for heapless_v0_7::Vec<u8, N> {
65 type Error = Error;
66 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
67 self.extend_from_slice(buf)
68 .or(Err(Error::SerializeBufferFull))
69 }
70}
71
72#[cfg(feature = "heapless-v0-8")]
73impl<const N: usize> Writer for heapless_v0_8::Vec<u8, N> {
74 type Error = Error;
75 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
76 self.extend_from_slice(buf)
77 .or(Err(Error::SerializeBufferFull))
78 }
79}
80
81#[cfg(feature = "heapless-v0-9")]
82impl<S: heapless_v0_9::vec::VecStorage<u8> + ?Sized, LenT: heapless_v0_9::LenType> Writer
83 for heapless_v0_9::vec::VecInner<u8, LenT, S>
84{
85 type Error = Error;
86 fn write_all(&mut self, buf: &[u8]) -> Result<()> {
87 self.extend_from_slice(buf)
88 .or(Err(Error::SerializeBufferFull))
89 }
90}
91
92impl<T: Writer + ?Sized> Writer for &mut T {
93 type Error = T::Error;
94 fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
95 (**self).write_all(buf)
96 }
97}
98
99struct WrittenWriter<W> {
100 writer: W,
101 written: usize,
102}
103
104impl<W: Writer> Writer for WrittenWriter<W> {
105 type Error = W::Error;
106
107 fn write_all(&mut self, buf: &[u8]) -> core::result::Result<(), Self::Error> {
108 self.written += buf.len();
109 self.writer.write_all(buf)
110 }
111}
112
113pub struct Serializer<W> {
114 inner: WrittenWriter<W>,
115}
116
117impl<W: Writer> Serializer<W> {
118 #[inline]
119 pub fn new(writer: W) -> Self {
120 Serializer {
121 inner: WrittenWriter { writer, written: 0 },
122 }
123 }
124
125 pub fn written(&self) -> usize {
126 self.inner.written
127 }
128
129 #[inline]
131 pub fn into_inner(self) -> W {
132 self.inner.writer
133 }
134
135 #[inline]
136 fn write_u8(&mut self, major: u8, value: u8) -> Result<()> {
137 if value <= 0x17 {
138 self.inner.write_all(&[major << MAJOR_OFFSET | value])
139 } else {
140 let buf = [major << MAJOR_OFFSET | 24, value];
141 self.inner.write_all(&buf)
142 }
143 .map_err(|e| e.into())
144 }
145
146 #[inline]
147 fn write_u16(&mut self, major: u8, value: u16) -> Result<()> {
148 if value <= u16::from(u8::MAX) {
149 self.write_u8(major, value as u8)
150 } else {
151 let mut buf = [major << MAJOR_OFFSET | 25, 0, 0];
152 buf[1..].copy_from_slice(&value.to_be_bytes());
153 self.inner.write_all(&buf).map_err(|e| e.into())
154 }
155 }
156
157 #[inline]
158 fn write_u32(&mut self, major: u8, value: u32) -> Result<()> {
159 if value <= u32::from(u16::MAX) {
160 self.write_u16(major, value as u16)
161 } else {
162 let mut buf = [major << MAJOR_OFFSET | 26, 0, 0, 0, 0];
163 buf[1..].copy_from_slice(&value.to_be_bytes());
164 self.inner.write_all(&buf).map_err(|e| e.into())
165 }
166 }
167
168 #[inline]
169 fn write_u64(&mut self, major: u8, value: u64) -> Result<()> {
170 if value <= u64::from(u32::MAX) {
171 self.write_u32(major, value as u32)
172 } else {
173 let mut buf = [major << MAJOR_OFFSET | 27, 0, 0, 0, 0, 0, 0, 0, 0];
174 buf[1..].copy_from_slice(&value.to_be_bytes());
175 self.inner.write_all(&buf).map_err(|e| e.into())
176 }
177 }
178
179 #[inline]
180 fn serialize_collection(
181 &mut self,
182 major: u8,
183 len: Option<usize>,
184 ) -> Result<CollectionSerializer<'_, W>> {
185 let needs_eof = match len {
186 Some(len) => {
187 self.write_u64(major, len as u64)?;
188 false
189 }
190 None => {
191 self.inner
192 .write_all(&[major << MAJOR_OFFSET | 31])
193 .map_err(|e| e.into())?;
194 true
195 }
196 };
197
198 Ok(CollectionSerializer {
199 ser: self,
200 needs_eof,
201 })
202 }
203}
204
205impl<'a, W> ser::Serializer for &'a mut Serializer<W>
206where
207 W: Writer,
208{
209 type Ok = ();
210
211 type Error = Error;
212
213 type SerializeSeq = CollectionSerializer<'a, W>;
214 type SerializeTuple = &'a mut Serializer<W>;
215 type SerializeTupleStruct = &'a mut Serializer<W>;
216 type SerializeTupleVariant = &'a mut Serializer<W>;
217 type SerializeMap = CollectionSerializer<'a, W>;
218 type SerializeStruct = &'a mut Serializer<W>;
219 type SerializeStructVariant = &'a mut Serializer<W>;
220
221 #[inline]
222 fn serialize_bool(self, value: bool) -> Result<()> {
223 let value = if value { VALUE_TRUE } else { VALUE_FALSE };
224 self.inner.write_all(&[value]).map_err(|e| e.into())
225 }
226
227 #[inline]
228 fn serialize_i8(self, value: i8) -> Result<()> {
229 let sign = (value >> 7) as u8;
230 let major_type = sign & 0x1;
231 let bits = sign ^ (value as u8);
232 self.write_u8(major_type, bits)
233 }
234
235 #[inline]
236 fn serialize_i16(self, value: i16) -> Result<()> {
237 let sign = (value >> 15) as u16;
238 let major_type = (sign & 0x1) as u8;
239 let bits = sign ^ (value as u16);
240 self.write_u16(major_type, bits)
241 }
242
243 #[inline]
244 fn serialize_i32(self, value: i32) -> Result<()> {
245 let sign = (value >> 31) as u32;
246 let major_type = (sign & 0x1) as u8;
247 let bits = sign ^ (value as u32);
248 self.write_u32(major_type, bits)
249 }
250
251 #[inline]
252 fn serialize_i64(self, value: i64) -> Result<()> {
253 let sign = (value >> 63) as u64;
254 let major_type = (sign & 0x1) as u8;
255 let bits = sign ^ (value as u64);
256 self.write_u64(major_type, bits)
257 }
258
259 #[inline]
260 fn serialize_u8(self, value: u8) -> Result<()> {
261 self.write_u8(MAJOR_POSINT, value)
262 }
263
264 #[inline]
265 fn serialize_u16(self, value: u16) -> Result<()> {
266 self.write_u16(MAJOR_POSINT, value)
267 }
268
269 #[inline]
270 fn serialize_u32(self, value: u32) -> Result<()> {
271 self.write_u32(MAJOR_POSINT, value)
272 }
273
274 #[inline]
275 fn serialize_u64(self, value: u64) -> Result<()> {
276 self.write_u64(MAJOR_POSINT, value)
277 }
278
279 fn serialize_f32(self, _v: f32) -> Result<()> {
280 todo!("serialize_f32 not implemented");
281 }
282
283 fn serialize_f64(self, _v: f64) -> Result<()> {
284 todo!("serialize_f64 not implemented");
285 }
286
287 #[inline]
288 fn serialize_char(self, value: char) -> Result<()> {
289 let mut buf = [0; 4];
291 self.serialize_str(value.encode_utf8(&mut buf))
292 }
293
294 #[inline]
295 fn serialize_str(self, value: &str) -> Result<()> {
296 self.write_u64(MAJOR_STR, value.len() as u64)?;
297 self.inner.write_all(value.as_bytes()).map_err(|e| e.into())
298 }
299
300 #[inline]
301 fn serialize_bytes(self, value: &[u8]) -> Result<()> {
302 self.write_u64(MAJOR_BYTES, value.len() as u64)?;
303 self.inner.write_all(value).map_err(|e| e.into())
304 }
305
306 #[inline]
307 fn serialize_none(self) -> Result<()> {
308 self.inner.write_all(&[VALUE_NULL]).map_err(|e| e.into())
309 }
310
311 #[inline]
312 fn serialize_some<T>(self, value: &T) -> Result<()>
313 where
314 T: ?Sized + ser::Serialize,
315 {
316 value.serialize(self)
317 }
318
319 #[inline]
320 fn serialize_unit(self) -> Result<()> {
321 self.serialize_none()
322 }
323
324 #[inline]
325 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
326 self.serialize_unit()
327 }
328
329 #[inline]
330 fn serialize_unit_variant(
331 self,
332 _name: &'static str,
333 variant_index: u32,
334 _variant: &'static str,
335 ) -> Result<()> {
336 self.serialize_u32(variant_index)
338 }
342
343 #[inline]
344 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
345 where
346 T: ?Sized + ser::Serialize,
347 {
348 value.serialize(self)
354 }
355
356 #[inline]
357 fn serialize_newtype_variant<T>(
358 self,
359 name: &'static str,
360 variant_index: u32,
361 variant: &'static str,
362 value: &T,
363 ) -> Result<()>
364 where
365 T: ?Sized + ser::Serialize,
366 {
367 self.write_u64(MAJOR_ARRAY, 2)?;
372 self.serialize_unit_variant(name, variant_index, variant)?;
373 value.serialize(self)
375 }
376
377 #[inline]
378 fn serialize_seq(self, len: Option<usize>) -> Result<CollectionSerializer<'a, W>> {
379 self.serialize_collection(MAJOR_ARRAY, len)
380 }
381
382 #[inline]
383 fn serialize_tuple(self, len: usize) -> Result<&'a mut Serializer<W>> {
384 self.write_u64(MAJOR_ARRAY, len as u64)?;
385 Ok(self)
386 }
387
388 #[inline]
389 fn serialize_tuple_struct(
390 self,
391 _name: &'static str,
392 len: usize,
393 ) -> Result<&'a mut Serializer<W>> {
394 self.serialize_tuple(len)
395 }
396
397 #[inline]
398 fn serialize_tuple_variant(
399 self,
400 name: &'static str,
401 variant_index: u32,
402 variant: &'static str,
403 len: usize,
404 ) -> Result<&'a mut Serializer<W>> {
405 self.write_u64(MAJOR_ARRAY, (len + 1) as u64)?;
411 self.serialize_unit_variant(name, variant_index, variant)?;
412 Ok(self)
413 }
415
416 #[inline]
417 fn serialize_map(self, len: Option<usize>) -> Result<CollectionSerializer<'a, W>> {
418 self.serialize_collection(MAJOR_MAP, len)
419 }
420
421 #[inline]
422 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
423 self.write_u64(MAJOR_MAP, len as u64)?;
424 Ok(self)
425 }
426
427 #[inline]
428 fn serialize_struct_variant(
429 self,
430 name: &'static str,
431 variant_index: u32,
432 variant: &'static str,
433 len: usize,
434 ) -> Result<Self::SerializeStruct> {
435 self.write_u64(MAJOR_ARRAY, 2)?;
439 self.serialize_unit_variant(name, variant_index, variant)?;
441 self.serialize_struct(name, len)
442 }
443
444 fn collect_str<T>(self, _value: &T) -> Result<Self::Ok>
445 where
446 T: core::fmt::Display + ?Sized,
447 {
448 unreachable!()
449 }
450
451 #[inline]
452 fn is_human_readable(&self) -> bool {
453 false
454 }
455}
456
457impl<W> ser::SerializeTuple for &mut Serializer<W>
458where
459 W: Writer,
460{
461 type Ok = ();
462 type Error = Error;
463
464 #[inline]
465 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
466 where
467 T: ?Sized + ser::Serialize,
468 {
469 value.serialize(&mut **self)
470 }
471
472 #[inline]
473 fn end(self) -> Result<()> {
474 Ok(())
475 }
476}
477
478impl<W> ser::SerializeTupleStruct for &mut Serializer<W>
479where
480 W: Writer,
481{
482 type Ok = ();
483 type Error = Error;
484
485 #[inline]
486 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
487 where
488 T: ?Sized + ser::Serialize,
489 {
490 value.serialize(&mut **self)
491 }
492
493 #[inline]
494 fn end(self) -> Result<()> {
495 Ok(())
496 }
497}
498
499impl<W> ser::SerializeTupleVariant for &mut Serializer<W>
500where
501 W: Writer,
502{
503 type Ok = ();
504 type Error = Error;
505
506 #[inline]
507 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
508 where
509 T: ?Sized + ser::Serialize,
510 {
511 value.serialize(&mut **self)
512 }
513
514 #[inline]
515 fn end(self) -> Result<()> {
516 Ok(())
517 }
518}
519
520impl<W> ser::SerializeStruct for &mut Serializer<W>
521where
522 W: Writer,
523{
524 type Ok = ();
525 type Error = Error;
526
527 #[inline]
528 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
529 where
530 T: ?Sized + ser::Serialize,
531 {
532 key.serialize(&mut **self)?;
533 value.serialize(&mut **self)?;
534 Ok(())
535 }
536
537 #[inline]
538 fn end(self) -> Result<()> {
539 Ok(())
540 }
541}
542
543impl<W> ser::SerializeStructVariant for &mut Serializer<W>
544where
545 W: Writer,
546{
547 type Ok = ();
548 type Error = Error;
549
550 #[inline]
551 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
552 where
553 T: ?Sized + ser::Serialize,
554 {
555 key.serialize(&mut **self)?;
556 value.serialize(&mut **self)?;
557 Ok(())
558 }
559
560 #[inline]
561 fn end(self) -> Result<()> {
562 Ok(())
563 }
564}
565
566#[doc(hidden)]
567pub struct CollectionSerializer<'a, W> {
568 ser: &'a mut Serializer<W>,
569 needs_eof: bool,
570}
571
572impl<'a, W> CollectionSerializer<'a, W>
573where
574 W: Writer,
575{
576 #[inline]
577 fn end_inner(self) -> Result<()> {
578 if self.needs_eof {
579 self.ser.inner.write_all(&[0xff]).map_err(|e| e.into())
580 } else {
581 Ok(())
582 }
583 }
584}
585
586impl<'a, W> ser::SerializeSeq for CollectionSerializer<'a, W>
587where
588 W: Writer,
589{
590 type Ok = ();
591 type Error = Error;
592
593 #[inline]
594 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
595 where
596 T: ?Sized + ser::Serialize,
597 {
598 value.serialize(&mut *self.ser)
599 }
600
601 #[inline]
602 fn end(self) -> Result<()> {
603 self.end_inner()
604 }
605}
606
607impl<'a, W> ser::SerializeMap for CollectionSerializer<'a, W>
608where
609 W: Writer,
610{
611 type Ok = ();
612 type Error = Error;
613
614 #[inline]
615 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
616 where
617 T: ?Sized + ser::Serialize,
618 {
619 key.serialize(&mut *self.ser)
620 }
621
622 #[inline]
623 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
624 where
625 T: ?Sized + ser::Serialize,
626 {
627 value.serialize(&mut *self.ser)
628 }
629
630 #[inline]
631 fn end(self) -> Result<()> {
632 self.end_inner()
633 }
634}