use std::io::Read;
use byteorder::{BigEndian, ReadBytesExt};
use serde::de;
use serde::de::Visitor;
use error::{Error, ResultE};
use super::osc_reader::OscReader;
use super::msg_visitor::MsgVisitor;
use super::bundle_visitor::BundleVisitor;
#[derive(Debug)]
pub struct PktDeserializer<'a, R: Read + 'a> {
reader: &'a mut R,
}
impl<'a, R> PktDeserializer<'a, R>
where R: Read + 'a
{
pub fn new(reader: &'a mut R) -> Self {
Self{ reader }
}
}
impl<'de, 'a, R> de::Deserializer<'de> for &'a mut PktDeserializer<'a, R>
where R: Read + 'a
{
type Error = Error;
fn deserialize_any<V>(self, visitor: V) -> ResultE<V::Value>
where V: Visitor<'de>
{
let length = self.reader.read_i32::<BigEndian>()?;
let mut reader = self.reader.take(length as u64);
let address = reader.parse_str()?;
let result = match address.as_str() {
"#bundle" => visitor.visit_seq(BundleVisitor::new(&mut reader)),
_ => visitor.visit_seq(MsgVisitor::new(&mut reader, address)),
};
let size = reader.limit() as usize;
let mut extra_chars = Vec::with_capacity(size);
extra_chars.resize(size, Default::default());
reader.read_exact(&mut extra_chars)?;
result
}
forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
seq bytes byte_buf map unit_struct newtype_struct
tuple_struct struct identifier tuple enum ignored_any
}
}