use std::io::Write;
use serde::ser::{Impossible, Serialize, Serializer, SerializeSeq, SerializeStruct, SerializeTuple};
use error::{Error, ResultE};
use super::bundle_serializer::BundleSerializer;
use super::msg_serializer::MsgSerializer;
use super::pkt_type_decoder::{PktType, PktTypeDecoder};
#[derive(Debug)]
pub struct PktSerializer<W: Write> {
output: W,
}
#[derive(Debug)]
pub struct PktContents<'a, W: Write + 'a> {
output: &'a mut PktSerializer<W>,
state: State,
}
#[derive(Debug)]
enum State {
UnknownType,
Msg(MsgSerializer),
Bundle(BundleSerializer),
}
impl<W: Write> PktSerializer<W> {
pub fn new(output: W) -> Self {
Self{ output }
}
}
impl<'a, W: Write> Serializer for &'a mut PktSerializer<W> {
type Ok = ();
type Error = Error;
type SerializeSeq = PktContents<'a, W>;
type SerializeTuple = Self::SerializeSeq;
type SerializeStruct = Self::SerializeSeq;
type SerializeTupleStruct = Impossible<Self::Ok, Error>;
type SerializeTupleVariant = Impossible<Self::Ok, Error>;
type SerializeMap = Impossible<Self::Ok, Error>;
type SerializeStructVariant = Impossible<Self::Ok, Error>;
default_ser!{bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char
str bytes none some unit unit_struct unit_variant newtype_struct newtype_variant
tuple_struct tuple_variant map struct_variant}
fn serialize_seq(
self,
_size: Option<usize>
) -> ResultE<Self::SerializeSeq>
{
Ok(PktContents{ output: self, state: State::UnknownType })
}
fn serialize_tuple(
self,
size: usize
) -> ResultE<Self::SerializeTuple>
{
self.serialize_seq(Some(size))
}
fn serialize_struct(
self,
_: &'static str,
size: usize
) -> ResultE<Self::SerializeStruct>
{
self.serialize_seq(Some(size))
}
}
impl<'a, W: Write + 'a> SerializeSeq for PktContents<'a, W> {
type Ok = ();
type Error = Error;
fn serialize_element<'b, T: ?Sized>(&'b mut self, value: &T) -> ResultE<()>
where T: Serialize
{
match self.state {
State::UnknownType => {
let mut decoder = PktTypeDecoder::new();
value.serialize(&mut decoder)?;
match decoder.pkt_type() {
PktType::Unknown => Err(Error::BadFormat),
PktType::Msg => {
self.state = State::Msg(MsgSerializer::new(
decoder.data()
)?);
Ok(())
},
PktType::Bundle => {
self.state = State::Bundle(BundleSerializer::new(
decoder.data()
));
Ok(())
},
}
},
State::Msg(ref mut msg) => {
value.serialize(msg)
},
State::Bundle(ref mut bundle) => {
value.serialize(bundle)
},
}
}
fn end(self) -> ResultE<()> {
match self.state {
State::UnknownType => Err(Error::BadFormat),
State::Msg(msg) => {
msg.write_into(&mut self.output.output)
},
State::Bundle(bundle) => {
bundle.write_into(&mut self.output.output)
}
}
}
}
impl<'a, W: Write + 'a> SerializeStruct for PktContents<'a, W> {
type Ok = ();
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, _key: &'static str, value: &T) -> ResultE<()>
where T: Serialize
{
SerializeSeq::serialize_element(self, value)
}
fn end(self) -> ResultE<()> {
SerializeSeq::end(self)
}
}
impl<'a, W: Write + 'a> SerializeTuple for PktContents<'a, W> {
type Ok = ();
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> ResultE<()>
where T: Serialize
{
SerializeSeq::serialize_element(self, value)
}
fn end(self) -> ResultE<()> {
SerializeSeq::end(self)
}
}