use crate::wrapper::ArrayWrap;
use serde::ser::{Serialize, SerializeTuple, Serializer};
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
pub trait Serializable<T: Serialize, const N: usize> {
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer;
}
impl<T: Serialize, const N: usize, const M: usize> Serializable<T, N> for [[T; N]; M] {
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut s = ser.serialize_tuple(N)?;
for item in self {
let wrapped = ArrayWrap::new(item);
s.serialize_element(&wrapped)?;
}
s.end()
}
}
#[cfg(feature = "alloc")]
impl<T: Serialize, const N: usize> Serializable<T, N> for Vec<[T; N]> {
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
use serde::ser::SerializeSeq;
let mut s = ser.serialize_seq(Some(self.len()))?;
for item in self {
let wrapped = ArrayWrap::new(item);
s.serialize_element(&wrapped)?;
}
s.end()
}
}
impl<T: Serialize, const N: usize> Serializable<T, N> for [T; N] {
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize_as_tuple(self, ser)
}
}
fn serialize_as_tuple<S, T, const N: usize>(data: &[T; N], ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize,
{
let mut s = ser.serialize_tuple(N)?;
for item in data {
s.serialize_element(item)?;
}
s.end()
}