blob: 2f0895a92b72b1ed2bf057f987483d8d56d27e8e [file] [log] [blame] [edit]
//! Serialize a Rust data structure into MessagePack data.
use std::error;
use std::fmt::{self, Display};
use std::io::Write;
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, 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<ValueWriteError> 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<T: Display>(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<W, C = DefaultConfig> {
wr: W,
config: C,
depth: usize,
}
impl<W: Write, C> Serializer<W, C> {
/// 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;
}
}
impl<W: Write> Serializer<W, DefaultConfig> {
/// 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: DefaultConfig,
}
}
}
impl<'a, W: Write + 'a, C> Serializer<W, C> {
#[inline]
fn compound(&'a mut self) -> Result<Compound<'a, W, C>, Error> {
let c = Compound { se: self };
Ok(c)
}
}
impl<'a, W: Write + 'a, C: SerializerConfig> Serializer<W, C> {
#[inline]
fn maybe_unknown_len_compound<F>(&'a mut self, len: Option<usize>, f: F) -> Result<MaybeUnknownLengthCompound<'a, W, C>, Error>
where F: Fn(&mut W, u32) -> Result<Marker, ValueWriteError>
{
Ok(MaybeUnknownLengthCompound {
compound: match len {
Some(len) => {
f(&mut self.wr, len as u32)?;
None
}
None => Some(UnknownLengthCompound::from(&*self)),
},
se: self,
})
}
}
impl<W: Write, C> Serializer<W, C> {
/// 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<W, StructMapConfig<C>> {
let Serializer { wr, depth, config } = self;
Serializer {
wr,
depth,
config: StructMapConfig::new(config),
}
}
/// 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<W, StructTupleConfig<C>> {
let Serializer { wr, depth, config } = self;
Serializer {
wr,
depth,
config: StructTupleConfig::new(config),
}
}
/// 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<W, HumanReadableConfig<C>> {
let Serializer { wr, depth, config } = self;
Serializer {
wr,
depth,
config: HumanReadableConfig::new(config),
}
}
/// 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<W, BinaryConfig<C>> {
let Serializer { wr, depth, config } = self;
Serializer {
wr,
depth,
config: BinaryConfig::new(config),
}
}
}
impl<W: Write, C> UnderlyingWrite for Serializer<W, C> {
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
}
}
/// Part of serde serialization API.
#[derive(Debug)]
pub struct Compound<'a, W: 'a, C: 'a> {
se: &'a mut Serializer<W, C>,
}
#[derive(Debug)]
#[allow(missing_docs)]
pub struct ExtFieldSerializer<'a, W> {
wr: &'a mut W,
tag: Option<i8>,
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<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
value.serialize(&mut *self.se)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
Ok(())
}
}
impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTuple for Compound<'a, W, C> {
type Ok = ();
type Error = Error;
#[inline]
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
value.serialize(&mut *self.se)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
Ok(())
}
}
impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTupleStruct for Compound<'a, W, C> {
type Ok = ();
type Error = Error;
#[inline]
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
value.serialize(&mut *self.se)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
Ok(())
}
}
impl<'a, W: Write + 'a, C: SerializerConfig> SerializeStruct for Compound<'a, W, C> {
type Ok = ();
type Error = Error;
#[inline]
fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) ->
Result<(), Self::Error>
{
C::write_struct_field(&mut *self.se, key, value)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
Ok(())
}
}
impl<'a, W: Write + 'a, C: SerializerConfig> SerializeTupleVariant for Compound<'a, W, C> {
type Ok = ();
type Error = Error;
#[inline]
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
value.serialize(&mut *self.se)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
Ok(())
}
}
impl<'a, W: Write + 'a, C: SerializerConfig> SerializeStructVariant for Compound<'a, W, C> {
type Ok = ();
type Error = Error;
fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) ->
Result<(), Self::Error>
{
C::write_struct_field(&mut *self.se, key, value)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
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<C> {
se: Serializer<Vec<u8>, C>,
elem_count: u32,
}
impl<W, C: SerializerConfig> From<&Serializer<W, C>> for UnknownLengthCompound<C> {
fn from(se: &Serializer<W, C>) -> Self {
Self {
se: Serializer { wr: Vec::with_capacity(128), config: se.config, depth: se.depth },
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)]
pub struct MaybeUnknownLengthCompound<'a, W: 'a, C: 'a> {
se: &'a mut Serializer<W, C>,
compound: Option<UnknownLengthCompound<C>>,
}
impl<'a, W: Write + 'a, C: SerializerConfig> SerializeSeq for MaybeUnknownLengthCompound<'a, W, C> {
type Ok = ();
type Error = Error;
fn serialize_element<T: ?Sized + Serialize>(&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<Self::Ok, Self::Error> {
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<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
<Self as SerializeSeq>::serialize_element(self, key)
}
fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
<Self as SerializeSeq>::serialize_element(self, value)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
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<W, C>
where
W: Write,
C: SerializerConfig,
{
type Ok = ();
type Error = Error;
type SerializeSeq = MaybeUnknownLengthCompound<'a, W, C>;
type SerializeTuple = Compound<'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>;
fn is_human_readable(&self) -> bool {
C::is_human_readable()
}
fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
encode::write_bool(&mut self.wr, v)
.map_err(|err| Error::InvalidValueWrite(ValueWriteError::InvalidMarkerWrite(err)))
}
fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
self.serialize_i64(v as i64)
}
fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
self.serialize_i64(v as i64)
}
fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
self.serialize_i64(v as i64)
}
fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
encode::write_sint(&mut self.wr, v)?;
Ok(())
}
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
self.serialize_bytes(&v.to_be_bytes())
}
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
self.serialize_u64(v as u64)
}
fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
self.serialize_u64(v as u64)
}
fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
self.serialize_u64(v as u64)
}
fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
encode::write_uint(&mut self.wr, v)?;
Ok(())
}
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
self.serialize_bytes(&v.to_be_bytes())
}
fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
encode::write_f32(&mut self.wr, v)?;
Ok(())
}
fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
encode::write_f64(&mut self.wr, v)?;
Ok(())
}
fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
// 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<Self::Ok, Self::Error> {
encode::write_str(&mut self.wr, v)?;
Ok(())
}
fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
encode::write_bin_len(&mut self.wr, value.len() as u32)?;
self.wr
.write_all(value)
.map_err(|err| Error::InvalidValueWrite(ValueWriteError::InvalidDataWrite(err)))
}
fn serialize_none(self) -> Result<(), Self::Error> {
self.serialize_unit()
}
fn serialize_some<T: ?Sized + serde::Serialize>(self, v: &T) -> Result<(), Self::Error> {
v.serialize(self)
}
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
encode::write_nil(&mut self.wr)
.map_err(|err| Error::InvalidValueWrite(ValueWriteError::InvalidMarkerWrite(err)))
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
encode::write_array_len(&mut self.wr, 0)?;
Ok(())
}
fn serialize_unit_variant(self, _name: &str, idx: u32, variant: &'static str) ->
Result<Self::Ok, Self::Error>
{
C::write_variant_ident(self, idx, variant)
}
fn serialize_newtype_struct<T: ?Sized + serde::Serialize>(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<T: ?Sized + serde::Serialize>(self, _name: &'static str, idx: u32, variant: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
// encode as a map from variant idx to its attributed data, like: {idx => value}
encode::write_map_len(&mut self.wr, 1)?;
C::write_variant_ident(self, idx, variant)?;
value.serialize(self)
}
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
self.maybe_unknown_len_compound(len, |wr, len| encode::write_array_len(wr, len))
}
//TODO: normal compund
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
encode::write_array_len(&mut self.wr, len as u32)?;
self.compound()
}
fn serialize_tuple_struct(self, _name: &'static str, len: usize) ->
Result<Self::SerializeTupleStruct, Self::Error>
{
encode::write_array_len(&mut self.wr, len as u32)?;
self.compound()
}
fn serialize_tuple_variant(self, _name: &'static str, idx: u32, variant: &'static str, len: usize) ->
Result<Self::SerializeTupleVariant, Error>
{
// 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)?;
C::write_variant_ident(self, idx, variant)?;
self.serialize_tuple(len)
}
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Error> {
self.maybe_unknown_len_compound(len, |wr, len| encode::write_map_len(wr, len))
}
fn serialize_struct(self, _name: &'static str, len: usize) ->
Result<Self::SerializeStruct, Self::Error>
{
C::write_struct_len(self, len)?;
self.compound()
}
fn serialize_struct_variant(self, name: &'static str, id: u32, variant: &'static str, len: usize) ->
Result<Self::SerializeStructVariant, Error>
{
// 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)?;
C::write_variant_ident(self, id, variant)?;
self.serialize_struct(name, len)
}
}
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<Self::Ok, Self::Error> {
if self.tag.is_none() {
self.tag.replace(value);
Ok(())
} else {
Err(Error::InvalidDataModel("expected i8 and bytes, unexpected second i8"))
}
}
#[inline]
fn serialize_bytes(self, val: &[u8]) -> Result<Self::Ok, Self::Error> {
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, received bytes first"))
}
}
#[inline]
fn serialize_bool(self, _val: bool) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, bool unexpected"))
}
#[inline]
fn serialize_i16(self, _val: i16) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, i16 unexpected"))
}
#[inline]
fn serialize_i32(self, _val: i32) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, i32 unexpected"))
}
#[inline]
fn serialize_i64(self, _val: i64) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, i64 unexpected"))
}
#[inline]
fn serialize_u8(self, _val: u8) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, u8 unexpected"))
}
#[inline]
fn serialize_u16(self, _val: u16) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, u16 unexpected"))
}
#[inline]
fn serialize_u32(self, _val: u32) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, u32 unexpected"))
}
#[inline]
fn serialize_u64(self, _val: u64) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, u64 unexpected"))
}
#[inline]
fn serialize_f32(self, _val: f32) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, f32 unexpected"))
}
#[inline]
fn serialize_f64(self, _val: f64) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, f64 unexpected"))
}
#[inline]
fn serialize_char(self, _val: char) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, char unexpected"))
}
#[inline]
fn serialize_str(self, _val: &str) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, str unexpected"))
}
#[inline]
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, unit unexpected"))
}
#[inline]
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, unit struct unexpected"))
}
#[inline]
fn serialize_unit_variant(self, _name: &'static str, _idx: u32, _variant: &'static str) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, unit variant unexpected"))
}
#[inline]
fn serialize_newtype_struct<T: ?Sized>(self, _name: &'static str, _value: &T) -> Result<Self::Ok, Self::Error>
where T: Serialize
{
Err(Error::InvalidDataModel("expected i8 and bytes, newtype struct unexpected"))
}
fn serialize_newtype_variant<T: ?Sized>(self, _name: &'static str, _idx: u32, _variant: &'static str, _value: &T) -> Result<Self::Ok, Self::Error>
where T: Serialize
{
Err(Error::InvalidDataModel("expected i8 and bytes, newtype variant unexpected"))
}
#[inline]
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, none unexpected"))
}
#[inline]
fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<Self::Ok, Self::Error>
where T: Serialize
{
Err(Error::InvalidDataModel("expected i8 and bytes, some unexpected"))
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, seq unexpected"))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, tuple unexpected"))
}
fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeTupleStruct, Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, tuple struct unexpected"))
}
fn serialize_tuple_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeTupleVariant, Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, tuple variant unexpected"))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, map unexpected"))
}
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct, Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, struct unexpected"))
}
fn serialize_struct_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeStructVariant, Error> {
Err(Error::InvalidDataModel("expected i8 and bytes, struct variant unexpected"))
}
}
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>;
#[cold]
fn serialize_bytes(self, _val: &[u8]) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received bytes"))
}
#[cold]
fn serialize_bool(self, _val: bool) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received bool"))
}
#[cold]
fn serialize_i8(self, _value: i8) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received i8"))
}
#[cold]
fn serialize_i16(self, _val: i16) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received i16"))
}
#[cold]
fn serialize_i32(self, _val: i32) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received i32"))
}
#[cold]
fn serialize_i64(self, _val: i64) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received i64"))
}
#[cold]
fn serialize_u8(self, _val: u8) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received u8"))
}
#[cold]
fn serialize_u16(self, _val: u16) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received u16"))
}
#[cold]
fn serialize_u32(self, _val: u32) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received u32"))
}
#[cold]
fn serialize_u64(self, _val: u64) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received u64"))
}
#[cold]
fn serialize_f32(self, _val: f32) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received f32"))
}
#[cold]
fn serialize_f64(self, _val: f64) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received f64"))
}
#[cold]
fn serialize_char(self, _val: char) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received char"))
}
#[cold]
fn serialize_str(self, _val: &str) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received str"))
}
#[cold]
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received unit"))
}
#[cold]
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received unit_struct"))
}
#[cold]
fn serialize_unit_variant(self, _name: &'static str, _idx: u32, _variant: &'static str) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received unit_variant"))
}
#[cold]
fn serialize_newtype_struct<T: ?Sized>(self, _name: &'static str, _value: &T) -> Result<Self::Ok, Self::Error>
where T: Serialize
{
Err(Error::InvalidDataModel("expected tuple, received newtype_struct"))
}
#[cold]
fn serialize_newtype_variant<T: ?Sized>(self, _name: &'static str, _idx: u32, _variant: &'static str, _value: &T) -> Result<Self::Ok, Self::Error>
where T: Serialize
{
Err(Error::InvalidDataModel("expected tuple, received newtype_variant"))
}
#[cold]
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received none"))
}
#[cold]
fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<Self::Ok, Self::Error>
where T: Serialize
{
Err(Error::InvalidDataModel("expected tuple, received some"))
}
#[cold]
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
Err(Error::InvalidDataModel("expected tuple, received seq"))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {
// FIXME check len
self.tuple_received = true;
Ok(self)
}
#[cold]
fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeTupleStruct, Error> {
Err(Error::InvalidDataModel("expected tuple, received tuple_struct"))
}
#[cold]
fn serialize_tuple_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeTupleVariant, Error> {
Err(Error::InvalidDataModel("expected tuple, received tuple_variant"))
}
#[cold]
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
Err(Error::InvalidDataModel("expected tuple, received map"))
}
#[cold]
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct, Error> {
Err(Error::InvalidDataModel("expected tuple, received struct"))
}
#[cold]
fn serialize_struct_variant(self, _name: &'static str, _idx: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeStructVariant, Error> {
Err(Error::InvalidDataModel("expected tuple, received struct_variant"))
}
}
impl<'a, W: Write + 'a> SerializeTuple for &mut ExtSerializer<'a, W> {
type Ok = ();
type Error = Error;
#[inline]
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
value.serialize(&mut self.fields_se)
}
#[inline(always)]
fn end(self) -> Result<Self::Ok, Self::Error> {
Ok(())
}
}
impl<'a, W: Write + 'a> ExtSerializer<'a, W> {
#[inline]
fn new<C>(ser: &'a mut Serializer<W, C>) -> 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, received nothing"))
} else {
self.fields_se.end()
}
}
}
impl<'a, W: Write + 'a> ExtFieldSerializer<'a, W> {
#[inline]
fn new<C>(ser: &'a mut Serializer<W, C>) -> 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<W, T>(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<W, T>(wr: &mut W, val: &T) -> Result<(), Error>
where
W: Write + ?Sized,
T: Serialize + ?Sized
{
let mut se = Serializer::new(wr).with_struct_map();
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<T>(val: &T) -> Result<Vec<u8>, Error>
where
T: Serialize + ?Sized
{
let mut wr = Vec::with_capacity(128);
write(&mut wr, val)?;
Ok(wr)
}
/// 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<T>(val: &T) -> Result<Vec<u8>, Error>
where
T: Serialize + ?Sized
{
let mut wr = Vec::with_capacity(128);
write_named(&mut wr, val)?;
Ok(wr)
}