#[cfg(feature = "alloc")]
use alloc::string::String;
use crate::error::{Error, Result};
pub trait Serialize {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer;
}
pub trait Serializer: Sized {
type Error: From<Error>;
fn serialize_bool(&mut self, name: &str, v: bool) -> core::result::Result<(), Self::Error>;
fn serialize_u8(&mut self, name: &str, v: u8) -> core::result::Result<(), Self::Error>;
fn serialize_i8(&mut self, name: &str, v: i8) -> core::result::Result<(), Self::Error>;
fn serialize_u16(&mut self, name: &str, v: u16) -> core::result::Result<(), Self::Error>;
fn serialize_i16(&mut self, name: &str, v: i16) -> core::result::Result<(), Self::Error>;
fn serialize_u32(&mut self, name: &str, v: u32) -> core::result::Result<(), Self::Error>;
fn serialize_i32(&mut self, name: &str, v: i32) -> core::result::Result<(), Self::Error>;
fn serialize_u64(&mut self, name: &str, v: u64) -> core::result::Result<(), Self::Error>;
fn serialize_i64(&mut self, name: &str, v: i64) -> core::result::Result<(), Self::Error>;
fn serialize_u128(&mut self, name: &str, v: u128) -> core::result::Result<(), Self::Error>;
fn serialize_i128(&mut self, name: &str, v: i128) -> core::result::Result<(), Self::Error>;
fn serialize_f32(&mut self, name: &str, v: f32) -> core::result::Result<(), Self::Error>;
fn serialize_f64(&mut self, name: &str, v: f64) -> core::result::Result<(), Self::Error>;
fn serialize_bytes(&mut self, name: &str, v: &[u8]) -> core::result::Result<(), Self::Error>;
fn serialize_string(&mut self, name: &str, v: &String) -> core::result::Result<(), Self::Error>;
fn serialize_str(&mut self, name: &str, v: &str) -> core::result::Result<(), Self::Error>;
fn serialize_vec<T>(&mut self, name: &str, v: &alloc::vec::Vec<T>) -> core::result::Result<(), Self::Error>
where
T: Serialize;
fn serialize_array<T>(&mut self, name: &str, v: &[T]) -> core::result::Result<(), Self::Error>
where
T: Serialize;
fn serialize_struct_start(&mut self, _name: &str, _len: usize) -> core::result::Result<(), Self::Error> {
Ok(())
}
fn serialize_field<T>(&mut self, name: &str, value: &T) -> core::result::Result<(), Self::Error>
where
T: Serialize,
{
value.serialize(name, self)
}
fn serialize_struct_end(&mut self) -> core::result::Result<(), Self::Error> {
Ok(())
}
}
pub struct ByteSerializer<'a> {
buffer: &'a mut [u8],
position: usize,
}
impl<'a> ByteSerializer<'a> {
pub fn new(buffer: &'a mut [u8]) -> Self {
Self {
buffer,
position: 0,
}
}
pub fn position(&self) -> usize {
self.position
}
fn write_bytes(&mut self, bytes: &[u8]) -> Result<()> {
if self.position + bytes.len() > self.buffer.len() {
return Err(Error::BufferTooSmall);
}
self.buffer[self.position..self.position + bytes.len()].copy_from_slice(bytes);
self.position += bytes.len();
Ok(())
}
}
impl<'a> Serializer for ByteSerializer<'a> {
type Error = Error;
fn serialize_bool(&mut self, _name: &str, v: bool) -> Result<()> {
self.serialize_u8("", if v { 1 } else { 0 })
}
fn serialize_u8(&mut self, _name: &str, v: u8) -> Result<()> {
self.write_bytes(&[v])
}
fn serialize_i8(&mut self, _name: &str, v: i8) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_u16(&mut self, _name: &str, v: u16) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_i16(&mut self, _name: &str, v: i16) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_u32(&mut self, _name: &str, v: u32) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_i32(&mut self, _name: &str, v: i32) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_u64(&mut self, _name: &str, v: u64) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_i64(&mut self, _name: &str, v: i64) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_u128(&mut self, _name: &str, v: u128) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_i128(&mut self, _name: &str, v: i128) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_f32(&mut self, _name: &str, v: f32) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_f64(&mut self, _name: &str, v: f64) -> Result<()> {
self.write_bytes(&v.to_le_bytes())
}
fn serialize_bytes(&mut self, _name: &str, v: &[u8]) -> Result<()> {
self.serialize_u32("", v.len() as u32)?;
self.write_bytes(v)
}
fn serialize_string(&mut self, name: &str, v: &String) -> core::result::Result<(), Self::Error> {
self.serialize_str(name, v.as_str())
}
fn serialize_str(&mut self, name: &str, v: &str) -> core::result::Result<(), Self::Error> {
self.serialize_bytes(name, v.as_bytes())
}
fn serialize_vec<T>(&mut self, name: &str, v: &alloc::vec::Vec<T>) -> core::result::Result<(), Self::Error>
where
T: Serialize {
self.serialize_u32(name, v.len() as u32)?;
for item in v.iter() {
item.serialize(name, self)?;
}
Ok(())
}
fn serialize_array<T>(&mut self, name: &str, v: &[T]) -> core::result::Result<(), Self::Error>
where
T: Serialize {
for item in v.iter() {
item.serialize(name, self)?;
}
Ok(())
}
}
impl Serialize for bool {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer
{
serializer.serialize_bool(name, *self)
}
}
impl Serialize for u8 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_u8(name, *self)
}
}
impl Serialize for i8 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_i8(name, *self)
}
}
impl Serialize for u16 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_u16(name, *self)
}
}
impl Serialize for i16 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_i16(name, *self)
}
}
impl Serialize for u32 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_u32(name, *self)
}
}
impl Serialize for i32 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_i32(name, *self)
}
}
impl Serialize for u64 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_u64(name, *self)
}
}
impl Serialize for i64 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_i64(name, *self)
}
}
impl Serialize for u128 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_u128(name, *self)
}
}
impl Serialize for i128 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_i128(name, *self)
}
}
impl Serialize for f32 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_f32(name, *self)
}
}
impl Serialize for f64 {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_f64(name, *self)
}
}
impl Serialize for &str {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_str(name, self)
}
}
#[cfg(feature = "alloc")]
impl Serialize for String {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
serializer.serialize_string(name, self)
}
}
impl<T: Serialize, const N: usize> Serialize for [T; N] {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer
{
serializer.serialize_array(name, self)
}
}
impl<T1: Serialize, T2: Serialize> Serialize for (T1, T2) {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
self.0.serialize(name, serializer)?;
self.1.serialize(name, serializer)?;
Ok(())
}
}
impl<T1: Serialize, T2: Serialize, T3: Serialize> Serialize for (T1, T2, T3) {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer
{
self.0.serialize(name, serializer)?;
self.1.serialize(name, serializer)?;
self.2.serialize(name, serializer)?;
Ok(())
}
}
impl<T: Serialize> Serialize for Option<T> {
fn serialize<S>(&self, name: &str, serializer: &mut S) -> core::result::Result<(), S::Error>
where
S: Serializer,
{
match self {
Some(value) => {
serializer.serialize_u8(name, 1)?;
value.serialize(name, serializer)?;
}
None => {
serializer.serialize_u8(name, 0)?;
}
}
Ok(())
}
}