use crate::Stack;
use serde::de::{SeqAccess, Visitor};
use serde::ser::SerializeSeq;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt::Formatter;
use std::marker::PhantomData;
impl<V: Serialize + Copy, const N: usize> Serialize for Stack<V, N> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut map = serializer.serialize_seq(Some(self.next))?;
for v in self.iter() {
map.serialize_element(&v)?;
}
map.end()
}
}
struct Vi<V, const N: usize>(PhantomData<V>);
impl<'de, V: Copy + Deserialize<'de>, const N: usize> Visitor<'de> for Vi<V, N> {
type Value = Stack<V, N>;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
formatter.write_str("a Stack")
}
fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut p: Self::Value = Stack::new();
while let Some(v) = access.next_element()? {
p.push(v);
}
Ok(p)
}
}
impl<'de, V: Copy + Deserialize<'de>, const N: usize> Deserialize<'de> for Stack<V, N> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(Vi(PhantomData))
}
}
#[cfg(test)]
use bincode::{deserialize, serialize};
#[test]
fn serialize_and_deserialize() {
let mut before: Stack<u8, 8> = Stack::new();
before.push(42);
let bytes: Vec<u8> = serialize(&before).unwrap();
let after: Stack<u8, 8> = deserialize(&bytes).unwrap();
assert_eq!(42, after.into_iter().next().unwrap());
}