Separate out the private functionality
This makes it easier when clicking through [src] links from rustdoc, not having to sift through public and internal code combined together.
This commit is contained in:
parent
467b5fc595
commit
726eea9a97
File diff suppressed because it is too large
Load Diff
@ -113,12 +113,6 @@ mod from_primitive;
|
|||||||
mod ignored_any;
|
mod ignored_any;
|
||||||
mod impls;
|
mod impls;
|
||||||
|
|
||||||
// Helpers used by generated code. Not public API.
|
|
||||||
#[doc(hidden)]
|
|
||||||
pub mod private;
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
mod content;
|
|
||||||
|
|
||||||
pub use self::ignored_any::IgnoredAny;
|
pub use self::ignored_any::IgnoredAny;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1,176 +0,0 @@
|
|||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
use core::{fmt, str};
|
|
||||||
|
|
||||||
use core::marker::PhantomData;
|
|
||||||
|
|
||||||
#[cfg(feature = "collections")]
|
|
||||||
use collections::borrow::ToOwned;
|
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
|
||||||
use std::borrow::Cow;
|
|
||||||
#[cfg(all(feature = "collections", not(feature = "std")))]
|
|
||||||
use collections::borrow::Cow;
|
|
||||||
|
|
||||||
#[cfg(all(feature = "collections", not(feature = "std")))]
|
|
||||||
use collections::{String, Vec};
|
|
||||||
|
|
||||||
use de::{Deserialize, Deserializer, Error, Visitor};
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
use de::Unexpected;
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
pub use de::content::{Content, ContentRefDeserializer, ContentDeserializer, TaggedContentVisitor,
|
|
||||||
TagOrContentField, TagOrContentFieldVisitor, InternallyTaggedUnitVisitor,
|
|
||||||
UntaggedUnitVisitor};
|
|
||||||
|
|
||||||
/// If the missing field is of type `Option<T>` then treat is as `None`,
|
|
||||||
/// otherwise it is an error.
|
|
||||||
pub fn missing_field<'de, V, E>(field: &'static str) -> Result<V, E>
|
|
||||||
where V: Deserialize<'de>,
|
|
||||||
E: Error
|
|
||||||
{
|
|
||||||
struct MissingFieldDeserializer<E>(&'static str, PhantomData<E>);
|
|
||||||
|
|
||||||
impl<'de, E> Deserializer<'de> for MissingFieldDeserializer<E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn deserialize<V>(self, _visitor: V) -> Result<V::Value, E>
|
|
||||||
where V: Visitor<'de>
|
|
||||||
{
|
|
||||||
Err(Error::missing_field(self.0))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
|
|
||||||
where V: Visitor<'de>
|
|
||||||
{
|
|
||||||
visitor.visit_none()
|
|
||||||
}
|
|
||||||
|
|
||||||
forward_to_deserialize! {
|
|
||||||
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
|
|
||||||
seq_fixed_size bytes byte_buf map unit_struct newtype_struct
|
|
||||||
tuple_struct struct struct_field tuple enum ignored_any
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let deserializer = MissingFieldDeserializer(field, PhantomData);
|
|
||||||
Deserialize::deserialize(deserializer)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
pub fn borrow_cow_str<'de: 'a, 'a, D>(deserializer: D) -> Result<Cow<'a, str>, D::Error>
|
|
||||||
where D: Deserializer<'de>
|
|
||||||
{
|
|
||||||
struct CowStrVisitor;
|
|
||||||
|
|
||||||
impl<'a> Visitor<'a> for CowStrVisitor {
|
|
||||||
type Value = Cow<'a, str>;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("a string")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Owned(v.to_owned()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Borrowed(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Owned(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
match str::from_utf8(v) {
|
|
||||||
Ok(s) => Ok(Cow::Owned(s.to_owned())),
|
|
||||||
Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
match str::from_utf8(v) {
|
|
||||||
Ok(s) => Ok(Cow::Borrowed(s)),
|
|
||||||
Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
match String::from_utf8(v) {
|
|
||||||
Ok(s) => Ok(Cow::Owned(s)),
|
|
||||||
Err(e) => Err(Error::invalid_value(Unexpected::Bytes(&e.into_bytes()), &self)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_str(CowStrVisitor)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
pub fn borrow_cow_bytes<'de: 'a, 'a, D>(deserializer: D) -> Result<Cow<'a, [u8]>, D::Error>
|
|
||||||
where D: Deserializer<'de>
|
|
||||||
{
|
|
||||||
struct CowBytesVisitor;
|
|
||||||
|
|
||||||
impl<'a> Visitor<'a> for CowBytesVisitor {
|
|
||||||
type Value = Cow<'a, [u8]>;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("a byte array")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Owned(v.as_bytes().to_vec()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Borrowed(v.as_bytes()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Owned(v.into_bytes()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Owned(v.to_vec()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Borrowed(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
|
|
||||||
where E: Error
|
|
||||||
{
|
|
||||||
Ok(Cow::Owned(v))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_str(CowBytesVisitor)
|
|
||||||
}
|
|
@ -93,15 +93,19 @@ pub use de::{Deserialize, Deserializer};
|
|||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod macros;
|
mod macros;
|
||||||
|
mod utils;
|
||||||
|
|
||||||
pub mod de;
|
pub mod de;
|
||||||
pub mod ser;
|
pub mod ser;
|
||||||
mod utils;
|
|
||||||
|
|
||||||
// Generated code uses these to support no_std. Not public API.
|
// Generated code uses these to support no_std. Not public API.
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub mod export;
|
pub mod export;
|
||||||
|
|
||||||
|
// Helpers used by generated code and doc tests. Not public API.
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub mod private;
|
||||||
|
|
||||||
// Re-export #[derive(Serialize, Deserialize)].
|
// Re-export #[derive(Serialize, Deserialize)].
|
||||||
//
|
//
|
||||||
// This is a workaround for https://github.com/rust-lang/cargo/issues/1286.
|
// This is a workaround for https://github.com/rust-lang/cargo/issues/1286.
|
||||||
|
@ -177,162 +177,3 @@ macro_rules! forward_to_deserialize {
|
|||||||
$(forward_to_deserialize_helper!{$func})*
|
$(forward_to_deserialize_helper!{$func})*
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Seralize the `$value` that implements Display as a string,
|
|
||||||
/// when that string is statically known to never have more than
|
|
||||||
/// a constant `$MAX_LEN` bytes.
|
|
||||||
///
|
|
||||||
/// Panics if the Display impl tries to write more than `$MAX_LEN` bytes.
|
|
||||||
#[cfg(feature = "std")]
|
|
||||||
// Not exported
|
|
||||||
macro_rules! serialize_display_bounded_length {
|
|
||||||
($value: expr, $MAX_LEN: expr, $serializer: expr) => {
|
|
||||||
{
|
|
||||||
use std::io::Write;
|
|
||||||
let mut buffer: [u8; $MAX_LEN] = unsafe { ::std::mem::uninitialized() };
|
|
||||||
let remaining_len;
|
|
||||||
{
|
|
||||||
let mut remaining = &mut buffer[..];
|
|
||||||
write!(remaining, "{}", $value).unwrap();
|
|
||||||
remaining_len = remaining.len()
|
|
||||||
}
|
|
||||||
let written_len = buffer.len() - remaining_len;
|
|
||||||
let written = &buffer[..written_len];
|
|
||||||
|
|
||||||
// write! only provides std::fmt::Formatter to Display implementations,
|
|
||||||
// which has methods write_str and write_char but no method to write arbitrary bytes.
|
|
||||||
// Therefore, `written` is well-formed in UTF-8.
|
|
||||||
let written_str = unsafe {
|
|
||||||
::std::str::from_utf8_unchecked(written)
|
|
||||||
};
|
|
||||||
$serializer.serialize_str(written_str)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! __serialize_unimplemented_method {
|
|
||||||
($func:ident $(<$t:ident>)* ($($arg:ty),*) -> $ret:ident) => {
|
|
||||||
fn $func $(<$t: ?Sized + $crate::Serialize>)* (self $(, _: $arg)*) -> $crate::export::Result<Self::$ret, Self::Error> {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! __serialize_unimplemented_helper {
|
|
||||||
(bool) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_bool(bool) -> Ok);
|
|
||||||
};
|
|
||||||
(i8) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_i8(i8) -> Ok);
|
|
||||||
};
|
|
||||||
(i16) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_i16(i16) -> Ok);
|
|
||||||
};
|
|
||||||
(i32) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_i32(i32) -> Ok);
|
|
||||||
};
|
|
||||||
(i64) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_i64(i64) -> Ok);
|
|
||||||
};
|
|
||||||
(u8) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_u8(u8) -> Ok);
|
|
||||||
};
|
|
||||||
(u16) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_u16(u16) -> Ok);
|
|
||||||
};
|
|
||||||
(u32) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_u32(u32) -> Ok);
|
|
||||||
};
|
|
||||||
(u64) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_u64(u64) -> Ok);
|
|
||||||
};
|
|
||||||
(f32) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_f32(f32) -> Ok);
|
|
||||||
};
|
|
||||||
(f64) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_f64(f64) -> Ok);
|
|
||||||
};
|
|
||||||
(char) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_char(char) -> Ok);
|
|
||||||
};
|
|
||||||
(str) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_str(&str) -> Ok);
|
|
||||||
};
|
|
||||||
(bytes) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_bytes(&[u8]) -> Ok);
|
|
||||||
};
|
|
||||||
(none) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_none() -> Ok);
|
|
||||||
};
|
|
||||||
(some) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_some<T>(&T) -> Ok);
|
|
||||||
};
|
|
||||||
(unit) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_unit() -> Ok);
|
|
||||||
};
|
|
||||||
(unit_struct) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_unit_struct(&str) -> Ok);
|
|
||||||
};
|
|
||||||
(unit_variant) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_unit_variant(&str, usize, &str) -> Ok);
|
|
||||||
};
|
|
||||||
(newtype_struct) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_newtype_struct<T>(&str, &T) -> Ok);
|
|
||||||
};
|
|
||||||
(newtype_variant) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_newtype_variant<T>(&str, usize, &str, &T) -> Ok);
|
|
||||||
};
|
|
||||||
(seq) => {
|
|
||||||
type SerializeSeq = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_seq(Option<usize>) -> SerializeSeq);
|
|
||||||
};
|
|
||||||
(seq_fixed_size) => {
|
|
||||||
__serialize_unimplemented_method!(serialize_seq_fixed_size(usize) -> SerializeSeq);
|
|
||||||
};
|
|
||||||
(tuple) => {
|
|
||||||
type SerializeTuple = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_tuple(usize) -> SerializeTuple);
|
|
||||||
};
|
|
||||||
(tuple_struct) => {
|
|
||||||
type SerializeTupleStruct = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_tuple_struct(&str, usize) -> SerializeTupleStruct);
|
|
||||||
};
|
|
||||||
(tuple_variant) => {
|
|
||||||
type SerializeTupleVariant = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_tuple_variant(&str, usize, &str, usize) -> SerializeTupleVariant);
|
|
||||||
};
|
|
||||||
(map) => {
|
|
||||||
type SerializeMap = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_map(Option<usize>) -> SerializeMap);
|
|
||||||
};
|
|
||||||
(struct) => {
|
|
||||||
type SerializeStruct = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_struct(&str, usize) -> SerializeStruct);
|
|
||||||
};
|
|
||||||
(struct_variant) => {
|
|
||||||
type SerializeStructVariant = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
|
||||||
__serialize_unimplemented_method!(serialize_struct_variant(&str, usize, &str, usize) -> SerializeStructVariant);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used only by Serde doc tests. Not public API.
|
|
||||||
#[doc(hidden)]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! __serialize_unimplemented {
|
|
||||||
($($func:ident)*) => {
|
|
||||||
$(
|
|
||||||
__serialize_unimplemented_helper!($func);
|
|
||||||
)*
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used only by Serde doc tests. Not public API.
|
|
||||||
#[doc(hidden)]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! __serde_ignore_tokens {
|
|
||||||
($($tt:tt)+) => {}
|
|
||||||
}
|
|
||||||
|
1520
serde/src/private/de.rs
Normal file
1520
serde/src/private/de.rs
Normal file
File diff suppressed because it is too large
Load Diff
126
serde/src/private/macros.rs
Normal file
126
serde/src/private/macros.rs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#[doc(hidden)]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! __serialize_unimplemented_method {
|
||||||
|
($func:ident $(<$t:ident>)* ($($arg:ty),*) -> $ret:ident) => {
|
||||||
|
fn $func $(<$t: ?Sized + $crate::Serialize>)* (self $(, _: $arg)*) -> $crate::export::Result<Self::$ret, Self::Error> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! __serialize_unimplemented_helper {
|
||||||
|
(bool) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_bool(bool) -> Ok);
|
||||||
|
};
|
||||||
|
(i8) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_i8(i8) -> Ok);
|
||||||
|
};
|
||||||
|
(i16) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_i16(i16) -> Ok);
|
||||||
|
};
|
||||||
|
(i32) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_i32(i32) -> Ok);
|
||||||
|
};
|
||||||
|
(i64) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_i64(i64) -> Ok);
|
||||||
|
};
|
||||||
|
(u8) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_u8(u8) -> Ok);
|
||||||
|
};
|
||||||
|
(u16) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_u16(u16) -> Ok);
|
||||||
|
};
|
||||||
|
(u32) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_u32(u32) -> Ok);
|
||||||
|
};
|
||||||
|
(u64) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_u64(u64) -> Ok);
|
||||||
|
};
|
||||||
|
(f32) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_f32(f32) -> Ok);
|
||||||
|
};
|
||||||
|
(f64) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_f64(f64) -> Ok);
|
||||||
|
};
|
||||||
|
(char) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_char(char) -> Ok);
|
||||||
|
};
|
||||||
|
(str) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_str(&str) -> Ok);
|
||||||
|
};
|
||||||
|
(bytes) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_bytes(&[u8]) -> Ok);
|
||||||
|
};
|
||||||
|
(none) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_none() -> Ok);
|
||||||
|
};
|
||||||
|
(some) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_some<T>(&T) -> Ok);
|
||||||
|
};
|
||||||
|
(unit) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_unit() -> Ok);
|
||||||
|
};
|
||||||
|
(unit_struct) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_unit_struct(&str) -> Ok);
|
||||||
|
};
|
||||||
|
(unit_variant) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_unit_variant(&str, usize, &str) -> Ok);
|
||||||
|
};
|
||||||
|
(newtype_struct) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_newtype_struct<T>(&str, &T) -> Ok);
|
||||||
|
};
|
||||||
|
(newtype_variant) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_newtype_variant<T>(&str, usize, &str, &T) -> Ok);
|
||||||
|
};
|
||||||
|
(seq) => {
|
||||||
|
type SerializeSeq = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_seq(Option<usize>) -> SerializeSeq);
|
||||||
|
};
|
||||||
|
(seq_fixed_size) => {
|
||||||
|
__serialize_unimplemented_method!(serialize_seq_fixed_size(usize) -> SerializeSeq);
|
||||||
|
};
|
||||||
|
(tuple) => {
|
||||||
|
type SerializeTuple = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_tuple(usize) -> SerializeTuple);
|
||||||
|
};
|
||||||
|
(tuple_struct) => {
|
||||||
|
type SerializeTupleStruct = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_tuple_struct(&str, usize) -> SerializeTupleStruct);
|
||||||
|
};
|
||||||
|
(tuple_variant) => {
|
||||||
|
type SerializeTupleVariant = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_tuple_variant(&str, usize, &str, usize) -> SerializeTupleVariant);
|
||||||
|
};
|
||||||
|
(map) => {
|
||||||
|
type SerializeMap = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_map(Option<usize>) -> SerializeMap);
|
||||||
|
};
|
||||||
|
(struct) => {
|
||||||
|
type SerializeStruct = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_struct(&str, usize) -> SerializeStruct);
|
||||||
|
};
|
||||||
|
(struct_variant) => {
|
||||||
|
type SerializeStructVariant = $crate::ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
__serialize_unimplemented_method!(serialize_struct_variant(&str, usize, &str, usize) -> SerializeStructVariant);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Used only by Serde doc tests. Not public API.
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! __serialize_unimplemented {
|
||||||
|
($($func:ident)*) => {
|
||||||
|
$(
|
||||||
|
__serialize_unimplemented_helper!($func);
|
||||||
|
)*
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Used only by Serde doc tests. Not public API.
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! __serde_ignore_tokens {
|
||||||
|
($($tt:tt)+) => {}
|
||||||
|
}
|
4
serde/src/private/mod.rs
Normal file
4
serde/src/private/mod.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
pub mod ser;
|
||||||
|
pub mod de;
|
||||||
|
|
||||||
|
mod macros;
|
944
serde/src/private/ser.rs
Normal file
944
serde/src/private/ser.rs
Normal file
@ -0,0 +1,944 @@
|
|||||||
|
use core::fmt::{self, Display};
|
||||||
|
|
||||||
|
use ser::{self, Serialize, Serializer, SerializeMap, SerializeStruct, Impossible};
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "collections"))]
|
||||||
|
use self::content::{SerializeTupleVariantAsMapValue, SerializeStructVariantAsMapValue};
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
use std::error;
|
||||||
|
|
||||||
|
/// Not public API.
|
||||||
|
pub fn serialize_tagged_newtype<S, T>(serializer: S,
|
||||||
|
type_ident: &'static str,
|
||||||
|
variant_ident: &'static str,
|
||||||
|
tag: &'static str,
|
||||||
|
variant_name: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<S::Ok, S::Error>
|
||||||
|
where S: Serializer,
|
||||||
|
T: Serialize
|
||||||
|
{
|
||||||
|
value.serialize(TaggedSerializer {
|
||||||
|
type_ident: type_ident,
|
||||||
|
variant_ident: variant_ident,
|
||||||
|
tag: tag,
|
||||||
|
variant_name: variant_name,
|
||||||
|
delegate: serializer,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TaggedSerializer<S> {
|
||||||
|
type_ident: &'static str,
|
||||||
|
variant_ident: &'static str,
|
||||||
|
tag: &'static str,
|
||||||
|
variant_name: &'static str,
|
||||||
|
delegate: S,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Unsupported {
|
||||||
|
Boolean,
|
||||||
|
Integer,
|
||||||
|
Float,
|
||||||
|
Char,
|
||||||
|
String,
|
||||||
|
ByteArray,
|
||||||
|
Optional,
|
||||||
|
Unit,
|
||||||
|
UnitStruct,
|
||||||
|
Sequence,
|
||||||
|
Tuple,
|
||||||
|
TupleStruct,
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
Enum,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Unsupported {
|
||||||
|
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match *self {
|
||||||
|
Unsupported::Boolean => formatter.write_str("a boolean"),
|
||||||
|
Unsupported::Integer => formatter.write_str("an integer"),
|
||||||
|
Unsupported::Float => formatter.write_str("a float"),
|
||||||
|
Unsupported::Char => formatter.write_str("a char"),
|
||||||
|
Unsupported::String => formatter.write_str("a string"),
|
||||||
|
Unsupported::ByteArray => formatter.write_str("a byte array"),
|
||||||
|
Unsupported::Optional => formatter.write_str("an optional"),
|
||||||
|
Unsupported::Unit => formatter.write_str("unit"),
|
||||||
|
Unsupported::UnitStruct => formatter.write_str("a unit struct"),
|
||||||
|
Unsupported::Sequence => formatter.write_str("a sequence"),
|
||||||
|
Unsupported::Tuple => formatter.write_str("a tuple"),
|
||||||
|
Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
Unsupported::Enum => formatter.write_str("an enum"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S> TaggedSerializer<S>
|
||||||
|
where S: Serializer
|
||||||
|
{
|
||||||
|
fn bad_type(self, what: Unsupported) -> S::Error {
|
||||||
|
ser::Error::custom(format_args!(
|
||||||
|
"cannot serialize tagged newtype variant {}::{} containing {}",
|
||||||
|
self.type_ident,
|
||||||
|
self.variant_ident,
|
||||||
|
what))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S> Serializer for TaggedSerializer<S>
|
||||||
|
where S: Serializer
|
||||||
|
{
|
||||||
|
type Ok = S::Ok;
|
||||||
|
type Error = S::Error;
|
||||||
|
|
||||||
|
type SerializeSeq = Impossible<S::Ok, S::Error>;
|
||||||
|
type SerializeTuple = Impossible<S::Ok, S::Error>;
|
||||||
|
type SerializeTupleStruct = Impossible<S::Ok, S::Error>;
|
||||||
|
type SerializeMap = S::SerializeMap;
|
||||||
|
type SerializeStruct = S::SerializeStruct;
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
type SerializeTupleVariant = Impossible<S::Ok, S::Error>;
|
||||||
|
#[cfg(any(feature = "std", feature = "collections"))]
|
||||||
|
type SerializeTupleVariant = SerializeTupleVariantAsMapValue<S::SerializeMap>;
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
type SerializeStructVariant = Impossible<S::Ok, S::Error>;
|
||||||
|
#[cfg(any(feature = "std", feature = "collections"))]
|
||||||
|
type SerializeStructVariant = SerializeStructVariantAsMapValue<S::SerializeMap>;
|
||||||
|
|
||||||
|
fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Boolean))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Integer))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Float))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Float))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Char))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::String))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::ByteArray))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Optional))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_some<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error>
|
||||||
|
where T: Serialize
|
||||||
|
{
|
||||||
|
Err(self.bad_type(Unsupported::Optional))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Unit))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::UnitStruct))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_unit_variant(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize,
|
||||||
|
inner_variant: &'static str)
|
||||||
|
-> Result<Self::Ok, Self::Error> {
|
||||||
|
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||||
|
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||||
|
try!(map.serialize_entry(inner_variant, &()));
|
||||||
|
map.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_newtype_struct<T: ?Sized>(self,
|
||||||
|
_: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<Self::Ok, Self::Error>
|
||||||
|
where T: Serialize
|
||||||
|
{
|
||||||
|
value.serialize(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_newtype_variant<T: ?Sized>(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize,
|
||||||
|
inner_variant: &'static str,
|
||||||
|
inner_value: &T)
|
||||||
|
-> Result<Self::Ok, Self::Error>
|
||||||
|
where T: Serialize
|
||||||
|
{
|
||||||
|
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||||
|
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||||
|
try!(map.serialize_entry(inner_variant, inner_value));
|
||||||
|
map.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Sequence))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_seq_fixed_size(self, _: usize) -> Result<Self::SerializeSeq, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Sequence))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::Tuple))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_tuple_struct(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize)
|
||||||
|
-> Result<Self::SerializeTupleStruct, Self::Error> {
|
||||||
|
Err(self.bad_type(Unsupported::TupleStruct))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
fn serialize_tuple_variant(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize)
|
||||||
|
-> Result<Self::SerializeTupleVariant, Self::Error> {
|
||||||
|
// Lack of push-based serialization means we need to buffer the content
|
||||||
|
// of the tuple variant, so it requires std.
|
||||||
|
Err(self.bad_type(Unsupported::Enum))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "collections"))]
|
||||||
|
fn serialize_tuple_variant(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize,
|
||||||
|
inner_variant: &'static str,
|
||||||
|
len: usize)
|
||||||
|
-> Result<Self::SerializeTupleVariant, Self::Error> {
|
||||||
|
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||||
|
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||||
|
try!(map.serialize_key(inner_variant));
|
||||||
|
Ok(SerializeTupleVariantAsMapValue::new(map, inner_variant, len))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
||||||
|
let mut map = try!(self.delegate.serialize_map(len.map(|len| len + 1)));
|
||||||
|
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||||
|
Ok(map)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_struct(self,
|
||||||
|
name: &'static str,
|
||||||
|
len: usize)
|
||||||
|
-> Result<Self::SerializeStruct, Self::Error> {
|
||||||
|
let mut state = try!(self.delegate.serialize_struct(name, len + 1));
|
||||||
|
try!(state.serialize_field(self.tag, self.variant_name));
|
||||||
|
Ok(state)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
fn serialize_struct_variant(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize)
|
||||||
|
-> Result<Self::SerializeStructVariant, Self::Error> {
|
||||||
|
// Lack of push-based serialization means we need to buffer the content
|
||||||
|
// of the struct variant, so it requires std.
|
||||||
|
Err(self.bad_type(Unsupported::Enum))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "collections"))]
|
||||||
|
fn serialize_struct_variant(self,
|
||||||
|
_: &'static str,
|
||||||
|
_: usize,
|
||||||
|
inner_variant: &'static str,
|
||||||
|
len: usize)
|
||||||
|
-> Result<Self::SerializeStructVariant, Self::Error> {
|
||||||
|
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
||||||
|
try!(map.serialize_entry(self.tag, self.variant_name));
|
||||||
|
try!(map.serialize_key(inner_variant));
|
||||||
|
Ok(SerializeStructVariantAsMapValue::new(map, inner_variant, len))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "std", feature = "collections")))]
|
||||||
|
fn collect_str<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error>
|
||||||
|
where T: Display
|
||||||
|
{
|
||||||
|
Err(self.bad_type(Unsupported::String))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Used only by Serde doc tests. Not public API.
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Error;
|
||||||
|
|
||||||
|
impl ser::Error for Error {
|
||||||
|
fn custom<T: Display>(_: T) -> Self {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
impl error::Error for Error {
|
||||||
|
fn description(&self) -> &str {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Error {
|
||||||
|
fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", feature = "collections"))]
|
||||||
|
mod content {
|
||||||
|
use core::marker::PhantomData;
|
||||||
|
|
||||||
|
#[cfg(all(not(feature = "std"), feature = "collections"))]
|
||||||
|
use collections::{String, Vec};
|
||||||
|
|
||||||
|
#[cfg(all(feature = "alloc", not(feature = "std")))]
|
||||||
|
use alloc::boxed::Box;
|
||||||
|
|
||||||
|
#[cfg(feature = "collections")]
|
||||||
|
use collections::borrow::ToOwned;
|
||||||
|
|
||||||
|
use ser::{self, Serialize, Serializer};
|
||||||
|
|
||||||
|
pub struct SerializeTupleVariantAsMapValue<M> {
|
||||||
|
map: M,
|
||||||
|
name: &'static str,
|
||||||
|
fields: Vec<Content>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<M> SerializeTupleVariantAsMapValue<M> {
|
||||||
|
pub fn new(map: M, name: &'static str, len: usize) -> Self {
|
||||||
|
SerializeTupleVariantAsMapValue {
|
||||||
|
map: map,
|
||||||
|
name: name,
|
||||||
|
fields: Vec::with_capacity(len),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<M> ser::SerializeTupleVariant for SerializeTupleVariantAsMapValue<M>
|
||||||
|
where M: ser::SerializeMap
|
||||||
|
{
|
||||||
|
type Ok = M::Ok;
|
||||||
|
type Error = M::Error;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), M::Error> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||||
|
self.fields.push(value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(mut self) -> Result<M::Ok, M::Error> {
|
||||||
|
try!(self.map.serialize_value(&Content::TupleStruct(self.name, self.fields)));
|
||||||
|
self.map.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct SerializeStructVariantAsMapValue<M> {
|
||||||
|
map: M,
|
||||||
|
name: &'static str,
|
||||||
|
fields: Vec<(&'static str, Content)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<M> SerializeStructVariantAsMapValue<M> {
|
||||||
|
pub fn new(map: M, name: &'static str, len: usize) -> Self {
|
||||||
|
SerializeStructVariantAsMapValue {
|
||||||
|
map: map,
|
||||||
|
name: name,
|
||||||
|
fields: Vec::with_capacity(len),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<M> ser::SerializeStructVariant for SerializeStructVariantAsMapValue<M>
|
||||||
|
where M: ser::SerializeMap
|
||||||
|
{
|
||||||
|
type Ok = M::Ok;
|
||||||
|
type Error = M::Error;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized + Serialize>(&mut self,
|
||||||
|
key: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<(), M::Error> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
||||||
|
self.fields.push((key, value));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(mut self) -> Result<M::Ok, M::Error> {
|
||||||
|
try!(self.map.serialize_value(&Content::Struct(self.name, self.fields)));
|
||||||
|
self.map.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Content {
|
||||||
|
Bool(bool),
|
||||||
|
|
||||||
|
U8(u8),
|
||||||
|
U16(u16),
|
||||||
|
U32(u32),
|
||||||
|
U64(u64),
|
||||||
|
|
||||||
|
I8(i8),
|
||||||
|
I16(i16),
|
||||||
|
I32(i32),
|
||||||
|
I64(i64),
|
||||||
|
|
||||||
|
F32(f32),
|
||||||
|
F64(f64),
|
||||||
|
|
||||||
|
Char(char),
|
||||||
|
String(String),
|
||||||
|
Bytes(Vec<u8>),
|
||||||
|
|
||||||
|
None,
|
||||||
|
Some(Box<Content>),
|
||||||
|
|
||||||
|
Unit,
|
||||||
|
UnitStruct(&'static str),
|
||||||
|
UnitVariant(&'static str, usize, &'static str),
|
||||||
|
NewtypeStruct(&'static str, Box<Content>),
|
||||||
|
NewtypeVariant(&'static str, usize, &'static str, Box<Content>),
|
||||||
|
|
||||||
|
Seq(Vec<Content>),
|
||||||
|
SeqFixedSize(Vec<Content>),
|
||||||
|
Tuple(Vec<Content>),
|
||||||
|
TupleStruct(&'static str, Vec<Content>),
|
||||||
|
TupleVariant(&'static str, usize, &'static str, Vec<Content>),
|
||||||
|
Map(Vec<(Content, Content)>),
|
||||||
|
Struct(&'static str, Vec<(&'static str, Content)>),
|
||||||
|
StructVariant(&'static str, usize, &'static str, Vec<(&'static str, Content)>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for Content {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where S: Serializer
|
||||||
|
{
|
||||||
|
match *self {
|
||||||
|
Content::Bool(b) => serializer.serialize_bool(b),
|
||||||
|
Content::U8(u) => serializer.serialize_u8(u),
|
||||||
|
Content::U16(u) => serializer.serialize_u16(u),
|
||||||
|
Content::U32(u) => serializer.serialize_u32(u),
|
||||||
|
Content::U64(u) => serializer.serialize_u64(u),
|
||||||
|
Content::I8(i) => serializer.serialize_i8(i),
|
||||||
|
Content::I16(i) => serializer.serialize_i16(i),
|
||||||
|
Content::I32(i) => serializer.serialize_i32(i),
|
||||||
|
Content::I64(i) => serializer.serialize_i64(i),
|
||||||
|
Content::F32(f) => serializer.serialize_f32(f),
|
||||||
|
Content::F64(f) => serializer.serialize_f64(f),
|
||||||
|
Content::Char(c) => serializer.serialize_char(c),
|
||||||
|
Content::String(ref s) => serializer.serialize_str(s),
|
||||||
|
Content::Bytes(ref b) => serializer.serialize_bytes(b),
|
||||||
|
Content::None => serializer.serialize_none(),
|
||||||
|
Content::Some(ref c) => serializer.serialize_some(&**c),
|
||||||
|
Content::Unit => serializer.serialize_unit(),
|
||||||
|
Content::UnitStruct(n) => serializer.serialize_unit_struct(n),
|
||||||
|
Content::UnitVariant(n, i, v) => serializer.serialize_unit_variant(n, i, v),
|
||||||
|
Content::NewtypeStruct(n, ref c) => serializer.serialize_newtype_struct(n, &**c),
|
||||||
|
Content::NewtypeVariant(n, i, v, ref c) => {
|
||||||
|
serializer.serialize_newtype_variant(n, i, v, &**c)
|
||||||
|
}
|
||||||
|
Content::Seq(ref elements) => elements.serialize(serializer),
|
||||||
|
Content::SeqFixedSize(ref elements) => {
|
||||||
|
use ser::SerializeSeq;
|
||||||
|
let mut seq = try!(serializer.serialize_seq_fixed_size(elements.len()));
|
||||||
|
for e in elements {
|
||||||
|
try!(seq.serialize_element(e));
|
||||||
|
}
|
||||||
|
seq.end()
|
||||||
|
}
|
||||||
|
Content::Tuple(ref elements) => {
|
||||||
|
use ser::SerializeTuple;
|
||||||
|
let mut tuple = try!(serializer.serialize_tuple(elements.len()));
|
||||||
|
for e in elements {
|
||||||
|
try!(tuple.serialize_element(e));
|
||||||
|
}
|
||||||
|
tuple.end()
|
||||||
|
}
|
||||||
|
Content::TupleStruct(n, ref fields) => {
|
||||||
|
use ser::SerializeTupleStruct;
|
||||||
|
let mut ts = try!(serializer.serialize_tuple_struct(n, fields.len()));
|
||||||
|
for f in fields {
|
||||||
|
try!(ts.serialize_field(f));
|
||||||
|
}
|
||||||
|
ts.end()
|
||||||
|
}
|
||||||
|
Content::TupleVariant(n, i, v, ref fields) => {
|
||||||
|
use ser::SerializeTupleVariant;
|
||||||
|
let mut tv = try!(serializer.serialize_tuple_variant(n, i, v, fields.len()));
|
||||||
|
for f in fields {
|
||||||
|
try!(tv.serialize_field(f));
|
||||||
|
}
|
||||||
|
tv.end()
|
||||||
|
}
|
||||||
|
Content::Map(ref entries) => {
|
||||||
|
use ser::SerializeMap;
|
||||||
|
let mut map = try!(serializer.serialize_map(Some(entries.len())));
|
||||||
|
for &(ref k, ref v) in entries {
|
||||||
|
try!(map.serialize_entry(k, v));
|
||||||
|
}
|
||||||
|
map.end()
|
||||||
|
}
|
||||||
|
Content::Struct(n, ref fields) => {
|
||||||
|
use ser::SerializeStruct;
|
||||||
|
let mut s = try!(serializer.serialize_struct(n, fields.len()));
|
||||||
|
for &(k, ref v) in fields {
|
||||||
|
try!(s.serialize_field(k, v));
|
||||||
|
}
|
||||||
|
s.end()
|
||||||
|
}
|
||||||
|
Content::StructVariant(n, i, v, ref fields) => {
|
||||||
|
use ser::SerializeStructVariant;
|
||||||
|
let mut sv = try!(serializer.serialize_struct_variant(n, i, v, fields.len()));
|
||||||
|
for &(k, ref v) in fields {
|
||||||
|
try!(sv.serialize_field(k, v));
|
||||||
|
}
|
||||||
|
sv.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ContentSerializer<E> {
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ContentSerializer<E> {
|
||||||
|
fn new() -> Self {
|
||||||
|
ContentSerializer { error: PhantomData }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> Serializer for ContentSerializer<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
type SerializeSeq = SerializeSeq<E>;
|
||||||
|
type SerializeTuple = SerializeTuple<E>;
|
||||||
|
type SerializeTupleStruct = SerializeTupleStruct<E>;
|
||||||
|
type SerializeTupleVariant = SerializeTupleVariant<E>;
|
||||||
|
type SerializeMap = SerializeMap<E>;
|
||||||
|
type SerializeStruct = SerializeStruct<E>;
|
||||||
|
type SerializeStructVariant = SerializeStructVariant<E>;
|
||||||
|
|
||||||
|
fn serialize_bool(self, v: bool) -> Result<Content, E> {
|
||||||
|
Ok(Content::Bool(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i8(self, v: i8) -> Result<Content, E> {
|
||||||
|
Ok(Content::I8(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i16(self, v: i16) -> Result<Content, E> {
|
||||||
|
Ok(Content::I16(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i32(self, v: i32) -> Result<Content, E> {
|
||||||
|
Ok(Content::I32(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_i64(self, v: i64) -> Result<Content, E> {
|
||||||
|
Ok(Content::I64(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u8(self, v: u8) -> Result<Content, E> {
|
||||||
|
Ok(Content::U8(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u16(self, v: u16) -> Result<Content, E> {
|
||||||
|
Ok(Content::U16(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u32(self, v: u32) -> Result<Content, E> {
|
||||||
|
Ok(Content::U32(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_u64(self, v: u64) -> Result<Content, E> {
|
||||||
|
Ok(Content::U64(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_f32(self, v: f32) -> Result<Content, E> {
|
||||||
|
Ok(Content::F32(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_f64(self, v: f64) -> Result<Content, E> {
|
||||||
|
Ok(Content::F64(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_char(self, v: char) -> Result<Content, E> {
|
||||||
|
Ok(Content::Char(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_str(self, value: &str) -> Result<Content, E> {
|
||||||
|
Ok(Content::String(value.to_owned()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_bytes(self, value: &[u8]) -> Result<Content, E> {
|
||||||
|
Ok(Content::Bytes(value.to_owned()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_none(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::None)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Content, E> {
|
||||||
|
Ok(Content::Some(Box::new(try!(value.serialize(self)))))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_unit(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::Unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_unit_struct(self, name: &'static str) -> Result<Content, E> {
|
||||||
|
Ok(Content::UnitStruct(name))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_unit_variant(self,
|
||||||
|
name: &'static str,
|
||||||
|
variant_index: usize,
|
||||||
|
variant: &'static str)
|
||||||
|
-> Result<Content, E> {
|
||||||
|
Ok(Content::UnitVariant(name, variant_index, variant))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_newtype_struct<T: ?Sized + Serialize>(self,
|
||||||
|
name: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<Content, E> {
|
||||||
|
Ok(Content::NewtypeStruct(name, Box::new(try!(value.serialize(self)))))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_newtype_variant<T: ?Sized + Serialize>(self,
|
||||||
|
name: &'static str,
|
||||||
|
variant_index: usize,
|
||||||
|
variant: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<Content, E> {
|
||||||
|
Ok(Content::NewtypeVariant(name,
|
||||||
|
variant_index,
|
||||||
|
variant,
|
||||||
|
Box::new(try!(value.serialize(self)))))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, E> {
|
||||||
|
Ok(SerializeSeq {
|
||||||
|
fixed_size: false,
|
||||||
|
elements: Vec::with_capacity(len.unwrap_or(0)),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_seq_fixed_size(self, size: usize) -> Result<Self::SerializeSeq, E> {
|
||||||
|
Ok(SerializeSeq {
|
||||||
|
fixed_size: true,
|
||||||
|
elements: Vec::with_capacity(size),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, E> {
|
||||||
|
Ok(SerializeTuple {
|
||||||
|
elements: Vec::with_capacity(len),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_tuple_struct(self,
|
||||||
|
name: &'static str,
|
||||||
|
len: usize)
|
||||||
|
-> Result<Self::SerializeTupleStruct, E> {
|
||||||
|
Ok(SerializeTupleStruct {
|
||||||
|
name: name,
|
||||||
|
fields: Vec::with_capacity(len),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_tuple_variant(self,
|
||||||
|
name: &'static str,
|
||||||
|
variant_index: usize,
|
||||||
|
variant: &'static str,
|
||||||
|
len: usize)
|
||||||
|
-> Result<Self::SerializeTupleVariant, E> {
|
||||||
|
Ok(SerializeTupleVariant {
|
||||||
|
name: name,
|
||||||
|
variant_index: variant_index,
|
||||||
|
variant: variant,
|
||||||
|
fields: Vec::with_capacity(len),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, E> {
|
||||||
|
Ok(SerializeMap {
|
||||||
|
entries: Vec::with_capacity(len.unwrap_or(0)),
|
||||||
|
key: None,
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, E> {
|
||||||
|
Ok(SerializeStruct {
|
||||||
|
name: name,
|
||||||
|
fields: Vec::with_capacity(len),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_struct_variant(self,
|
||||||
|
name: &'static str,
|
||||||
|
variant_index: usize,
|
||||||
|
variant: &'static str,
|
||||||
|
len: usize)
|
||||||
|
-> Result<Self::SerializeStructVariant, E> {
|
||||||
|
Ok(SerializeStructVariant {
|
||||||
|
name: name,
|
||||||
|
variant_index: variant_index,
|
||||||
|
variant: variant,
|
||||||
|
fields: Vec::with_capacity(len),
|
||||||
|
error: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeSeq<E> {
|
||||||
|
fixed_size: bool,
|
||||||
|
elements: Vec<Content>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeSeq for SerializeSeq<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.elements.push(value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(if self.fixed_size {
|
||||||
|
Content::SeqFixedSize(self.elements)
|
||||||
|
} else {
|
||||||
|
Content::Seq(self.elements)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeTuple<E> {
|
||||||
|
elements: Vec<Content>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeTuple for SerializeTuple<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.elements.push(value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::Tuple(self.elements))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeTupleStruct<E> {
|
||||||
|
name: &'static str,
|
||||||
|
fields: Vec<Content>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeTupleStruct for SerializeTupleStruct<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.fields.push(value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::TupleStruct(self.name, self.fields))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeTupleVariant<E> {
|
||||||
|
name: &'static str,
|
||||||
|
variant_index: usize,
|
||||||
|
variant: &'static str,
|
||||||
|
fields: Vec<Content>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeTupleVariant for SerializeTupleVariant<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.fields.push(value);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::TupleVariant(self.name, self.variant_index, self.variant, self.fields))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeMap<E> {
|
||||||
|
entries: Vec<(Content, Content)>,
|
||||||
|
key: Option<Content>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeMap for SerializeMap<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), E> {
|
||||||
|
let key = try!(key.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.key = Some(key);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
||||||
|
let key = self.key.take().expect("serialize_value called before serialize_key");
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.entries.push((key, value));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::Map(self.entries))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_entry<K: ?Sized + Serialize, V: ?Sized + Serialize>(&mut self,
|
||||||
|
key: &K,
|
||||||
|
value: &V)
|
||||||
|
-> Result<(), E> {
|
||||||
|
let key = try!(key.serialize(ContentSerializer::<E>::new()));
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.entries.push((key, value));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeStruct<E> {
|
||||||
|
name: &'static str,
|
||||||
|
fields: Vec<(&'static str, Content)>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeStruct for SerializeStruct<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized + Serialize>(&mut self,
|
||||||
|
key: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<(), E> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.fields.push((key, value));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::Struct(self.name, self.fields))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SerializeStructVariant<E> {
|
||||||
|
name: &'static str,
|
||||||
|
variant_index: usize,
|
||||||
|
variant: &'static str,
|
||||||
|
fields: Vec<(&'static str, Content)>,
|
||||||
|
error: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> ser::SerializeStructVariant for SerializeStructVariant<E>
|
||||||
|
where E: ser::Error
|
||||||
|
{
|
||||||
|
type Ok = Content;
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized + Serialize>(&mut self,
|
||||||
|
key: &'static str,
|
||||||
|
value: &T)
|
||||||
|
-> Result<(), E> {
|
||||||
|
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
||||||
|
self.fields.push((key, value));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Content, E> {
|
||||||
|
Ok(Content::StructVariant(self.name, self.variant_index, self.variant, self.fields))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,607 +0,0 @@
|
|||||||
use core::marker::PhantomData;
|
|
||||||
|
|
||||||
#[cfg(all(not(feature = "std"), feature = "collections"))]
|
|
||||||
use collections::{String, Vec};
|
|
||||||
|
|
||||||
#[cfg(all(feature = "alloc", not(feature = "std")))]
|
|
||||||
use alloc::boxed::Box;
|
|
||||||
|
|
||||||
#[cfg(feature = "collections")]
|
|
||||||
use collections::borrow::ToOwned;
|
|
||||||
|
|
||||||
use ser::{self, Serialize, Serializer};
|
|
||||||
|
|
||||||
pub struct SerializeTupleVariantAsMapValue<M> {
|
|
||||||
map: M,
|
|
||||||
name: &'static str,
|
|
||||||
fields: Vec<Content>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M> SerializeTupleVariantAsMapValue<M> {
|
|
||||||
pub fn new(map: M, name: &'static str, len: usize) -> Self {
|
|
||||||
SerializeTupleVariantAsMapValue {
|
|
||||||
map: map,
|
|
||||||
name: name,
|
|
||||||
fields: Vec::with_capacity(len),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M> ser::SerializeTupleVariant for SerializeTupleVariantAsMapValue<M>
|
|
||||||
where M: ser::SerializeMap
|
|
||||||
{
|
|
||||||
type Ok = M::Ok;
|
|
||||||
type Error = M::Error;
|
|
||||||
|
|
||||||
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), M::Error> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
|
||||||
self.fields.push(value);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(mut self) -> Result<M::Ok, M::Error> {
|
|
||||||
try!(self.map.serialize_value(&Content::TupleStruct(self.name, self.fields)));
|
|
||||||
self.map.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SerializeStructVariantAsMapValue<M> {
|
|
||||||
map: M,
|
|
||||||
name: &'static str,
|
|
||||||
fields: Vec<(&'static str, Content)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M> SerializeStructVariantAsMapValue<M> {
|
|
||||||
pub fn new(map: M, name: &'static str, len: usize) -> Self {
|
|
||||||
SerializeStructVariantAsMapValue {
|
|
||||||
map: map,
|
|
||||||
name: name,
|
|
||||||
fields: Vec::with_capacity(len),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M> ser::SerializeStructVariant for SerializeStructVariantAsMapValue<M>
|
|
||||||
where M: ser::SerializeMap
|
|
||||||
{
|
|
||||||
type Ok = M::Ok;
|
|
||||||
type Error = M::Error;
|
|
||||||
|
|
||||||
fn serialize_field<T: ?Sized + Serialize>(&mut self,
|
|
||||||
key: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<(), M::Error> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
|
|
||||||
self.fields.push((key, value));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(mut self) -> Result<M::Ok, M::Error> {
|
|
||||||
try!(self.map.serialize_value(&Content::Struct(self.name, self.fields)));
|
|
||||||
self.map.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
enum Content {
|
|
||||||
Bool(bool),
|
|
||||||
|
|
||||||
U8(u8),
|
|
||||||
U16(u16),
|
|
||||||
U32(u32),
|
|
||||||
U64(u64),
|
|
||||||
|
|
||||||
I8(i8),
|
|
||||||
I16(i16),
|
|
||||||
I32(i32),
|
|
||||||
I64(i64),
|
|
||||||
|
|
||||||
F32(f32),
|
|
||||||
F64(f64),
|
|
||||||
|
|
||||||
Char(char),
|
|
||||||
String(String),
|
|
||||||
Bytes(Vec<u8>),
|
|
||||||
|
|
||||||
None,
|
|
||||||
Some(Box<Content>),
|
|
||||||
|
|
||||||
Unit,
|
|
||||||
UnitStruct(&'static str),
|
|
||||||
UnitVariant(&'static str, usize, &'static str),
|
|
||||||
NewtypeStruct(&'static str, Box<Content>),
|
|
||||||
NewtypeVariant(&'static str, usize, &'static str, Box<Content>),
|
|
||||||
|
|
||||||
Seq(Vec<Content>),
|
|
||||||
SeqFixedSize(Vec<Content>),
|
|
||||||
Tuple(Vec<Content>),
|
|
||||||
TupleStruct(&'static str, Vec<Content>),
|
|
||||||
TupleVariant(&'static str, usize, &'static str, Vec<Content>),
|
|
||||||
Map(Vec<(Content, Content)>),
|
|
||||||
Struct(&'static str, Vec<(&'static str, Content)>),
|
|
||||||
StructVariant(&'static str, usize, &'static str, Vec<(&'static str, Content)>),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for Content {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where S: Serializer
|
|
||||||
{
|
|
||||||
match *self {
|
|
||||||
Content::Bool(b) => serializer.serialize_bool(b),
|
|
||||||
Content::U8(u) => serializer.serialize_u8(u),
|
|
||||||
Content::U16(u) => serializer.serialize_u16(u),
|
|
||||||
Content::U32(u) => serializer.serialize_u32(u),
|
|
||||||
Content::U64(u) => serializer.serialize_u64(u),
|
|
||||||
Content::I8(i) => serializer.serialize_i8(i),
|
|
||||||
Content::I16(i) => serializer.serialize_i16(i),
|
|
||||||
Content::I32(i) => serializer.serialize_i32(i),
|
|
||||||
Content::I64(i) => serializer.serialize_i64(i),
|
|
||||||
Content::F32(f) => serializer.serialize_f32(f),
|
|
||||||
Content::F64(f) => serializer.serialize_f64(f),
|
|
||||||
Content::Char(c) => serializer.serialize_char(c),
|
|
||||||
Content::String(ref s) => serializer.serialize_str(s),
|
|
||||||
Content::Bytes(ref b) => serializer.serialize_bytes(b),
|
|
||||||
Content::None => serializer.serialize_none(),
|
|
||||||
Content::Some(ref c) => serializer.serialize_some(&**c),
|
|
||||||
Content::Unit => serializer.serialize_unit(),
|
|
||||||
Content::UnitStruct(n) => serializer.serialize_unit_struct(n),
|
|
||||||
Content::UnitVariant(n, i, v) => serializer.serialize_unit_variant(n, i, v),
|
|
||||||
Content::NewtypeStruct(n, ref c) => serializer.serialize_newtype_struct(n, &**c),
|
|
||||||
Content::NewtypeVariant(n, i, v, ref c) => {
|
|
||||||
serializer.serialize_newtype_variant(n, i, v, &**c)
|
|
||||||
}
|
|
||||||
Content::Seq(ref elements) => elements.serialize(serializer),
|
|
||||||
Content::SeqFixedSize(ref elements) => {
|
|
||||||
use ser::SerializeSeq;
|
|
||||||
let mut seq = try!(serializer.serialize_seq_fixed_size(elements.len()));
|
|
||||||
for e in elements {
|
|
||||||
try!(seq.serialize_element(e));
|
|
||||||
}
|
|
||||||
seq.end()
|
|
||||||
}
|
|
||||||
Content::Tuple(ref elements) => {
|
|
||||||
use ser::SerializeTuple;
|
|
||||||
let mut tuple = try!(serializer.serialize_tuple(elements.len()));
|
|
||||||
for e in elements {
|
|
||||||
try!(tuple.serialize_element(e));
|
|
||||||
}
|
|
||||||
tuple.end()
|
|
||||||
}
|
|
||||||
Content::TupleStruct(n, ref fields) => {
|
|
||||||
use ser::SerializeTupleStruct;
|
|
||||||
let mut ts = try!(serializer.serialize_tuple_struct(n, fields.len()));
|
|
||||||
for f in fields {
|
|
||||||
try!(ts.serialize_field(f));
|
|
||||||
}
|
|
||||||
ts.end()
|
|
||||||
}
|
|
||||||
Content::TupleVariant(n, i, v, ref fields) => {
|
|
||||||
use ser::SerializeTupleVariant;
|
|
||||||
let mut tv = try!(serializer.serialize_tuple_variant(n, i, v, fields.len()));
|
|
||||||
for f in fields {
|
|
||||||
try!(tv.serialize_field(f));
|
|
||||||
}
|
|
||||||
tv.end()
|
|
||||||
}
|
|
||||||
Content::Map(ref entries) => {
|
|
||||||
use ser::SerializeMap;
|
|
||||||
let mut map = try!(serializer.serialize_map(Some(entries.len())));
|
|
||||||
for &(ref k, ref v) in entries {
|
|
||||||
try!(map.serialize_entry(k, v));
|
|
||||||
}
|
|
||||||
map.end()
|
|
||||||
}
|
|
||||||
Content::Struct(n, ref fields) => {
|
|
||||||
use ser::SerializeStruct;
|
|
||||||
let mut s = try!(serializer.serialize_struct(n, fields.len()));
|
|
||||||
for &(k, ref v) in fields {
|
|
||||||
try!(s.serialize_field(k, v));
|
|
||||||
}
|
|
||||||
s.end()
|
|
||||||
}
|
|
||||||
Content::StructVariant(n, i, v, ref fields) => {
|
|
||||||
use ser::SerializeStructVariant;
|
|
||||||
let mut sv = try!(serializer.serialize_struct_variant(n, i, v, fields.len()));
|
|
||||||
for &(k, ref v) in fields {
|
|
||||||
try!(sv.serialize_field(k, v));
|
|
||||||
}
|
|
||||||
sv.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ContentSerializer<E> {
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ContentSerializer<E> {
|
|
||||||
fn new() -> Self {
|
|
||||||
ContentSerializer { error: PhantomData }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> Serializer for ContentSerializer<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
type SerializeSeq = SerializeSeq<E>;
|
|
||||||
type SerializeTuple = SerializeTuple<E>;
|
|
||||||
type SerializeTupleStruct = SerializeTupleStruct<E>;
|
|
||||||
type SerializeTupleVariant = SerializeTupleVariant<E>;
|
|
||||||
type SerializeMap = SerializeMap<E>;
|
|
||||||
type SerializeStruct = SerializeStruct<E>;
|
|
||||||
type SerializeStructVariant = SerializeStructVariant<E>;
|
|
||||||
|
|
||||||
fn serialize_bool(self, v: bool) -> Result<Content, E> {
|
|
||||||
Ok(Content::Bool(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i8(self, v: i8) -> Result<Content, E> {
|
|
||||||
Ok(Content::I8(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i16(self, v: i16) -> Result<Content, E> {
|
|
||||||
Ok(Content::I16(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i32(self, v: i32) -> Result<Content, E> {
|
|
||||||
Ok(Content::I32(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i64(self, v: i64) -> Result<Content, E> {
|
|
||||||
Ok(Content::I64(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u8(self, v: u8) -> Result<Content, E> {
|
|
||||||
Ok(Content::U8(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u16(self, v: u16) -> Result<Content, E> {
|
|
||||||
Ok(Content::U16(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u32(self, v: u32) -> Result<Content, E> {
|
|
||||||
Ok(Content::U32(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u64(self, v: u64) -> Result<Content, E> {
|
|
||||||
Ok(Content::U64(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_f32(self, v: f32) -> Result<Content, E> {
|
|
||||||
Ok(Content::F32(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_f64(self, v: f64) -> Result<Content, E> {
|
|
||||||
Ok(Content::F64(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_char(self, v: char) -> Result<Content, E> {
|
|
||||||
Ok(Content::Char(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_str(self, value: &str) -> Result<Content, E> {
|
|
||||||
Ok(Content::String(value.to_owned()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_bytes(self, value: &[u8]) -> Result<Content, E> {
|
|
||||||
Ok(Content::Bytes(value.to_owned()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_none(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::None)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Content, E> {
|
|
||||||
Ok(Content::Some(Box::new(try!(value.serialize(self)))))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_unit(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::Unit)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_unit_struct(self, name: &'static str) -> Result<Content, E> {
|
|
||||||
Ok(Content::UnitStruct(name))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_unit_variant(self,
|
|
||||||
name: &'static str,
|
|
||||||
variant_index: usize,
|
|
||||||
variant: &'static str)
|
|
||||||
-> Result<Content, E> {
|
|
||||||
Ok(Content::UnitVariant(name, variant_index, variant))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_newtype_struct<T: ?Sized + Serialize>(self,
|
|
||||||
name: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<Content, E> {
|
|
||||||
Ok(Content::NewtypeStruct(name, Box::new(try!(value.serialize(self)))))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_newtype_variant<T: ?Sized + Serialize>(self,
|
|
||||||
name: &'static str,
|
|
||||||
variant_index: usize,
|
|
||||||
variant: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<Content, E> {
|
|
||||||
Ok(Content::NewtypeVariant(name,
|
|
||||||
variant_index,
|
|
||||||
variant,
|
|
||||||
Box::new(try!(value.serialize(self)))))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, E> {
|
|
||||||
Ok(SerializeSeq {
|
|
||||||
fixed_size: false,
|
|
||||||
elements: Vec::with_capacity(len.unwrap_or(0)),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_seq_fixed_size(self, size: usize) -> Result<Self::SerializeSeq, E> {
|
|
||||||
Ok(SerializeSeq {
|
|
||||||
fixed_size: true,
|
|
||||||
elements: Vec::with_capacity(size),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, E> {
|
|
||||||
Ok(SerializeTuple {
|
|
||||||
elements: Vec::with_capacity(len),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_tuple_struct(self,
|
|
||||||
name: &'static str,
|
|
||||||
len: usize)
|
|
||||||
-> Result<Self::SerializeTupleStruct, E> {
|
|
||||||
Ok(SerializeTupleStruct {
|
|
||||||
name: name,
|
|
||||||
fields: Vec::with_capacity(len),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_tuple_variant(self,
|
|
||||||
name: &'static str,
|
|
||||||
variant_index: usize,
|
|
||||||
variant: &'static str,
|
|
||||||
len: usize)
|
|
||||||
-> Result<Self::SerializeTupleVariant, E> {
|
|
||||||
Ok(SerializeTupleVariant {
|
|
||||||
name: name,
|
|
||||||
variant_index: variant_index,
|
|
||||||
variant: variant,
|
|
||||||
fields: Vec::with_capacity(len),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, E> {
|
|
||||||
Ok(SerializeMap {
|
|
||||||
entries: Vec::with_capacity(len.unwrap_or(0)),
|
|
||||||
key: None,
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, E> {
|
|
||||||
Ok(SerializeStruct {
|
|
||||||
name: name,
|
|
||||||
fields: Vec::with_capacity(len),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_struct_variant(self,
|
|
||||||
name: &'static str,
|
|
||||||
variant_index: usize,
|
|
||||||
variant: &'static str,
|
|
||||||
len: usize)
|
|
||||||
-> Result<Self::SerializeStructVariant, E> {
|
|
||||||
Ok(SerializeStructVariant {
|
|
||||||
name: name,
|
|
||||||
variant_index: variant_index,
|
|
||||||
variant: variant,
|
|
||||||
fields: Vec::with_capacity(len),
|
|
||||||
error: PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeSeq<E> {
|
|
||||||
fixed_size: bool,
|
|
||||||
elements: Vec<Content>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeSeq for SerializeSeq<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.elements.push(value);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(if self.fixed_size {
|
|
||||||
Content::SeqFixedSize(self.elements)
|
|
||||||
} else {
|
|
||||||
Content::Seq(self.elements)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeTuple<E> {
|
|
||||||
elements: Vec<Content>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeTuple for SerializeTuple<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.elements.push(value);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::Tuple(self.elements))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeTupleStruct<E> {
|
|
||||||
name: &'static str,
|
|
||||||
fields: Vec<Content>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeTupleStruct for SerializeTupleStruct<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.fields.push(value);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::TupleStruct(self.name, self.fields))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeTupleVariant<E> {
|
|
||||||
name: &'static str,
|
|
||||||
variant_index: usize,
|
|
||||||
variant: &'static str,
|
|
||||||
fields: Vec<Content>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeTupleVariant for SerializeTupleVariant<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.fields.push(value);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::TupleVariant(self.name, self.variant_index, self.variant, self.fields))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeMap<E> {
|
|
||||||
entries: Vec<(Content, Content)>,
|
|
||||||
key: Option<Content>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeMap for SerializeMap<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), E> {
|
|
||||||
let key = try!(key.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.key = Some(key);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), E> {
|
|
||||||
let key = self.key.take().expect("serialize_value called before serialize_key");
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.entries.push((key, value));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::Map(self.entries))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_entry<K: ?Sized + Serialize, V: ?Sized + Serialize>(&mut self,
|
|
||||||
key: &K,
|
|
||||||
value: &V)
|
|
||||||
-> Result<(), E> {
|
|
||||||
let key = try!(key.serialize(ContentSerializer::<E>::new()));
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.entries.push((key, value));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeStruct<E> {
|
|
||||||
name: &'static str,
|
|
||||||
fields: Vec<(&'static str, Content)>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeStruct for SerializeStruct<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_field<T: ?Sized + Serialize>(&mut self,
|
|
||||||
key: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<(), E> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.fields.push((key, value));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::Struct(self.name, self.fields))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SerializeStructVariant<E> {
|
|
||||||
name: &'static str,
|
|
||||||
variant_index: usize,
|
|
||||||
variant: &'static str,
|
|
||||||
fields: Vec<(&'static str, Content)>,
|
|
||||||
error: PhantomData<E>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<E> ser::SerializeStructVariant for SerializeStructVariant<E>
|
|
||||||
where E: ser::Error
|
|
||||||
{
|
|
||||||
type Ok = Content;
|
|
||||||
type Error = E;
|
|
||||||
|
|
||||||
fn serialize_field<T: ?Sized + Serialize>(&mut self,
|
|
||||||
key: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<(), E> {
|
|
||||||
let value = try!(value.serialize(ContentSerializer::<E>::new()));
|
|
||||||
self.fields.push((key, value));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(self) -> Result<Content, E> {
|
|
||||||
Ok(Content::StructVariant(self.name, self.variant_index, self.variant, self.fields))
|
|
||||||
}
|
|
||||||
}
|
|
@ -626,6 +626,37 @@ impl Serialize for Duration {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// Seralize the `$value` that implements Display as a string,
|
||||||
|
/// when that string is statically known to never have more than
|
||||||
|
/// a constant `$MAX_LEN` bytes.
|
||||||
|
///
|
||||||
|
/// Panics if the Display impl tries to write more than `$MAX_LEN` bytes.
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
macro_rules! serialize_display_bounded_length {
|
||||||
|
($value: expr, $MAX_LEN: expr, $serializer: expr) => {
|
||||||
|
{
|
||||||
|
use std::io::Write;
|
||||||
|
let mut buffer: [u8; $MAX_LEN] = unsafe { ::std::mem::uninitialized() };
|
||||||
|
let remaining_len;
|
||||||
|
{
|
||||||
|
let mut remaining = &mut buffer[..];
|
||||||
|
write!(remaining, "{}", $value).unwrap();
|
||||||
|
remaining_len = remaining.len()
|
||||||
|
}
|
||||||
|
let written_len = buffer.len() - remaining_len;
|
||||||
|
let written = &buffer[..written_len];
|
||||||
|
|
||||||
|
// write! only provides std::fmt::Formatter to Display implementations,
|
||||||
|
// which has methods write_str and write_char but no method to write arbitrary bytes.
|
||||||
|
// Therefore, `written` is well-formed in UTF-8.
|
||||||
|
let written_str = unsafe {
|
||||||
|
::std::str::from_utf8_unchecked(written)
|
||||||
|
};
|
||||||
|
$serializer.serialize_str(written_str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
impl Serialize for net::IpAddr {
|
impl Serialize for net::IpAddr {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
@ -18,7 +18,7 @@ use ser::{self, Serialize, SerializeSeq, SerializeTuple, SerializeTupleStruct,
|
|||||||
/// # extern crate serde;
|
/// # extern crate serde;
|
||||||
/// #
|
/// #
|
||||||
/// # use serde::ser::{Serializer, Impossible};
|
/// # use serde::ser::{Serializer, Impossible};
|
||||||
/// # use serde::ser::private::Error;
|
/// # use serde::private::ser::Error;
|
||||||
/// #
|
/// #
|
||||||
/// # struct MySerializer;
|
/// # struct MySerializer;
|
||||||
/// #
|
/// #
|
||||||
|
@ -107,12 +107,6 @@ use core::iter::IntoIterator;
|
|||||||
mod impls;
|
mod impls;
|
||||||
mod impossible;
|
mod impossible;
|
||||||
|
|
||||||
// Helpers used by generated code. Not public API.
|
|
||||||
#[doc(hidden)]
|
|
||||||
pub mod private;
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
mod content;
|
|
||||||
|
|
||||||
pub use self::impossible::Impossible;
|
pub use self::impossible::Impossible;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -379,7 +373,7 @@ pub trait Serializer: Sized {
|
|||||||
/// # extern crate serde;
|
/// # extern crate serde;
|
||||||
/// #
|
/// #
|
||||||
/// # use serde::ser::{Serializer, SerializeSeq};
|
/// # use serde::ser::{Serializer, SerializeSeq};
|
||||||
/// # use serde::ser::private::Error;
|
/// # use serde::private::ser::Error;
|
||||||
/// #
|
/// #
|
||||||
/// # struct MySerializer;
|
/// # struct MySerializer;
|
||||||
/// #
|
/// #
|
||||||
|
@ -1,333 +0,0 @@
|
|||||||
use core::fmt::{self, Display};
|
|
||||||
|
|
||||||
use ser::{self, Serialize, Serializer, SerializeMap, SerializeStruct, Impossible};
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
use ser::content::{SerializeTupleVariantAsMapValue, SerializeStructVariantAsMapValue};
|
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
|
||||||
use std::error;
|
|
||||||
|
|
||||||
/// Not public API.
|
|
||||||
pub fn serialize_tagged_newtype<S, T>(serializer: S,
|
|
||||||
type_ident: &'static str,
|
|
||||||
variant_ident: &'static str,
|
|
||||||
tag: &'static str,
|
|
||||||
variant_name: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<S::Ok, S::Error>
|
|
||||||
where S: Serializer,
|
|
||||||
T: Serialize
|
|
||||||
{
|
|
||||||
value.serialize(TaggedSerializer {
|
|
||||||
type_ident: type_ident,
|
|
||||||
variant_ident: variant_ident,
|
|
||||||
tag: tag,
|
|
||||||
variant_name: variant_name,
|
|
||||||
delegate: serializer,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
struct TaggedSerializer<S> {
|
|
||||||
type_ident: &'static str,
|
|
||||||
variant_ident: &'static str,
|
|
||||||
tag: &'static str,
|
|
||||||
variant_name: &'static str,
|
|
||||||
delegate: S,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Unsupported {
|
|
||||||
Boolean,
|
|
||||||
Integer,
|
|
||||||
Float,
|
|
||||||
Char,
|
|
||||||
String,
|
|
||||||
ByteArray,
|
|
||||||
Optional,
|
|
||||||
Unit,
|
|
||||||
UnitStruct,
|
|
||||||
Sequence,
|
|
||||||
Tuple,
|
|
||||||
TupleStruct,
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
Enum,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Display for Unsupported {
|
|
||||||
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match *self {
|
|
||||||
Unsupported::Boolean => formatter.write_str("a boolean"),
|
|
||||||
Unsupported::Integer => formatter.write_str("an integer"),
|
|
||||||
Unsupported::Float => formatter.write_str("a float"),
|
|
||||||
Unsupported::Char => formatter.write_str("a char"),
|
|
||||||
Unsupported::String => formatter.write_str("a string"),
|
|
||||||
Unsupported::ByteArray => formatter.write_str("a byte array"),
|
|
||||||
Unsupported::Optional => formatter.write_str("an optional"),
|
|
||||||
Unsupported::Unit => formatter.write_str("unit"),
|
|
||||||
Unsupported::UnitStruct => formatter.write_str("a unit struct"),
|
|
||||||
Unsupported::Sequence => formatter.write_str("a sequence"),
|
|
||||||
Unsupported::Tuple => formatter.write_str("a tuple"),
|
|
||||||
Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
Unsupported::Enum => formatter.write_str("an enum"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S> TaggedSerializer<S>
|
|
||||||
where S: Serializer
|
|
||||||
{
|
|
||||||
fn bad_type(self, what: Unsupported) -> S::Error {
|
|
||||||
ser::Error::custom(format_args!(
|
|
||||||
"cannot serialize tagged newtype variant {}::{} containing {}",
|
|
||||||
self.type_ident,
|
|
||||||
self.variant_ident,
|
|
||||||
what))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S> Serializer for TaggedSerializer<S>
|
|
||||||
where S: Serializer
|
|
||||||
{
|
|
||||||
type Ok = S::Ok;
|
|
||||||
type Error = S::Error;
|
|
||||||
|
|
||||||
type SerializeSeq = Impossible<S::Ok, S::Error>;
|
|
||||||
type SerializeTuple = Impossible<S::Ok, S::Error>;
|
|
||||||
type SerializeTupleStruct = Impossible<S::Ok, S::Error>;
|
|
||||||
type SerializeMap = S::SerializeMap;
|
|
||||||
type SerializeStruct = S::SerializeStruct;
|
|
||||||
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
type SerializeTupleVariant = Impossible<S::Ok, S::Error>;
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
type SerializeTupleVariant = SerializeTupleVariantAsMapValue<S::SerializeMap>;
|
|
||||||
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
type SerializeStructVariant = Impossible<S::Ok, S::Error>;
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
type SerializeStructVariant = SerializeStructVariantAsMapValue<S::SerializeMap>;
|
|
||||||
|
|
||||||
fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Boolean))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Integer))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Float))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Float))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Char))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::String))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::ByteArray))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Optional))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_some<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error>
|
|
||||||
where T: Serialize
|
|
||||||
{
|
|
||||||
Err(self.bad_type(Unsupported::Optional))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Unit))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::UnitStruct))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_unit_variant(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize,
|
|
||||||
inner_variant: &'static str)
|
|
||||||
-> Result<Self::Ok, Self::Error> {
|
|
||||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
|
||||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
|
||||||
try!(map.serialize_entry(inner_variant, &()));
|
|
||||||
map.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_newtype_struct<T: ?Sized>(self,
|
|
||||||
_: &'static str,
|
|
||||||
value: &T)
|
|
||||||
-> Result<Self::Ok, Self::Error>
|
|
||||||
where T: Serialize
|
|
||||||
{
|
|
||||||
value.serialize(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_newtype_variant<T: ?Sized>(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize,
|
|
||||||
inner_variant: &'static str,
|
|
||||||
inner_value: &T)
|
|
||||||
-> Result<Self::Ok, Self::Error>
|
|
||||||
where T: Serialize
|
|
||||||
{
|
|
||||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
|
||||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
|
||||||
try!(map.serialize_entry(inner_variant, inner_value));
|
|
||||||
map.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Sequence))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_seq_fixed_size(self, _: usize) -> Result<Self::SerializeSeq, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Sequence))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::Tuple))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_tuple_struct(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize)
|
|
||||||
-> Result<Self::SerializeTupleStruct, Self::Error> {
|
|
||||||
Err(self.bad_type(Unsupported::TupleStruct))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
fn serialize_tuple_variant(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize)
|
|
||||||
-> Result<Self::SerializeTupleVariant, Self::Error> {
|
|
||||||
// Lack of push-based serialization means we need to buffer the content
|
|
||||||
// of the tuple variant, so it requires std.
|
|
||||||
Err(self.bad_type(Unsupported::Enum))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
fn serialize_tuple_variant(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize,
|
|
||||||
inner_variant: &'static str,
|
|
||||||
len: usize)
|
|
||||||
-> Result<Self::SerializeTupleVariant, Self::Error> {
|
|
||||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
|
||||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
|
||||||
try!(map.serialize_key(inner_variant));
|
|
||||||
Ok(SerializeTupleVariantAsMapValue::new(map, inner_variant, len))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
|
||||||
let mut map = try!(self.delegate.serialize_map(len.map(|len| len + 1)));
|
|
||||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
|
||||||
Ok(map)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_struct(self,
|
|
||||||
name: &'static str,
|
|
||||||
len: usize)
|
|
||||||
-> Result<Self::SerializeStruct, Self::Error> {
|
|
||||||
let mut state = try!(self.delegate.serialize_struct(name, len + 1));
|
|
||||||
try!(state.serialize_field(self.tag, self.variant_name));
|
|
||||||
Ok(state)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
fn serialize_struct_variant(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize)
|
|
||||||
-> Result<Self::SerializeStructVariant, Self::Error> {
|
|
||||||
// Lack of push-based serialization means we need to buffer the content
|
|
||||||
// of the struct variant, so it requires std.
|
|
||||||
Err(self.bad_type(Unsupported::Enum))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "collections"))]
|
|
||||||
fn serialize_struct_variant(self,
|
|
||||||
_: &'static str,
|
|
||||||
_: usize,
|
|
||||||
inner_variant: &'static str,
|
|
||||||
len: usize)
|
|
||||||
-> Result<Self::SerializeStructVariant, Self::Error> {
|
|
||||||
let mut map = try!(self.delegate.serialize_map(Some(2)));
|
|
||||||
try!(map.serialize_entry(self.tag, self.variant_name));
|
|
||||||
try!(map.serialize_key(inner_variant));
|
|
||||||
Ok(SerializeStructVariantAsMapValue::new(map, inner_variant, len))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(feature = "std", feature = "collections")))]
|
|
||||||
fn collect_str<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error>
|
|
||||||
where T: Display
|
|
||||||
{
|
|
||||||
Err(self.bad_type(Unsupported::String))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used only by Serde doc tests. Not public API.
|
|
||||||
#[doc(hidden)]
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Error;
|
|
||||||
|
|
||||||
impl ser::Error for Error {
|
|
||||||
fn custom<T: Display>(_: T) -> Self {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
|
||||||
impl error::Error for Error {
|
|
||||||
fn description(&self) -> &str {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Display for Error {
|
|
||||||
fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
}
|
|
@ -705,10 +705,10 @@ impl Field {
|
|||||||
// impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, str>
|
// impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, str>
|
||||||
// impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]>
|
// impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]>
|
||||||
if is_cow(&field.ty, "str") {
|
if is_cow(&field.ty, "str") {
|
||||||
let path = syn::parse_path("_serde::de::private::borrow_cow_str").unwrap();
|
let path = syn::parse_path("_serde::private::de::borrow_cow_str").unwrap();
|
||||||
deserialize_with.set_if_none(path);
|
deserialize_with.set_if_none(path);
|
||||||
} else if is_cow(&field.ty, "[u8]") {
|
} else if is_cow(&field.ty, "[u8]") {
|
||||||
let path = syn::parse_path("_serde::de::private::borrow_cow_bytes").unwrap();
|
let path = syn::parse_path("_serde::private::de::borrow_cow_bytes").unwrap();
|
||||||
deserialize_with.set_if_none(path);
|
deserialize_with.set_if_none(path);
|
||||||
}
|
}
|
||||||
} else if is_rptr(&field.ty, "str") || is_rptr(&field.ty, "[u8]") {
|
} else if is_rptr(&field.ty, "str") || is_rptr(&field.ty, "[u8]") {
|
||||||
|
@ -622,7 +622,7 @@ fn deserialize_internally_tagged_enum(ident: &syn::Ident,
|
|||||||
params,
|
params,
|
||||||
variant,
|
variant,
|
||||||
item_attrs,
|
item_attrs,
|
||||||
quote!(_serde::de::private::ContentDeserializer::<__D::Error>::new(__tagged.content)),
|
quote!(_serde::private::de::ContentDeserializer::<__D::Error>::new(__tagged.content)),
|
||||||
));
|
));
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
@ -637,7 +637,7 @@ fn deserialize_internally_tagged_enum(ident: &syn::Ident,
|
|||||||
|
|
||||||
let __tagged = try!(_serde::Deserializer::deserialize(
|
let __tagged = try!(_serde::Deserializer::deserialize(
|
||||||
__deserializer,
|
__deserializer,
|
||||||
_serde::de::private::TaggedContentVisitor::<__Field>::new(#tag)));
|
_serde::private::de::TaggedContentVisitor::<__Field>::new(#tag)));
|
||||||
|
|
||||||
match __tagged.tag {
|
match __tagged.tag {
|
||||||
#(#variant_arms)*
|
#(#variant_arms)*
|
||||||
@ -693,7 +693,7 @@ fn deserialize_adjacently_tagged_enum(ident: &syn::Ident,
|
|||||||
let type_name = item_attrs.name().deserialize_name();
|
let type_name = item_attrs.name().deserialize_name();
|
||||||
|
|
||||||
let tag_or_content = quote! {
|
let tag_or_content = quote! {
|
||||||
_serde::de::private::TagOrContentFieldVisitor {
|
_serde::private::de::TagOrContentFieldVisitor {
|
||||||
tag: #tag,
|
tag: #tag,
|
||||||
content: #content,
|
content: #content,
|
||||||
}
|
}
|
||||||
@ -738,10 +738,10 @@ fn deserialize_adjacently_tagged_enum(ident: &syn::Ident,
|
|||||||
let visit_third_key = quote! {
|
let visit_third_key = quote! {
|
||||||
// Visit the third key in the map, hopefully there isn't one.
|
// Visit the third key in the map, hopefully there isn't one.
|
||||||
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Tag) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
|
||||||
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#tag))
|
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#tag))
|
||||||
}
|
}
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Content) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
|
||||||
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#content))
|
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#content))
|
||||||
}
|
}
|
||||||
_serde::export::None => _serde::export::Ok(__ret),
|
_serde::export::None => _serde::export::Ok(__ret),
|
||||||
@ -789,17 +789,17 @@ fn deserialize_adjacently_tagged_enum(ident: &syn::Ident,
|
|||||||
// Visit the first key.
|
// Visit the first key.
|
||||||
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
||||||
// First key is the tag.
|
// First key is the tag.
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Tag) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
|
||||||
// Parse the tag.
|
// Parse the tag.
|
||||||
let __field = try!(_serde::de::MapVisitor::visit_value(&mut __visitor));
|
let __field = try!(_serde::de::MapVisitor::visit_value(&mut __visitor));
|
||||||
// Visit the second key.
|
// Visit the second key.
|
||||||
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
||||||
// Second key is a duplicate of the tag.
|
// Second key is a duplicate of the tag.
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Tag) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
|
||||||
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#tag))
|
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#tag))
|
||||||
}
|
}
|
||||||
// Second key is the content.
|
// Second key is the content.
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Content) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
|
||||||
let __ret = try!(_serde::de::MapVisitor::visit_value_seed(&mut __visitor,
|
let __ret = try!(_serde::de::MapVisitor::visit_value_seed(&mut __visitor,
|
||||||
__Seed {
|
__Seed {
|
||||||
field: __field,
|
field: __field,
|
||||||
@ -814,14 +814,14 @@ fn deserialize_adjacently_tagged_enum(ident: &syn::Ident,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// First key is the content.
|
// First key is the content.
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Content) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
|
||||||
// Buffer up the content.
|
// Buffer up the content.
|
||||||
let __content = try!(_serde::de::MapVisitor::visit_value::<_serde::de::private::Content>(&mut __visitor));
|
let __content = try!(_serde::de::MapVisitor::visit_value::<_serde::private::de::Content>(&mut __visitor));
|
||||||
// Visit the second key.
|
// Visit the second key.
|
||||||
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
match try!(_serde::de::MapVisitor::visit_key_seed(&mut __visitor, #tag_or_content)) {
|
||||||
// Second key is the tag.
|
// Second key is the tag.
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Tag) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
|
||||||
let __deserializer = _serde::de::private::ContentDeserializer::<__V::Error>::new(__content);
|
let __deserializer = _serde::private::de::ContentDeserializer::<__V::Error>::new(__content);
|
||||||
// Parse the tag.
|
// Parse the tag.
|
||||||
let __ret = try!(match try!(_serde::de::MapVisitor::visit_value(&mut __visitor)) {
|
let __ret = try!(match try!(_serde::de::MapVisitor::visit_value(&mut __visitor)) {
|
||||||
// Deserialize the buffered content now that we know the variant.
|
// Deserialize the buffered content now that we know the variant.
|
||||||
@ -831,7 +831,7 @@ fn deserialize_adjacently_tagged_enum(ident: &syn::Ident,
|
|||||||
#visit_third_key
|
#visit_third_key
|
||||||
}
|
}
|
||||||
// Second key is a duplicate of the content.
|
// Second key is a duplicate of the content.
|
||||||
_serde::export::Some(_serde::de::private::TagOrContentField::Content) => {
|
_serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
|
||||||
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#content))
|
_serde::export::Err(<__V::Error as _serde::de::Error>::duplicate_field(#content))
|
||||||
}
|
}
|
||||||
// There is no second key.
|
// There is no second key.
|
||||||
@ -897,7 +897,7 @@ fn deserialize_untagged_enum(ident: &syn::Ident,
|
|||||||
params,
|
params,
|
||||||
variant,
|
variant,
|
||||||
item_attrs,
|
item_attrs,
|
||||||
quote!(_serde::de::private::ContentRefDeserializer::<__D::Error>::new(&__content)),
|
quote!(_serde::private::de::ContentRefDeserializer::<__D::Error>::new(&__content)),
|
||||||
))
|
))
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -910,7 +910,7 @@ fn deserialize_untagged_enum(ident: &syn::Ident,
|
|||||||
let fallthrough_msg = format!("data did not match any variant of untagged enum {}", ident);
|
let fallthrough_msg = format!("data did not match any variant of untagged enum {}", ident);
|
||||||
|
|
||||||
quote_block! {
|
quote_block! {
|
||||||
let __content = try!(<_serde::de::private::Content as _serde::Deserialize>::deserialize(__deserializer));
|
let __content = try!(<_serde::private::de::Content as _serde::Deserialize>::deserialize(__deserializer));
|
||||||
|
|
||||||
#(
|
#(
|
||||||
if let _serde::export::Ok(__ok) = #attempts {
|
if let _serde::export::Ok(__ok) = #attempts {
|
||||||
@ -974,7 +974,7 @@ fn deserialize_internally_tagged_variant(ident: &syn::Ident,
|
|||||||
let type_name = ident.as_ref();
|
let type_name = ident.as_ref();
|
||||||
let variant_name = variant.ident.as_ref();
|
let variant_name = variant.ident.as_ref();
|
||||||
quote_block! {
|
quote_block! {
|
||||||
try!(_serde::Deserializer::deserialize(#deserializer, _serde::de::private::InternallyTaggedUnitVisitor::new(#type_name, #variant_name)));
|
try!(_serde::Deserializer::deserialize(#deserializer, _serde::private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name)));
|
||||||
_serde::export::Ok(#ident::#variant_ident)
|
_serde::export::Ok(#ident::#variant_ident)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1005,7 +1005,7 @@ fn deserialize_untagged_variant(ident: &syn::Ident,
|
|||||||
_serde::export::Result::map(
|
_serde::export::Result::map(
|
||||||
_serde::Deserializer::deserialize(
|
_serde::Deserializer::deserialize(
|
||||||
#deserializer,
|
#deserializer,
|
||||||
_serde::de::private::UntaggedUnitVisitor::new(#type_name, #variant_name)
|
_serde::private::de::UntaggedUnitVisitor::new(#type_name, #variant_name)
|
||||||
),
|
),
|
||||||
|()| #ident::#variant_ident)
|
|()| #ident::#variant_ident)
|
||||||
}
|
}
|
||||||
@ -1428,7 +1428,7 @@ fn expr_is_missing(field: &Field, item_attrs: &attr::Item) -> Fragment {
|
|||||||
match field.attrs.deserialize_with() {
|
match field.attrs.deserialize_with() {
|
||||||
None => {
|
None => {
|
||||||
quote_expr! {
|
quote_expr! {
|
||||||
try!(_serde::de::private::missing_field(#name))
|
try!(_serde::private::de::missing_field(#name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(_) => {
|
Some(_) => {
|
||||||
|
@ -379,7 +379,7 @@ fn serialize_internally_tagged_variant(ident: &syn::Ident,
|
|||||||
}
|
}
|
||||||
|
|
||||||
quote_expr! {
|
quote_expr! {
|
||||||
_serde::ser::private::serialize_tagged_newtype(
|
_serde::private::ser::serialize_tagged_newtype(
|
||||||
__serializer,
|
__serializer,
|
||||||
#enum_ident_str,
|
#enum_ident_str,
|
||||||
#variant_ident_str,
|
#variant_ident_str,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user