use super::*;
pub trait SerializeNested {
fn serialize_nested<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer;
}
pub struct Nested<'a, T: ?Sized>(pub &'a T);
impl<T> Serialize for Nested<'_, T>
where
T: SerializeNested + Serialize + ?Sized,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
if serializer.is_human_readable() {
self.0.serialize_nested(serializer)
} else {
self.0.serialize(serializer)
}
}
}
pub fn serialize_nested<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: SerializeNested + Serialize + ?Sized,
S: Serializer,
{
Nested(value).serialize(serializer)
}
impl<T> SerializeNested for [T]
where
T: SerializeNested + Serialize,
{
fn serialize_nested<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for item in self {
seq.serialize_element(&Nested(item))?;
}
seq.end()
}
}
impl<T> SerializeNested for Vec<T>
where
T: SerializeNested + Serialize,
{
fn serialize_nested<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.as_slice().serialize_nested(serializer)
}
}
impl<T, const N: usize> SerializeNested for [T; N]
where
T: SerializeNested + Serialize,
{
fn serialize_nested<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.as_slice().serialize_nested(serializer)
}
}
impl<T> SerializeNested for Option<T>
where
T: SerializeNested + Serialize,
{
fn serialize_nested<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
Some(value) => serializer.serialize_some(&Nested(value)),
None => serializer.serialize_none(),
}
}
}
pub(crate) struct ArrayWrapper<'a, D, Dm>(pub &'a ArrayBase<D, Dm>)
where
D: Data,
Dm: Dimension;
impl<D, Dm> Serialize for ArrayWrapper<'_, D, Dm>
where
D: Data,
D::Elem: Serialize,
Dm: Dimension,
ArrayBase<D, Dm>: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
if self.0.ndim() == 0 {
self.0.serialize(serializer)
} else {
serde_ndim::serialize(self.0, serializer)
}
}
}
#[derive(Serialize)]
pub(crate) struct GridArrWrapper<'a, D, const N: usize>(
#[serde(serialize_with = "serialize_grid_arr")] pub &'a [ArrayBase<D, Ix1>; N],
)
where
D: Data,
D::Elem: Serialize;
#[derive(Serialize)]
pub(crate) struct GridVecWrapper<'a, D>(
#[serde(serialize_with = "serialize_grid_vec")] pub &'a [ArrayBase<D, Ix1>],
)
where
D: Data,
D::Elem: Serialize;
pub fn serialize_grid_arr<D, const N: usize, S>(
grid: &[ArrayBase<D, Ix1>; N],
serializer: S,
) -> Result<S::Ok, S::Error>
where
D: Data,
D::Elem: Serialize,
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(N))?;
for arr in grid {
seq.serialize_element(&ArrayWrapper(arr))?;
}
seq.end()
}
pub fn serialize_grid_vec<D, S>(
grid: &[ArrayBase<D, Ix1>],
serializer: S,
) -> Result<S::Ok, S::Error>
where
D: Data,
D::Elem: Serialize,
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(grid.len()))?;
for arr in grid {
seq.serialize_element(&ArrayWrapper(arr))?;
}
seq.end()
}