1#[cfg(feature = "alloc")]
81use alloc::string::String;
82
83use crate::error::{Error, Result};
84
85pub trait Serialize {
136 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
138 where
139 S: Serializer;
140}
141
142pub trait Serializer: Sized {
147 type Error: From<Error>;
149
150 fn serialize_bool(&mut self, name: &str, v: bool) -> core::result::Result<(), Self::Error>;
152
153 fn serialize_u8(&mut self, name: &str, v: u8) -> core::result::Result<(), Self::Error>;
155
156 fn serialize_i8(&mut self, name: &str, v: i8) -> core::result::Result<(), Self::Error>;
158
159 fn serialize_u16(&mut self, name: &str, v: u16) -> core::result::Result<(), Self::Error>;
161
162 fn serialize_i16(&mut self, name: &str, v: i16) -> core::result::Result<(), Self::Error>;
164
165 fn serialize_u32(&mut self, name: &str, v: u32) -> core::result::Result<(), Self::Error>;
167
168 fn serialize_i32(&mut self, name: &str, v: i32) -> core::result::Result<(), Self::Error>;
170
171 fn serialize_u64(&mut self, name: &str, v: u64) -> core::result::Result<(), Self::Error>;
173
174 fn serialize_i64(&mut self, name: &str, v: i64) -> core::result::Result<(), Self::Error>;
176
177 fn serialize_u128(&mut self, name: &str, v: u128) -> core::result::Result<(), Self::Error>;
179
180 fn serialize_i128(&mut self, name: &str, v: i128) -> core::result::Result<(), Self::Error>;
182
183 fn serialize_f32(&mut self, name: &str, v: f32) -> core::result::Result<(), Self::Error>;
185
186 fn serialize_f64(&mut self, name: &str, v: f64) -> core::result::Result<(), Self::Error>;
188
189 fn serialize_bytes(&mut self, name: &str, v: &[u8]) -> core::result::Result<(), Self::Error>;
191
192 fn serialize_string(&mut self, name: &str, v: &String) -> core::result::Result<(), Self::Error>;
194
195 fn serialize_str(&mut self, name: &str, v: &str) -> core::result::Result<(), Self::Error>;
197
198 fn serialize_vec<T>(&mut self, name: &str, v: &alloc::vec::Vec<T>) -> core::result::Result<(), Self::Error>
200 where
201 T: Serialize;
202
203 fn serialize_array<T>(&mut self, name: &str, v: &[T]) -> core::result::Result<(), Self::Error>
205 where
206 T: Serialize;
207
208 fn serialize_struct_start(&mut self, _name: &str, _len: usize) -> core::result::Result<(), Self::Error> {
211 Ok(())
212 }
213
214 fn serialize_field<T>(&mut self, name: &str, value: &T) -> core::result::Result<(), Self::Error>
217 where
218 T: Serialize,
219 {
220 value.serialize(name, self)
221 }
222
223 fn serialize_struct_end(&mut self) -> core::result::Result<(), Self::Error> {
226 Ok(())
227 }
228}
229
230pub struct ByteSerializer<'a> {
290 buffer: &'a mut [u8],
291 position: usize,
292}
293
294impl<'a> ByteSerializer<'a> {
295 pub fn new(buffer: &'a mut [u8]) -> Self {
297 Self {
298 buffer,
299 position: 0,
300 }
301 }
302
303 pub fn position(&self) -> usize {
305 self.position
306 }
307
308 fn write_bytes(&mut self, bytes: &[u8]) -> Result<()> {
310 if self.position + bytes.len() > self.buffer.len() {
311 return Err(Error::BufferTooSmall);
312 }
313 self.buffer[self.position..self.position + bytes.len()].copy_from_slice(bytes);
314 self.position += bytes.len();
315 Ok(())
316 }
317}
318
319impl<'a> Serializer for ByteSerializer<'a> {
320 type Error = Error;
321
322 fn serialize_bool(&mut self, _name: &str, v: bool) -> Result<()> {
323 self.serialize_u8("", if v { 1 } else { 0 })
324 }
325
326 fn serialize_u8(&mut self, _name: &str, v: u8) -> Result<()> {
327 self.write_bytes(&[v])
328 }
329
330 fn serialize_i8(&mut self, _name: &str, v: i8) -> Result<()> {
331 self.write_bytes(&v.to_le_bytes())
332 }
333
334 fn serialize_u16(&mut self, _name: &str, v: u16) -> Result<()> {
335 self.write_bytes(&v.to_le_bytes())
336 }
337
338 fn serialize_i16(&mut self, _name: &str, v: i16) -> Result<()> {
339 self.write_bytes(&v.to_le_bytes())
340 }
341
342 fn serialize_u32(&mut self, _name: &str, v: u32) -> Result<()> {
343 self.write_bytes(&v.to_le_bytes())
344 }
345
346 fn serialize_i32(&mut self, _name: &str, v: i32) -> Result<()> {
347 self.write_bytes(&v.to_le_bytes())
348 }
349
350 fn serialize_u64(&mut self, _name: &str, v: u64) -> Result<()> {
351 self.write_bytes(&v.to_le_bytes())
352 }
353
354 fn serialize_i64(&mut self, _name: &str, v: i64) -> Result<()> {
355 self.write_bytes(&v.to_le_bytes())
356 }
357
358 fn serialize_u128(&mut self, _name: &str, v: u128) -> Result<()> {
359 self.write_bytes(&v.to_le_bytes())
360 }
361
362 fn serialize_i128(&mut self, _name: &str, v: i128) -> Result<()> {
363 self.write_bytes(&v.to_le_bytes())
364 }
365
366 fn serialize_f32(&mut self, _name: &str, v: f32) -> Result<()> {
367 self.write_bytes(&v.to_le_bytes())
368 }
369
370 fn serialize_f64(&mut self, _name: &str, v: f64) -> Result<()> {
371 self.write_bytes(&v.to_le_bytes())
372 }
373
374 fn serialize_bytes(&mut self, _name: &str, v: &[u8]) -> Result<()> {
375 self.serialize_u32("", v.len() as u32)?;
377 self.write_bytes(v)
378 }
379
380 fn serialize_string(&mut self, name: &str, v: &String) -> core::result::Result<(), Self::Error> {
381 self.serialize_str(name, v.as_str())
382 }
383
384 fn serialize_str(&mut self, name: &str, v: &str) -> core::result::Result<(), Self::Error> {
385 self.serialize_bytes(name, v.as_bytes())
386 }
387
388 fn serialize_vec<T>(&mut self, name: &str, v: &alloc::vec::Vec<T>) -> core::result::Result<(), Self::Error>
389 where
390 T: Serialize {
391 self.serialize_u32(name, v.len() as u32)?;
393 for item in v.iter() {
394 item.serialize(name, self)?;
395 }
396 Ok(())
397 }
398
399 fn serialize_array<T>(&mut self, name: &str, v: &[T]) -> core::result::Result<(), Self::Error>
401 where
402 T: Serialize {
403 for item in v.iter() {
404 item.serialize(name, self)?;
405 }
406 Ok(())
407 }
408
409}
410
411impl Serialize for bool {
414 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
415 where
416 S: Serializer
417 {
418
419 serializer.serialize_bool(name, *self)
420 }
421}
422
423impl Serialize for u8 {
424 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
425 where
426 S: Serializer,
427 {
428 serializer.serialize_u8(name, *self)
429 }
430}
431
432impl Serialize for i8 {
433 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
434 where
435 S: Serializer,
436 {
437 serializer.serialize_i8(name, *self)
438 }
439}
440
441impl Serialize for u16 {
442 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
443 where
444 S: Serializer,
445 {
446 serializer.serialize_u16(name, *self)
447 }
448}
449
450impl Serialize for i16 {
451 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
452 where
453 S: Serializer,
454 {
455 serializer.serialize_i16(name, *self)
456 }
457}
458
459impl Serialize for u32 {
460 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
461 where
462 S: Serializer,
463 {
464 serializer.serialize_u32(name, *self)
465 }
466}
467
468impl Serialize for i32 {
469 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
470 where
471 S: Serializer,
472 {
473 serializer.serialize_i32(name, *self)
474 }
475}
476
477impl Serialize for u64 {
478 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
479 where
480 S: Serializer,
481 {
482 serializer.serialize_u64(name, *self)
483 }
484}
485
486impl Serialize for i64 {
487 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
488 where
489 S: Serializer,
490 {
491 serializer.serialize_i64(name, *self)
492 }
493}
494
495impl Serialize for u128 {
496 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
497 where
498 S: Serializer,
499 {
500 serializer.serialize_u128(name, *self)
501 }
502}
503
504impl Serialize for i128 {
505 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
506 where
507 S: Serializer,
508 {
509 serializer.serialize_i128(name, *self)
510 }
511}
512
513impl Serialize for f32 {
514 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
515 where
516 S: Serializer,
517 {
518 serializer.serialize_f32(name, *self)
519 }
520}
521
522impl Serialize for f64 {
523 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
524 where
525 S: Serializer,
526 {
527 serializer.serialize_f64(name, *self)
528 }
529}
530
531impl Serialize for &str {
533 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
534 where
535 S: Serializer,
536 {
537 serializer.serialize_str(name, self)
538 }
539}
540
541#[cfg(feature = "alloc")]
542impl Serialize for String {
543 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
544 where
545 S: Serializer,
546 {
547 serializer.serialize_string(name, self)
548 }
549}
550
551impl<T: Serialize, const N: usize> Serialize for [T; N] {
553 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
554 where
555 S: Serializer
556 {
557 serializer.serialize_array(name, self)
558 }
559}
560
561impl<T1: Serialize, T2: Serialize> Serialize for (T1, T2) {
563 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
564 where
565 S: Serializer,
566 {
567 self.0.serialize(name, serializer)?;
568 self.1.serialize(name, serializer)?;
569 Ok(())
570 }
571}
572
573impl<T1: Serialize, T2: Serialize, T3: Serialize> Serialize for (T1, T2, T3) {
574 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
575 where
576 S: Serializer
577 {
578 self.0.serialize(name, serializer)?;
579 self.1.serialize(name, serializer)?;
580 self.2.serialize(name, serializer)?;
581 Ok(())
582 }
583}
584
585impl<T: Serialize> Serialize for Option<T> {
587 fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
588 where
589 S: Serializer,
590 {
591 match self {
592 Some(value) => {
593 serializer.serialize_u8(name, 1)?;
594 value.serialize(name, serializer)?;
595 }
596 None => {
597 serializer.serialize_u8(name, 0)?;
598 }
599 }
600 Ok(())
601 }
602}