//! Serialize a Rust data structure into MessagePack data. use crate::bytes::OnlyBytes; use crate::config::BytesMode; use std::error; use std::fmt::{self, Display}; use std::io::Write; use std::marker::PhantomData; use serde; use serde::ser::{ SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple, SerializeTupleStruct, SerializeTupleVariant, }; use serde::Serialize; use rmp::encode::ValueWriteError; use rmp::{encode, Marker}; use crate::config::{ BinaryConfig, DefaultConfig, HumanReadableConfig, RuntimeConfig, SerializerConfig, StructMapConfig, StructTupleConfig }; use crate::MSGPACK_EXT_STRUCT_NAME; /// This type represents all possible errors that can occur when serializing or /// deserializing MessagePack data. #[derive(Debug)] pub enum Error { /// Failed to write a MessagePack value. InvalidValueWrite(ValueWriteError), //TODO: This can be removed at some point /// Failed to serialize struct, sequence or map, because its length is unknown. UnknownLength, /// Invalid Data model, i.e. Serialize trait is not implmented correctly InvalidDataModel(&'static str), /// Depth limit exceeded DepthLimitExceeded, /// Catchall for syntax error messages. Syntax(String), } impl error::Error for Error { #[cold] fn source(&self) -> Option<&(dyn error::Error + 'static)> { match *self { Error::InvalidValueWrite(ref err) => Some(err), Error::UnknownLength => None, Error::InvalidDataModel(_) => None, Error::DepthLimitExceeded => None, Error::Syntax(..) => None, } } } impl Display for Error { #[cold] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { match *self { Error::InvalidValueWrite(ref err) => write!(f, "invalid value write: {err}"), Error::UnknownLength => { f.write_str("attempt to serialize struct, sequence or map with unknown length") } Error::InvalidDataModel(r) => write!(f, "serialize data model is invalid: {r}"), Error::DepthLimitExceeded => f.write_str("depth limit exceeded"), Error::Syntax(ref msg) => f.write_str(msg), } } } impl From for Error { #[cold] fn from(err: ValueWriteError) -> Error { Error::InvalidValueWrite(err) } } impl serde::ser::Error for Error { /// Raised when there is general error when deserializing a type. #[cold] fn custom(msg: T) -> Error { Error::Syntax(msg.to_string()) } } /// Obtain the underlying writer. pub trait UnderlyingWrite { /// Underlying writer type. type Write: Write; /// Gets a reference to the underlying writer. fn get_ref(&self) -> &Self::Write; /// Gets a mutable reference to the underlying writer. /// /// It is inadvisable to directly write to the underlying writer. fn get_mut(&mut self) -> &mut Self::Write; /// Unwraps this `Serializer`, returning the underlying writer. fn into_inner(self) -> Self::Write; } /// Represents MessagePack serialization implementation. /// /// # Note /// /// MessagePack has no specification about how to encode enum types. Thus we are free to do /// whatever we want, so the given choice may be not ideal for you. /// /// An enum value is represented as a single-entry map whose key is the variant /// id and whose value is a sequence containing all associated data. If the enum /// does not have associated data, the sequence is empty. /// /// All instances of `ErrorKind::Interrupted` are handled by this function and the underlying /// operation is retried. // TODO: Docs. Examples. #[derive(Debug)] pub struct Serializer { wr: W, depth: u16, config: RuntimeConfig, _back_compat_config: PhantomData, } impl Serializer { /// Gets a reference to the underlying writer. #[inline(always)] pub fn get_ref(&self) -> &W { &self.wr } /// Gets a mutable reference to the underlying writer. /// /// It is inadvisable to directly write to the underlying writer. #[inline(always)] pub fn get_mut(&mut self) -> &mut W { &mut self.wr } /// Unwraps this `Serializer`, returning the underlying writer. #[inline(always)] pub fn into_inner(self) -> W { self.wr } /// Changes the maximum nesting depth that is allowed. /// /// Currently unused. #[doc(hidden)] #[inline] pub fn unstable_set_max_depth(&mut self, depth: usize) { self.depth = depth.min(u16::MAX as _) as u16; } } impl Serializer { /// Constructs a new `MessagePack` serializer whose output will be written to the writer /// specified. /// /// # Note /// /// This is the default constructor, which returns a serializer that will serialize structs /// and enums using the most compact representation. #[inline] pub fn new(wr: W) -> Self { Serializer { wr, depth: 1024, config: RuntimeConfig::new(DefaultConfig), _back_compat_config: PhantomData, } } } impl<'a, W: Write + 'a, C> Serializer { #[inline] fn compound(&'a mut self) -> Result, Error> { Ok(Compound { se: self }) } } impl<'a, W: Write + 'a, C: SerializerConfig> Serializer { #[inline] fn maybe_unknown_len_compound(&'a mut self, len: Option, f: F) -> Result, Error> where F: Fn(&mut W, u32) -> Result { Ok(MaybeUnknownLengthCompound { compound: match len { Some(len) => { f(&mut self.wr, len)?; None } None => Some(UnknownLengthCompound::from(&*self)), }, se: self, }) } } impl Serializer { /// Consumes this serializer returning the new one, which will serialize structs as a map. /// /// This is used, when the default struct serialization as a tuple does not fit your /// requirements. #[inline] pub fn with_struct_map(self) -> Serializer> { let Serializer { wr, depth, config, _back_compat_config: _ } = self; Serializer { wr, depth, config: RuntimeConfig::new(StructMapConfig::new(config)), _back_compat_config: PhantomData, } } /// Consumes this serializer returning the new one, which will serialize structs as a tuple /// without field names. /// /// This is the default MessagePack serialization mechanism, emitting the most compact /// representation. #[inline] pub fn with_struct_tuple(self) -> Serializer> { let Serializer { wr, depth, config, _back_compat_config: _ } = self; Serializer { wr, depth, config: RuntimeConfig::new(StructTupleConfig::new(config)), _back_compat_config: PhantomData, } } /// Consumes this serializer returning the new one, which will serialize some types in /// human-readable representations (`Serializer::is_human_readable` will return `true`). Note /// that the overall representation is still binary, but some types such as IP addresses will /// be saved as human-readable strings. /// /// This is primarily useful if you need to interoperate with serializations produced by older /// versions of `rmp-serde`. #[inline] pub fn with_human_readable(self) -> Serializer> { let Serializer { wr, depth, config, _back_compat_config: _ } = self; Serializer { wr, depth, config: RuntimeConfig::new(HumanReadableConfig::new(config)), _back_compat_config: PhantomData, } } /// Consumes this serializer returning the new one, which will serialize types as binary /// (`Serializer::is_human_readable` will return `false`). /// /// This is the default MessagePack serialization mechanism, emitting the most compact /// representation. #[inline] pub fn with_binary(self) -> Serializer> { let Serializer { wr, depth, config, _back_compat_config: _ } = self; Serializer { wr, depth, config: RuntimeConfig::new(BinaryConfig::new(config)), _back_compat_config: PhantomData, } } /// Prefer encoding sequences of `u8` as bytes, rather than /// as a sequence of variable-size integers. /// /// This reduces overhead of binary data, but it may break /// decodnig of some Serde types that happen to contain `[u8]`s, /// but don't implement Serde's `visit_bytes`. /// /// ```rust /// use serde::ser::Serialize; /// let mut msgpack_data = Vec::new(); /// let mut serializer = rmp_serde::Serializer::new(&mut msgpack_data) /// .with_bytes(rmp_serde::config::BytesMode::ForceAll); /// vec![255u8; 100].serialize(&mut serializer).unwrap(); /// ``` #[inline] pub fn with_bytes(mut self, mode: BytesMode) -> Serializer { self.config.bytes = mode; self } } impl UnderlyingWrite for Serializer { type Write = W; #[inline(always)] fn get_ref(&self) -> &Self::Write { &self.wr } #[inline(always)] fn get_mut(&mut self) -> &mut Self::Write { &mut self.wr } #[inline(always)] fn into_inner(self) -> Self::Write { self.wr } } /// Hack to store fixed-size arrays (which serde says are tuples) #[derive(Debug)] #[doc(hidden)] pub struct Tuple<'a, W, C> { len: u32, // can't know if all elements are u8 until the end ;( buf: Option>, se: &'a mut Serializer, } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTuple for Tuple<'a, W, C> { type Ok = (); type Error = Error; fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> { if let Some(buf) = &mut self.buf { if let Ok(byte) = value.serialize(OnlyBytes) { buf.push(byte); return Ok(()); } else { encode::write_array_len(&mut self.se.wr, self.len)?; for b in buf { b.serialize(&mut *self.se)?; } self.buf = None; } } value.serialize(&mut *self.se) } fn end(self) -> Result { if let Some(buf) = self.buf { if self.len < 16 && buf.iter().all(|&b| b < 128) { encode::write_array_len(&mut self.se.wr, self.len)?; } else { encode::write_bin_len(&mut self.se.wr, self.len)?; } self.se.wr.write_all(&buf) .map_err(ValueWriteError::InvalidDataWrite)?; } Ok(()) } } /// Part of serde serialization API. #[derive(Debug)] #[doc(hidden)] pub struct Compound<'a, W, C> { se: &'a mut Serializer, } #[derive(Debug)] #[allow(missing_docs)] pub struct ExtFieldSerializer<'a, W> { wr: &'a mut W, tag: Option, finish: bool, } /// Represents MessagePack serialization implementation for Ext. #[derive(Debug)] pub struct ExtSerializer<'a, W> { fields_se: ExtFieldSerializer<'a, W>, tuple_received: bool, } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeSeq for Compound<'a, W, C> { type Ok = (); type Error = Error; #[inline] fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> { value.serialize(&mut *self.se) } #[inline(always)] fn end(self) -> Result { Ok(()) } } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTuple for Compound<'a, W, C> { type Ok = (); type Error = Error; #[inline] fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> { value.serialize(&mut *self.se) } #[inline(always)] fn end(self) -> Result { Ok(()) } } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTupleStruct for Compound<'a, W, C> { type Ok = (); type Error = Error; #[inline] fn serialize_field(&mut self, value: &T) -> Result<(), Self::Error> { value.serialize(&mut *self.se) } #[inline(always)] fn end(self) -> Result { Ok(()) } } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeStruct for Compound<'a, W, C> { type Ok = (); type Error = Error; #[inline] fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> { if self.se.config.is_named { encode::write_str(self.se.get_mut(), key)?; } value.serialize(&mut *self.se) } #[inline(always)] fn end(self) -> Result { Ok(()) } } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTupleVariant for Compound<'a, W, C> { type Ok = (); type Error = Error; #[inline] fn serialize_field(&mut self, value: &T) -> Result<(), Self::Error> { value.serialize(&mut *self.se) } #[inline(always)] fn end(self) -> Result { Ok(()) } } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeStructVariant for Compound<'a, W, C> { type Ok = (); type Error = Error; fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> { if self.se.config.is_named { encode::write_str(self.se.get_mut(), key)?; value.serialize(&mut *self.se) } else { value.serialize(&mut *self.se) } } #[inline(always)] fn end(self) -> Result { Ok(()) } } /// Contains a `Serializer` for sequences and maps whose length is not yet known /// and a counter for the number of elements that are encoded by the `Serializer`. #[derive(Debug)] struct UnknownLengthCompound { se: Serializer, DefaultConfig>, elem_count: u32, } impl From<&Serializer> for UnknownLengthCompound { fn from(se: &Serializer) -> Self { Self { se: Serializer { wr: Vec::with_capacity(128), config: RuntimeConfig::new(se.config), depth: se.depth, _back_compat_config: PhantomData, }, elem_count: 0 } } } /// Contains a `Serializer` for encoding elements of sequences and maps. /// /// # Note /// /// If , for example, a field inside a struct is tagged with `#serde(flatten)` the total number of /// fields of this struct will be unknown to serde because flattened fields may have name clashes /// and then will be overwritten. So, serde wants to serialize the struct as a map with an unknown /// length. /// /// For the described case a `UnknownLengthCompound` is used to encode the elements. On `end()` /// the counted length and the encoded elements will be written to the `Serializer`. A caveat is, /// that structs that contain flattened fields arem always written as a map, even when compact /// representaion is desired. /// /// Otherwise, if the length is known, the elements will be encoded directly by the `Serializer`. #[derive(Debug)] #[doc(hidden)] pub struct MaybeUnknownLengthCompound<'a, W, C> { se: &'a mut Serializer, compound: Option, } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeSeq for MaybeUnknownLengthCompound<'a, W, C> { type Ok = (); type Error = Error; fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> { match self.compound.as_mut() { None => value.serialize(&mut *self.se), Some(buf) => { value.serialize(&mut buf.se)?; buf.elem_count += 1; Ok(()) } } } fn end(self) -> Result { if let Some(compound) = self.compound { encode::write_array_len(&mut self.se.wr, compound.elem_count)?; self.se.wr.write_all(&compound.se.into_inner()) .map_err(ValueWriteError::InvalidDataWrite)?; } Ok(()) } } impl<'a, W: Write + 'a, C: SerializerConfig> SerializeMap for MaybeUnknownLengthCompound<'a, W, C> { type Ok = (); type Error = Error; fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> { ::serialize_element(self, key) } fn serialize_value(&mut self, value: &T) -> Result<(), Self::Error> { ::serialize_element(self, value) } fn end(self) -> Result { if let Some(compound) = self.compound { encode::write_map_len(&mut self.se.wr, compound.elem_count / 2)?; self.se.wr.write_all(&compound.se.into_inner()) .map_err(ValueWriteError::InvalidDataWrite)?; } Ok(()) } } impl<'a, W, C> serde::Serializer for &'a mut Serializer where W: Write, C: SerializerConfig, { type Ok = (); type Error = Error; type SerializeSeq = MaybeUnknownLengthCompound<'a, W, C>; type SerializeTuple = Tuple<'a, W, C>; type SerializeTupleStruct = Compound<'a, W, C>; type SerializeTupleVariant = Compound<'a, W, C>; type SerializeMap = MaybeUnknownLengthCompound<'a, W, C>; type SerializeStruct = Compound<'a, W, C>; type SerializeStructVariant = Compound<'a, W, C>; #[inline] fn is_human_readable(&self) -> bool { self.config.is_human_readable } fn serialize_bool(self, v: bool) -> Result { encode::write_bool(&mut self.wr, v) .map_err(|err| Error::InvalidValueWrite(ValueWriteError::InvalidMarkerWrite(err))) } fn serialize_i8(self, v: i8) -> Result { self.serialize_i64(i64::from(v)) } fn serialize_i16(self, v: i16) -> Result { self.serialize_i64(i64::from(v)) } fn serialize_i32(self, v: i32) -> Result { self.serialize_i64(i64::from(v)) } fn serialize_i64(self, v: i64) -> Result { encode::write_sint(&mut self.wr, v)?; Ok(()) } fn serialize_i128(self, v: i128) -> Result { self.serialize_bytes(&v.to_be_bytes()) } fn serialize_u8(self, v: u8) -> Result { self.serialize_u64(u64::from(v)) } fn serialize_u16(self, v: u16) -> Result { self.serialize_u64(u64::from(v)) } fn serialize_u32(self, v: u32) -> Result { self.serialize_u64(u64::from(v)) } fn serialize_u64(self, v: u64) -> Result { encode::write_uint(&mut self.wr, v)?; Ok(()) } fn serialize_u128(self, v: u128) -> Result { self.serialize_bytes(&v.to_be_bytes()) } fn serialize_f32(self, v: f32) -> Result { encode::write_f32(&mut self.wr, v)?; Ok(()) } fn serialize_f64(self, v: f64) -> Result { encode::write_f64(&mut self.wr, v)?; Ok(()) } fn serialize_char(self, v: char) -> Result { // A char encoded as UTF-8 takes 4 bytes at most. let mut buf = [0; 4]; self.serialize_str(v.encode_utf8(&mut buf)) } fn serialize_str(self, v: &str) -> Result { encode::write_str(&mut self.wr, v)?; Ok(()) } fn serialize_bytes(self, value: &[u8]) -> Result { Ok(encode::write_bin(&mut self.wr, value)?) } fn serialize_none(self) -> Result<(), Self::Error> { self.serialize_unit() } fn serialize_some(self, v: &T) -> Result<(), Self::Error> { v.serialize(self) } fn serialize_unit(self) -> Result { encode::write_nil(&mut self.wr) .map_err(|err| Error::InvalidValueWrite(ValueWriteError::InvalidMarkerWrite(err))) } fn serialize_unit_struct(self, _name: &'static str) -> Result { encode::write_array_len(&mut self.wr, 0)?; Ok(()) } fn serialize_unit_variant(self, _name: &str, _: u32, variant: &'static str) -> Result { self.serialize_str(variant) } fn serialize_newtype_struct(self, name: &'static str, value: &T) -> Result<(), Self::Error> { if name == MSGPACK_EXT_STRUCT_NAME { let mut ext_se = ExtSerializer::new(self); value.serialize(&mut ext_se)?; return ext_se.end(); } // Encode as if it's inner type. value.serialize(self) } fn serialize_newtype_variant(self, _name: &'static str, _: u32, variant: &'static str, value: &T) -> Result { // encode as a map from variant idx to its attributed data, like: {idx => value} encode::write_map_len(&mut self.wr, 1)?; self.serialize_str(variant)?; value.serialize(self) } #[inline] fn serialize_seq(self, len: Option) -> Result { self.maybe_unknown_len_compound(len.map(|len| len as u32), |wr, len| encode::write_array_len(wr, len)) } fn serialize_tuple(self, len: usize) -> Result { Ok(Tuple { buf: if self.config.bytes == BytesMode::ForceAll && len > 0 { Some(Vec::new()) } else { encode::write_array_len(&mut self.wr, len as u32)?; None }, len: len as u32, se: self, }) } fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result { encode::write_array_len(&mut self.wr, len as u32)?; self.compound() } fn serialize_tuple_variant(self, _name: &'static str, _: u32, variant: &'static str, len: usize) -> Result { // encode as a map from variant idx to a sequence of its attributed data, like: {idx => [v1,...,vN]} encode::write_map_len(&mut self.wr, 1)?; self.serialize_str(variant)?; encode::write_array_len(&mut self.wr, len as u32)?; self.compound() } #[inline] fn serialize_map(self, len: Option) -> Result { self.maybe_unknown_len_compound(len.map(|len| len as u32), |wr, len| encode::write_map_len(wr, len)) } fn serialize_struct(self, _name: &'static str, len: usize) -> Result { if self.config.is_named { encode::write_map_len(self.get_mut(), len as u32)?; } else { encode::write_array_len(self.get_mut(), len as u32)?; } self.compound() } fn serialize_struct_variant(self, name: &'static str, _: u32, variant: &'static str, len: usize) -> Result { // encode as a map from variant idx to a sequence of its attributed data, like: {idx => [v1,...,vN]} encode::write_map_len(&mut self.wr, 1)?; self.serialize_str(variant)?; self.serialize_struct(name, len) } fn collect_seq(self, iter: I) -> Result where I: IntoIterator, I::Item: Serialize { let iter = iter.into_iter(); let len = match iter.size_hint() { (lo, Some(hi)) if lo == hi && lo <= u32::MAX as usize => Some(lo as u32), _ => None, }; const MAX_ITER_SIZE: usize = std::mem::size_of::<<&[u8] as IntoIterator>::IntoIter>(); const ITEM_PTR_SIZE: usize = std::mem::size_of::<&u8>(); // Estimate whether the input is `&[u8]` or similar (hacky, because Rust lacks proper specialization) let might_be_a_bytes_iter = (std::mem::size_of::() == 1 || std::mem::size_of::() == ITEM_PTR_SIZE) // Complex types like HashSet don't support reading bytes. // The simplest iterator is ptr+len. && std::mem::size_of::() <= MAX_ITER_SIZE; let mut iter = iter.peekable(); if might_be_a_bytes_iter && self.config.bytes != BytesMode::Normal { if let Some(len) = len { // The `OnlyBytes` serializer emits `Err` for everything except `u8` if iter.peek().map_or(false, |item| item.serialize(OnlyBytes).is_ok()) { return self.bytes_from_iter(iter, len); } } } let mut serializer = self.serialize_seq(len.map(|len| len as usize))?; iter.try_for_each(|item| serializer.serialize_element(&item))?; SerializeSeq::end(serializer) } } impl Serializer { fn bytes_from_iter(&mut self, mut iter: I, len: u32) -> Result<(), <&mut Self as serde::Serializer>::Error> where I: Iterator, I::Item: Serialize { encode::write_bin_len(&mut self.wr, len)?; iter.try_for_each(|item| { self.wr.write(std::slice::from_ref(&item.serialize(OnlyBytes) .map_err(|_| Error::InvalidDataModel("BytesMode"))?)) .map_err(ValueWriteError::InvalidDataWrite)?; Ok(()) }) } } impl<'a, W: Write + 'a> serde::Serializer for &mut ExtFieldSerializer<'a, W> { type Ok = (); type Error = Error; type SerializeSeq = serde::ser::Impossible<(), Error>; type SerializeTuple = serde::ser::Impossible<(), Error>; type SerializeTupleStruct = serde::ser::Impossible<(), Error>; type SerializeTupleVariant = serde::ser::Impossible<(), Error>; type SerializeMap = serde::ser::Impossible<(), Error>; type SerializeStruct = serde::ser::Impossible<(), Error>; type SerializeStructVariant = serde::ser::Impossible<(), Error>; #[inline] fn serialize_i8(self, value: i8) -> Result { if self.tag.is_none() { self.tag.replace(value); Ok(()) } else { Err(Error::InvalidDataModel("expected i8 and bytes")) } } #[inline] fn serialize_bytes(self, val: &[u8]) -> Result { if let Some(tag) = self.tag.take() { encode::write_ext_meta(self.wr, val.len() as u32, tag)?; self.wr .write_all(val) .map_err(|err| Error::InvalidValueWrite(ValueWriteError::InvalidDataWrite(err)))?; self.finish = true; Ok(()) } else { Err(Error::InvalidDataModel("expected i8 and bytes")) } } #[inline] fn serialize_bool(self, _val: bool) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_i16(self, _val: i16) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_i32(self, _val: i32) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_i64(self, _val: i64) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_u8(self, _val: u8) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_u16(self, _val: u16) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_u32(self, _val: u32) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_u64(self, _val: u64) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_f32(self, _val: f32) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_f64(self, _val: f64) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_char(self, _val: char) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_str(self, _val: &str) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_unit(self) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_unit_struct(self, _name: &'static str) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_unit_variant(self, _name: &'static str, _idx: u32, _variant: &'static str) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_newtype_struct(self, _name: &'static str, _value: &T) -> Result where T: Serialize { Err(Error::InvalidDataModel("expected i8 and bytes")) } fn serialize_newtype_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _value: &T) -> Result where T: Serialize { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_none(self) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_some(self, _value: &T) -> Result where T: Serialize { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_seq(self, _len: Option) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_tuple(self, _len: usize) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_tuple_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_map(self, _len: Option) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_struct(self, _name: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } #[inline] fn serialize_struct_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected i8 and bytes")) } } impl<'a, W: Write + 'a> serde::ser::Serializer for &mut ExtSerializer<'a, W> { type Ok = (); type Error = Error; type SerializeSeq = serde::ser::Impossible<(), Error>; type SerializeTuple = Self; type SerializeTupleStruct = serde::ser::Impossible<(), Error>; type SerializeTupleVariant = serde::ser::Impossible<(), Error>; type SerializeMap = serde::ser::Impossible<(), Error>; type SerializeStruct = serde::ser::Impossible<(), Error>; type SerializeStructVariant = serde::ser::Impossible<(), Error>; #[inline] fn serialize_bytes(self, _val: &[u8]) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_bool(self, _val: bool) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_i8(self, _value: i8) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_i16(self, _val: i16) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_i32(self, _val: i32) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_i64(self, _val: i64) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_u8(self, _val: u8) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_u16(self, _val: u16) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_u32(self, _val: u32) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_u64(self, _val: u64) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_f32(self, _val: f32) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_f64(self, _val: f64) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_char(self, _val: char) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_str(self, _val: &str) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_unit(self) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_unit_struct(self, _name: &'static str) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_unit_variant(self, _name: &'static str, _idx: u32, _variant: &'static str) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_newtype_struct(self, _name: &'static str, _value: &T) -> Result where T: Serialize { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_newtype_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _value: &T) -> Result where T: Serialize { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_none(self) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_some(self, _value: &T) -> Result where T: Serialize { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_seq(self, _len: Option) -> Result { Err(Error::InvalidDataModel("expected tuple")) } fn serialize_tuple(self, _len: usize) -> Result { // FIXME check len self.tuple_received = true; Ok(self) } #[inline] fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_tuple_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_map(self, _len: Option) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_struct(self, _name: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected tuple")) } #[inline] fn serialize_struct_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result { Err(Error::InvalidDataModel("expected tuple")) } } impl<'a, W: Write + 'a> SerializeTuple for &mut ExtSerializer<'a, W> { type Ok = (); type Error = Error; #[inline] fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> { value.serialize(&mut self.fields_se) } #[inline(always)] fn end(self) -> Result { Ok(()) } } impl<'a, W: Write + 'a> ExtSerializer<'a, W> { #[inline] fn new(ser: &'a mut Serializer) -> Self { Self { fields_se: ExtFieldSerializer::new(ser), tuple_received: false, } } #[inline] fn end(self) -> Result<(), Error> { if !self.tuple_received { Err(Error::InvalidDataModel("expected tuple")) } else { self.fields_se.end() } } } impl<'a, W: Write + 'a> ExtFieldSerializer<'a, W> { #[inline] fn new(ser: &'a mut Serializer) -> Self { Self { wr: UnderlyingWrite::get_mut(ser), tag: None, finish: false, } } #[inline] fn end(self) -> Result<(), Error> { if self.finish { Ok(()) } else { Err(Error::InvalidDataModel("expected i8 and bytes")) } } } /// Serialize the given data structure as MessagePack into the I/O stream. /// This function uses compact representation - structures as arrays /// /// Serialization can fail if `T`'s implementation of `Serialize` decides to fail. #[inline] pub fn write(wr: &mut W, val: &T) -> Result<(), Error> where W: Write + ?Sized, T: Serialize + ?Sized, { val.serialize(&mut Serializer::new(wr)) } /// Serialize the given data structure as MessagePack into the I/O stream. /// This function serializes structures as maps /// /// Serialization can fail if `T`'s implementation of `Serialize` decides to fail. pub fn write_named(wr: &mut W, val: &T) -> Result<(), Error> where W: Write + ?Sized, T: Serialize + ?Sized, { let mut se = Serializer::new(wr); // Avoids another monomorphisation of `StructMapConfig` se.config = RuntimeConfig::new(StructMapConfig::new(se.config)); val.serialize(&mut se) } /// Serialize the given data structure as a MessagePack byte vector. /// This method uses compact representation, structs are serialized as arrays /// /// Serialization can fail if `T`'s implementation of `Serialize` decides to fail. #[inline] pub fn to_vec(val: &T) -> Result, Error> where T: Serialize + ?Sized, { let mut wr = FallibleWriter(Vec::new()); write(&mut wr, val)?; Ok(wr.0) } /// Serializes data structure into byte vector as a map /// Resulting MessagePack message will contain field names /// /// # Errors /// /// Serialization can fail if `T`'s implementation of `Serialize` decides to fail. #[inline] pub fn to_vec_named(val: &T) -> Result, Error> where T: Serialize + ?Sized, { let mut wr = FallibleWriter(Vec::new()); write_named(&mut wr, val)?; Ok(wr.0) } #[repr(transparent)] struct FallibleWriter(Vec); impl Write for FallibleWriter { #[inline(always)] fn write(&mut self, buf: &[u8]) -> std::io::Result { self.write_all(buf)?; Ok(buf.len()) } #[inline] fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { self.0.try_reserve(buf.len()).map_err(|_| std::io::ErrorKind::OutOfMemory)?; self.0.extend_from_slice(buf); Ok(()) } fn flush(&mut self) -> std::io::Result<()> { Ok(()) } }