1 use core
::marker
::PhantomData
;
3 #[cfg(all(not(feature = "std"), feature = "collections"))]
4 use collections
::{String, Vec}
;
6 #[cfg(all(feature = "alloc", not(feature = "std")))]
9 #[cfg(feature = "collections")]
10 use collections
::borrow
::ToOwned
;
12 use ser
::{self, Serialize, Serializer}
;
14 pub struct SerializeTupleVariantAsMapValue
<M
> {
20 impl<M
> SerializeTupleVariantAsMapValue
<M
> {
21 pub fn new(map
: M
, name
: &'
static str, len
: usize) -> Self {
22 SerializeTupleVariantAsMapValue
{
25 fields
: Vec
::with_capacity(len
),
30 impl<M
> ser
::SerializeTupleVariant
for SerializeTupleVariantAsMapValue
<M
>
31 where M
: ser
::SerializeMap
34 type Error
= M
::Error
;
36 fn serialize_field
<T
: ?Sized
+ Serialize
>(&mut self,
38 -> Result
<(), M
::Error
>
40 let value
= try
!(value
.serialize(ContentSerializer
::<M
::Error
>::new()));
41 self.fields
.push(value
);
45 fn end(mut self) -> Result
<M
::Ok
, M
::Error
> {
46 try
!(self.map
.serialize_value(&Content
::TupleStruct(self.name
, self.fields
)));
51 pub struct SerializeStructVariantAsMapValue
<M
> {
54 fields
: Vec
<(&'
static str, Content
)>,
57 impl<M
> SerializeStructVariantAsMapValue
<M
> {
58 pub fn new(map
: M
, name
: &'
static str, len
: usize) -> Self {
59 SerializeStructVariantAsMapValue
{
62 fields
: Vec
::with_capacity(len
),
67 impl<M
> ser
::SerializeStructVariant
for SerializeStructVariantAsMapValue
<M
>
68 where M
: ser
::SerializeMap
71 type Error
= M
::Error
;
73 fn serialize_field
<T
: ?Sized
+ Serialize
>(&mut self,
76 -> Result
<(), M
::Error
>
78 let value
= try
!(value
.serialize(ContentSerializer
::<M
::Error
>::new()));
79 self.fields
.push((key
, value
));
83 fn end(mut self) -> Result
<M
::Ok
, M
::Error
> {
84 try
!(self.map
.serialize_value(&Content
::Struct(self.name
, self.fields
)));
114 UnitStruct(&'
static str),
115 UnitVariant(&'
static str, usize, &'
static str),
116 NewtypeStruct(&'
static str, Box
<Content
>),
117 NewtypeVariant(&'
static str, usize, &'
static str, Box
<Content
>),
120 SeqFixedSize(Vec
<Content
>),
122 TupleStruct(&'
static str, Vec
<Content
>),
123 TupleVariant(&'
static str, usize, &'
static str, Vec
<Content
>),
124 Map(Vec
<(Content
, Content
)>),
125 Struct(&'
static str, Vec
<(&'
static str, Content
)>),
126 StructVariant(&'
static str, usize, &'
static str, Vec
<(&'
static str, Content
)>),
129 impl Serialize
for Content
{
130 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
134 Content
::Bool(b
) => serializer
.serialize_bool(b
),
135 Content
::U8(u
) => serializer
.serialize_u8(u
),
136 Content
::U16(u
) => serializer
.serialize_u16(u
),
137 Content
::U32(u
) => serializer
.serialize_u32(u
),
138 Content
::U64(u
) => serializer
.serialize_u64(u
),
139 Content
::I8(i
) => serializer
.serialize_i8(i
),
140 Content
::I16(i
) => serializer
.serialize_i16(i
),
141 Content
::I32(i
) => serializer
.serialize_i32(i
),
142 Content
::I64(i
) => serializer
.serialize_i64(i
),
143 Content
::F32(f
) => serializer
.serialize_f32(f
),
144 Content
::F64(f
) => serializer
.serialize_f64(f
),
145 Content
::Char(c
) => serializer
.serialize_char(c
),
146 Content
::String(ref s
) => serializer
.serialize_str(s
),
147 Content
::Bytes(ref b
) => serializer
.serialize_bytes(b
),
148 Content
::None
=> serializer
.serialize_none(),
149 Content
::Some(ref c
) => serializer
.serialize_some(&**c
),
150 Content
::Unit
=> serializer
.serialize_unit(),
151 Content
::UnitStruct(n
) => serializer
.serialize_unit_struct(n
),
152 Content
::UnitVariant(n
, i
, v
) => serializer
.serialize_unit_variant(n
, i
, v
),
153 Content
::NewtypeStruct(n
, ref c
) => serializer
.serialize_newtype_struct(n
, &**c
),
154 Content
::NewtypeVariant(n
, i
, v
, ref c
) => serializer
.serialize_newtype_variant(n
, i
, v
, &**c
),
155 Content
::Seq(ref elements
) => elements
.serialize(serializer
),
156 Content
::SeqFixedSize(ref elements
) => {
157 use ser
::SerializeSeq
;
158 let mut seq
= try
!(serializer
.serialize_seq_fixed_size(elements
.len()));
160 try
!(seq
.serialize_element(e
));
164 Content
::Tuple(ref elements
) => {
165 use ser
::SerializeTuple
;
166 let mut tuple
= try
!(serializer
.serialize_tuple(elements
.len()));
168 try
!(tuple
.serialize_element(e
));
172 Content
::TupleStruct(n
, ref fields
) => {
173 use ser
::SerializeTupleStruct
;
174 let mut ts
= try
!(serializer
.serialize_tuple_struct(n
, fields
.len()));
176 try
!(ts
.serialize_field(f
));
180 Content
::TupleVariant(n
, i
, v
, ref fields
) => {
181 use ser
::SerializeTupleVariant
;
182 let mut tv
= try
!(serializer
.serialize_tuple_variant(n
, i
, v
, fields
.len()));
184 try
!(tv
.serialize_field(f
));
188 Content
::Map(ref entries
) => {
189 use ser
::SerializeMap
;
190 let mut map
= try
!(serializer
.serialize_map(Some(entries
.len())));
191 for &(ref k
, ref v
) in entries
{
192 try
!(map
.serialize_entry(k
, v
));
196 Content
::Struct(n
, ref fields
) => {
197 use ser
::SerializeStruct
;
198 let mut s
= try
!(serializer
.serialize_struct(n
, fields
.len()));
199 for &(k
, ref v
) in fields
{
200 try
!(s
.serialize_field(k
, v
));
204 Content
::StructVariant(n
, i
, v
, ref fields
) => {
205 use ser
::SerializeStructVariant
;
206 let mut sv
= try
!(serializer
.serialize_struct_variant(n
, i
, v
, fields
.len()));
207 for &(k
, ref v
) in fields
{
208 try
!(sv
.serialize_field(k
, v
));
216 struct ContentSerializer
<E
> {
217 error
: PhantomData
<E
>,
220 impl<E
> ContentSerializer
<E
> {
228 impl<E
> Serializer
for ContentSerializer
<E
>
234 type SerializeSeq
= SerializeSeq
<E
>;
235 type SerializeTuple
= SerializeTuple
<E
>;
236 type SerializeTupleStruct
= SerializeTupleStruct
<E
>;
237 type SerializeTupleVariant
= SerializeTupleVariant
<E
>;
238 type SerializeMap
= SerializeMap
<E
>;
239 type SerializeStruct
= SerializeStruct
<E
>;
240 type SerializeStructVariant
= SerializeStructVariant
<E
>;
242 fn serialize_bool(self, v
: bool
) -> Result
<Content
, E
> {
246 fn serialize_i8(self, v
: i8) -> Result
<Content
, E
> {
250 fn serialize_i16(self, v
: i16) -> Result
<Content
, E
> {
254 fn serialize_i32(self, v
: i32) -> Result
<Content
, E
> {
258 fn serialize_i64(self, v
: i64) -> Result
<Content
, E
> {
262 fn serialize_u8(self, v
: u8) -> Result
<Content
, E
> {
266 fn serialize_u16(self, v
: u16) -> Result
<Content
, E
> {
270 fn serialize_u32(self, v
: u32) -> Result
<Content
, E
> {
274 fn serialize_u64(self, v
: u64) -> Result
<Content
, E
> {
278 fn serialize_f32(self, v
: f32) -> Result
<Content
, E
> {
282 fn serialize_f64(self, v
: f64) -> Result
<Content
, E
> {
286 fn serialize_char(self, v
: char) -> Result
<Content
, E
> {
290 fn serialize_str(self, value
: &str) -> Result
<Content
, E
> {
291 Ok(Content
::String(value
.to_owned()))
294 fn serialize_bytes(self, value
: &[u8]) -> Result
<Content
, E
> {
295 Ok(Content
::Bytes(value
.to_owned()))
298 fn serialize_none(self) -> Result
<Content
, E
> {
302 fn serialize_some
<T
: ?Sized
+ Serialize
>(self,
304 -> Result
<Content
, E
> {
305 Ok(Content
::Some(Box
::new(try
!(value
.serialize(self)))))
308 fn serialize_unit(self) -> Result
<Content
, E
> {
312 fn serialize_unit_struct(self,
314 -> Result
<Content
, E
> {
315 Ok(Content
::UnitStruct(name
))
318 fn serialize_unit_variant(self,
320 variant_index
: usize,
321 variant
: &'
static str)
322 -> Result
<Content
, E
> {
323 Ok(Content
::UnitVariant(name
, variant_index
, variant
))
326 fn serialize_newtype_struct
<T
: ?Sized
+ Serialize
>(self,
329 -> Result
<Content
, E
> {
330 Ok(Content
::NewtypeStruct(name
, Box
::new(try
!(value
.serialize(self)))))
333 fn serialize_newtype_variant
<T
: ?Sized
+ Serialize
>(self,
335 variant_index
: usize,
336 variant
: &'
static str,
338 -> Result
<Content
, E
> {
339 Ok(Content
::NewtypeVariant(name
, variant_index
, variant
, Box
::new(try
!(value
.serialize(self)))))
342 fn serialize_seq(self,
344 -> Result
<Self::SerializeSeq
, E
> {
347 elements
: Vec
::with_capacity(len
.unwrap_or(0)),
352 fn serialize_seq_fixed_size(self,
354 -> Result
<Self::SerializeSeq
, E
> {
357 elements
: Vec
::with_capacity(size
),
362 fn serialize_tuple(self,
364 -> Result
<Self::SerializeTuple
, E
> {
366 elements
: Vec
::with_capacity(len
),
371 fn serialize_tuple_struct(self,
374 -> Result
<Self::SerializeTupleStruct
, E
> {
375 Ok(SerializeTupleStruct
{
377 fields
: Vec
::with_capacity(len
),
382 fn serialize_tuple_variant(self,
384 variant_index
: usize,
385 variant
: &'
static str,
387 -> Result
<Self::SerializeTupleVariant
, E
> {
388 Ok(SerializeTupleVariant
{
390 variant_index
: variant_index
,
392 fields
: Vec
::with_capacity(len
),
397 fn serialize_map(self,
399 -> Result
<Self::SerializeMap
, E
> {
401 entries
: Vec
::with_capacity(len
.unwrap_or(0)),
407 fn serialize_struct(self,
410 -> Result
<Self::SerializeStruct
, E
> {
413 fields
: Vec
::with_capacity(len
),
418 fn serialize_struct_variant(self,
420 variant_index
: usize,
421 variant
: &'
static str,
423 -> Result
<Self::SerializeStructVariant
, E
> {
424 Ok(SerializeStructVariant
{
426 variant_index
: variant_index
,
428 fields
: Vec
::with_capacity(len
),
434 struct SerializeSeq
<E
> {
436 elements
: Vec
<Content
>,
437 error
: PhantomData
<E
>,
440 impl<E
> ser
::SerializeSeq
for SerializeSeq
<E
>
446 fn serialize_element
<T
: ?Sized
+ Serialize
>(&mut self,
449 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
450 self.elements
.push(value
);
454 fn end(self) -> Result
<Content
, E
> {
455 Ok(if self.fixed_size
{
456 Content
::SeqFixedSize(self.elements
)
458 Content
::Seq(self.elements
)
463 struct SerializeTuple
<E
> {
464 elements
: Vec
<Content
>,
465 error
: PhantomData
<E
>,
468 impl<E
> ser
::SerializeTuple
for SerializeTuple
<E
>
474 fn serialize_element
<T
: ?Sized
+ Serialize
>(&mut self,
477 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
478 self.elements
.push(value
);
482 fn end(self) -> Result
<Content
, E
> {
483 Ok(Content
::Tuple(self.elements
))
487 struct SerializeTupleStruct
<E
> {
489 fields
: Vec
<Content
>,
490 error
: PhantomData
<E
>,
493 impl<E
> ser
::SerializeTupleStruct
for SerializeTupleStruct
<E
>
499 fn serialize_field
<T
: ?Sized
+ Serialize
>(&mut self,
502 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
503 self.fields
.push(value
);
507 fn end(self) -> Result
<Content
, E
> {
508 Ok(Content
::TupleStruct(self.name
, self.fields
))
512 struct SerializeTupleVariant
<E
> {
514 variant_index
: usize,
515 variant
: &'
static str,
516 fields
: Vec
<Content
>,
517 error
: PhantomData
<E
>,
520 impl<E
> ser
::SerializeTupleVariant
for SerializeTupleVariant
<E
>
526 fn serialize_field
<T
: ?Sized
+ Serialize
>(&mut self,
529 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
530 self.fields
.push(value
);
534 fn end(self) -> Result
<Content
, E
> {
535 Ok(Content
::TupleVariant(self.name
, self.variant_index
, self.variant
, self.fields
))
539 struct SerializeMap
<E
> {
540 entries
: Vec
<(Content
, Content
)>,
541 key
: Option
<Content
>,
542 error
: PhantomData
<E
>,
545 impl<E
> ser
::SerializeMap
for SerializeMap
<E
>
551 fn serialize_key
<T
: ?Sized
+ Serialize
>(&mut self,
554 let key
= try
!(key
.serialize(ContentSerializer
::<E
>::new()));
555 self.key
= Some(key
);
559 fn serialize_value
<T
: ?Sized
+ Serialize
>(&mut self,
562 let key
= self.key
.take().expect("serialize_value called before serialize_key");
563 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
564 self.entries
.push((key
, value
));
568 fn end(self) -> Result
<Content
, E
> {
569 Ok(Content
::Map(self.entries
))
572 fn serialize_entry
<K
: ?Sized
+ Serialize
, V
: ?Sized
+ Serialize
>(&mut self,
576 let key
= try
!(key
.serialize(ContentSerializer
::<E
>::new()));
577 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
578 self.entries
.push((key
, value
));
583 struct SerializeStruct
<E
> {
585 fields
: Vec
<(&'
static str, Content
)>,
586 error
: PhantomData
<E
>,
589 impl<E
> ser
::SerializeStruct
for SerializeStruct
<E
>
595 fn serialize_field
<T
: ?Sized
+ Serialize
>(&mut self,
599 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
600 self.fields
.push((key
, value
));
604 fn end(self) -> Result
<Content
, E
> {
605 Ok(Content
::Struct(self.name
, self.fields
))
609 struct SerializeStructVariant
<E
> {
611 variant_index
: usize,
612 variant
: &'
static str,
613 fields
: Vec
<(&'
static str, Content
)>,
614 error
: PhantomData
<E
>,
617 impl<E
> ser
::SerializeStructVariant
for SerializeStructVariant
<E
>
623 fn serialize_field
<T
: ?Sized
+ Serialize
>(&mut self,
627 let value
= try
!(value
.serialize(ContentSerializer
::<E
>::new()));
628 self.fields
.push((key
, value
));
632 fn end(self) -> Result
<Content
, E
> {
633 Ok(Content
::StructVariant(self.name
, self.variant_index
, self.variant
, self.fields
))