use std::cell::RefCell; use std::rc::Rc; use serde::de::{DeserializeSeed, Visitor}; use serde::{Deserializer, Serialize, Serializer}; use super::{AutoReturnBuffer, BufferPool}; impl Serialize for AutoReturnBuffer { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(&*self.borrow()) } } pub struct AutoReturnBufferDeserializer { pub collector: Rc>>, } impl<'de, const SIZE: usize> DeserializeSeed<'de> for AutoReturnBufferDeserializer { type Value = AutoReturnBuffer; fn deserialize(self, deserializer: D) -> Result where D: Deserializer<'de>, { struct BytesVisitor; impl<'de, const SIZE: usize> Visitor<'de> for BytesVisitor { type Value = [u8; SIZE]; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str(std::any::type_name::()) } fn visit_bytes(self, v: &[u8]) -> Result where E: serde::de::Error, { v.try_into().map_err(E::custom) } fn visit_seq(self, mut seq: A) -> Result where A: serde::de::SeqAccess<'de>, { let mut vec = Vec::new(); while let Some(e) = seq.next_element()? { vec.push(e); } vec.as_slice().try_into().map_err(serde::de::Error::custom) } } let buff = BufferPool::get_from_buffer_pool(&self.collector); *buff.borrow_mut() = deserializer.deserialize_bytes(BytesVisitor)?; // TODO: pass ref into deserialize_bytes so visitor can operate on it directly. Ok(buff) } }