1use std::io::Write;
4use byteorder::{LE, WriteBytesExt};
5use indexmap::IndexSet;
6use serde::ser::{self, Impossible, Serialize, SerializeMap, SerializeSeq,
7 SerializeStruct, SerializeTuple, SerializeTupleStruct,
8 SerializeTupleVariant, SerializeStructVariant};
9
10use crate::Label;
11use crate::error::{Error, Result};
12use crate::header::{Header, Section, Signature, Version};
13use crate::index::LabelIndex;
14use crate::value::SimpleValueRef;
15use crate::raw::{self, FieldType};
16
17mod value;
18
19#[derive(Debug, Copy, Clone)]
21struct StructIndex(usize);
22
23#[derive(Debug, Copy, Clone)]
27struct FieldListIndex(usize);
28
29#[derive(Debug, Copy, Clone)]
31struct ListIndex(usize);
32
33#[derive(Debug)]
37enum Struct {
38 NoFields,
40 OneField(usize),
42 MultiField { list: FieldListIndex, fields: u32 }
44}
45impl Struct {
46 #[inline]
48 fn into_raw(&self, offsets: &[u32]) -> raw::Struct {
49 use self::Struct::*;
50
51 match *self {
52 NoFields => raw::Struct { tag: 0, offset: 0, fields: 0 },
53 OneField(index) => raw::Struct { tag: 0, offset: index as u32, fields: 1 },
54 MultiField { list, fields } => raw::Struct { tag: 0, offset: offsets[list.0], fields },
55 }
56 }
57}
58
59#[derive(Debug)]
63enum Field {
64 Simple { label: LabelIndex, value: SimpleValueRef },
66 Struct { label: LabelIndex, struct_: StructIndex },
69 List { label: LabelIndex, list: ListIndex },
72}
73impl Field {
74 #[inline]
76 fn into_raw(&self, offsets: &[u32]) -> Result<raw::Field> {
77 use self::Field::*;
78
79 Ok(match self {
80 Simple { label, value } => value.into_raw(label.0)?,
81 Struct { label, struct_ } => {
82 let mut data = [0u8; 4];
83 (&mut data[..]).write_u32::<LE>(struct_.0 as u32)?;
84 raw::Field { tag: FieldType::Struct as u32, label: label.0, data }
85 },
86 List { label, list } => {
87 let offset = offsets[list.0];
88
89 let mut data = [0u8; 4];
90 (&mut data[..]).write_u32::<LE>(offset)?;
91 raw::Field { tag: FieldType::List as u32, label: label.0, data }
92 },
93 })
94 }
95}
96
97impl SimpleValueRef {
98 #[inline]
103 fn into_raw(&self, label: u32) -> Result<raw::Field> {
104 use self::SimpleValueRef::*;
105
106 let mut data = [0u8; 4];
107 let type_ = {
108 let mut storage = &mut data[..];
109 match *self {
110 Byte(val) => { storage.write_u8 (val )?; FieldType::Byte },
111 Char(val) => { storage.write_i8 (val )?; FieldType::Char },
112 Word(val) => { storage.write_u16::<LE>(val )?; FieldType::Word },
113 Short(val) => { storage.write_i16::<LE>(val )?; FieldType::Short },
114 Dword(val) => { storage.write_u32::<LE>(val )?; FieldType::Dword },
115 Int(val) => { storage.write_i32::<LE>(val )?; FieldType::Int },
116 Dword64(val) => { storage.write_u32::<LE>(val.0)?; FieldType::Dword64 },
117 Int64(val) => { storage.write_u32::<LE>(val.0)?; FieldType::Int64 },
118 Float(val) => { storage.write_f32::<LE>(val )?; FieldType::Float },
119 Double(val) => { storage.write_u32::<LE>(val.0)?; FieldType::Double },
120 String(val) => { storage.write_u32::<LE>(val.0)?; FieldType::String },
121 ResRef(val) => { storage.write_u32::<LE>(val.0)?; FieldType::ResRef },
122 LocString(val) => { storage.write_u32::<LE>(val.0)?; FieldType::LocString },
123 Void(val) => { storage.write_u32::<LE>(val.0)?; FieldType::Void },
124 }
125 };
126 Ok(raw::Field { tag: type_ as u32, label, data })
127 }
128}
129
130#[derive(Default, Debug)]
136pub struct Serializer {
137 structs: Vec<Struct>,
139 fields: Vec<Field>,
141 labels: IndexSet<Label>,
143 field_data: Vec<u8>,
145 field_indices: Vec<Vec<u32>>,
148 list_indices: Vec<Vec<u32>>,
152}
153
154impl Serializer {
155 fn add_label(&mut self, label: &str) -> Result<LabelIndex> {
162 let label = label.parse()?;
163 self.labels.insert(label);
164 let (index, _) = self.labels.get_full(&label).unwrap();
166 Ok(LabelIndex(index as u32))
167 }
168 fn add_struct(&mut self, fields: usize) -> (StructIndex, FieldListIndex) {
178 let index = StructIndex(self.structs.len());
179 let list = FieldListIndex(self.field_indices.len());
180
181 match fields {
182 0 => self.structs.push(Struct::NoFields),
183 1 => self.structs.push(Struct::OneField(0)),
185 _ => {
186 self.field_indices.push(Vec::with_capacity(fields));
187 self.structs.push(Struct::MultiField { list, fields: fields as u32 })
188 }
189 }
190 (index, list)
191 }
192 fn add_list(&mut self, label: LabelIndex, len: usize) -> ListIndex {
201 let list = ListIndex(self.list_indices.len());
202 self.list_indices.push(Vec::with_capacity(len));
203 self.fields.push(Field::List { label, list });
204 list
205 }
206 fn add_tuple_variant(&mut self, struct_index: StructIndex, variant: &'static str, len: usize) -> Result<ListSerializer> {
207 if let Struct::OneField(ref mut index) = self.structs[struct_index.0] {
209 *index = self.fields.len();
210 }
211 let label = self.add_label(variant)?;
213 let list_index = self.add_list(label, len);
215 Ok(ListSerializer { ser: self, list_index })
216 }
217 fn add_struct_variant(&mut self, struct_index: StructIndex, variant: &'static str, len: usize) -> Result<StructSerializer> {
218 if let Struct::OneField(ref mut index) = self.structs[struct_index.0] {
220 *index = self.fields.len();
221 }
222
223 let (struct_index, fields_index) = self.add_struct(len);
224
225 let label = self.add_label(variant)?;
227 self.fields.push(Field::Struct { label, struct_: struct_index });
228
229 Ok(StructSerializer { ser: self, struct_index, fields_index })
230 }
231 fn make_header(&self, signature: Signature, version: Version) -> Header {
233 struct Builder {
234 offset: u32,
235 }
236 impl Builder {
237 #[inline]
238 fn new() -> Self {
239 Builder { offset: 4 + 4 + 8 * 6 }
241 }
242 #[inline]
243 fn add_section(&mut self, count: usize, size: u32) -> Section {
244 let section = Section { offset: self.offset, count: count as u32 };
245 self.offset += section.count * size;
246 section
247 }
248 #[inline]
250 fn fields(&mut self, vec: &Vec<Vec<u32>>) -> Section {
251 let cnt = vec.into_iter().fold(0, |sum, v| sum + v.len());
252 self.add_section(cnt * 4, 1)}
254 #[inline]
255 fn lists(&mut self, vec: &Vec<Vec<u32>>) -> Section {
256 let cnt = vec.into_iter().fold(0, |sum, v| sum + v.len() + 1);
257 self.add_section(cnt * 4, 1)}
259 }
260
261 let mut builder = Builder::new();
262 Header {
263 signature: signature,
264 version: version,
265 structs: builder.add_section(self.structs.len(), 3 * 4),fields: builder.add_section(self.fields.len(), 3 * 4),labels: builder.add_section(self.labels.len(), 16 * 1),field_data: builder.add_section(self.field_data.len(), 1), field_indices: builder.fields(&self.field_indices),
270 list_indices: builder.lists(&self.list_indices),
271 }
272 }
273 pub fn write<W: Write>(&self, writer: &mut W, signature: Signature, version: Version) -> Result<()> {
275 self.make_header(signature, version).write(writer)?;
276
277 self.write_structs(writer)?;
278 self.write_fields(writer)?;
279 self.write_labels(writer)?;
280 writer.write_all(&self.field_data)?;
281 for ref list in &self.field_indices {
282 self.write_indices(writer, list)?;
283 }
284 for ref list in &self.list_indices {
285 writer.write_u32::<LE>(list.len() as u32)?;
286 self.write_indices(writer, list)?;
287 }
288 Ok(())
289 }
290 #[inline]
292 fn write_structs<W: Write>(&self, writer: &mut W) -> Result<()> {
293 let offsets = self.calc_field_offsets();
294 for e in self.structs.iter() {
295 e.into_raw(&offsets).write(writer)?;
296 }
297 Ok(())
298 }
299 #[inline]
301 fn write_fields<W: Write>(&self, writer: &mut W) -> Result<()> {
302 let offsets = self.calc_list_offsets();
303 for e in self.fields.iter() {
304 e.into_raw(&offsets)?.write(writer)?;
305 }
306 Ok(())
307 }
308 #[inline]
310 fn write_labels<W: Write>(&self, writer: &mut W) -> Result<()> {
311 for label in self.labels.iter() {
312 writer.write_all(label.as_ref())?;
313 }
314 Ok(())
315 }
316 #[inline]
318 fn write_indices<W: Write>(&self, writer: &mut W, indices: &Vec<u32>) -> Result<()> {
319 for index in indices.iter() {
320 writer.write_u32::<LE>(*index)?;
321 }
322 Ok(())
323 }
324 fn calc_field_offsets(&self) -> Vec<u32> {
326 let mut offsets = Vec::with_capacity(self.field_indices.len());
327 let mut last_offset = 0;
328 for elements in self.field_indices.iter() {
329 offsets.push(last_offset as u32);
330 last_offset += elements.len() * 4;
331 }
332 offsets
333 }
334 fn calc_list_offsets(&self) -> Vec<u32> {
336 let mut offsets = Vec::with_capacity(self.list_indices.len());
337 let mut last_offset = 0;
338 for elements in self.list_indices.iter() {
339 offsets.push(last_offset as u32);
340 last_offset += (elements.len() + 1) * 4;
342 }
343 offsets
344 }
345}
346
347#[inline]
349pub fn to_writer<W, T>(writer: &mut W, signature: Signature, value: &T) -> Result<()>
350 where W: Write,
351 T: Serialize + ?Sized,
352{
353 let mut s = Serializer::default();
354 value.serialize(&mut s)?;
355 s.write(writer, signature, Version::V3_2)
356}
357#[inline]
359pub fn to_vec<T>(signature: Signature, value: &T) -> Result<Vec<u8>>
360 where T: Serialize + ?Sized,
361{
362 let mut vec = Vec::new();
363 to_writer(&mut vec, signature, value)?;
364 Ok(vec)
365}
366
367macro_rules! unsupported {
371 ($ser_method:ident ( $($type:ty),* ) ) => (
372 unsupported!($ser_method($($type),*) -> Self::Ok);
373 );
374 ($ser_method:ident ( $($type:ty),* ) -> $result:ty) => (
375 fn $ser_method(self, $(_: $type),*) -> Result<$result> {
376 Err(Error::Serialize(concat!(
377 "`", stringify!($ser_method), "` can't be implemented in GFF format. Wrap value to the struct and serialize struct"
378 ).into()))
379 }
380 );
381}
382
383impl<'a> ser::Serializer for &'a mut Serializer {
384 type Ok = ();
385 type Error = Error;
386
387 type SerializeSeq = ListSerializer<'a>;
388 type SerializeTuple = Impossible<Self::Ok, Self::Error>;
389 type SerializeTupleStruct = Impossible<Self::Ok, Self::Error>;
390 type SerializeTupleVariant = Self::SerializeSeq;
391 type SerializeMap = MapSerializer<'a>;
392 type SerializeStruct = StructSerializer<'a>;
393 type SerializeStructVariant = Self::SerializeStruct;
394
395 unsupported!(serialize_i8(i8));
396 unsupported!(serialize_u8(u8));
397 unsupported!(serialize_i16(i16));
398 unsupported!(serialize_u16(u16));
399 unsupported!(serialize_i32(i32));
400 unsupported!(serialize_u32(u32));
401 unsupported!(serialize_i64(i64));
402 unsupported!(serialize_u64(u64));
403
404 unsupported!(serialize_f32(f32));
405 unsupported!(serialize_f64(f64));
406
407 unsupported!(serialize_bool(bool));
408 unsupported!(serialize_char(char));
409
410 unsupported!(serialize_str(&str));
411 unsupported!(serialize_bytes(&[u8]));
412
413 #[inline]
414 fn serialize_none(self) -> Result<Self::Ok> {
415 self.serialize_unit()
416 }
417 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
418 where T: ?Sized + Serialize,
419 {
420 value.serialize(self)
421 }
422 #[inline]
426 fn serialize_unit(self) -> Result<Self::Ok> {
427 self.add_struct(0);
428 Ok(())
429 }
430 #[inline]
431 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
432 self.serialize_unit()
433 }
434 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok>
435 where T: ?Sized + Serialize,
436 {
437 value.serialize(self)
438 }
439 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
440 Err(Error::Serialize(format!(
441 "`serialize_tuple(len: {})` can't be implemented in GFF format. Wrap value to the struct and serialize struct",
442 len
443 )))
444 }
445 fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct> {
446 Err(Error::Serialize(format!(
447 "`serialize_tuple_struct(name: {}, len: {})` can't be implemented in GFF format. Wrap value to the struct and serialize struct",
448 name, len
449 )))
450 }
451 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
452 let (struct_index, fields_index) = self.add_struct(len);
453 Ok(StructSerializer { ser: self, struct_index, fields_index })
454 }
455 unsupported!(serialize_seq(Option<usize>) -> Self::SerializeSeq);
459 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
460 let ser = self.serialize_struct("", len.unwrap_or(0))?;
461 Ok(MapSerializer { ser, label: None })
462 }
463 #[inline]
469 fn serialize_unit_variant(self, name: &'static str, index: u32, variant: &'static str) -> Result<Self::Ok> {
470 Err(Error::Serialize(format!(
471 "`serialize_unit_variant(name: {}, index: {}, variant: {})` can't be implemented in GFF format. Wrap value to the struct and serialize struct",
472 name, index, variant
473 )))
474 }
475 fn serialize_newtype_variant<T>(self, name: &'static str, _index: u32, variant: &'static str, value: &T) -> Result<Self::Ok>
477 where T: ?Sized + Serialize,
478 {
479 let mut ser = self.serialize_struct(name, 1)?;
480 SerializeStruct::serialize_field(&mut ser, variant, value)?;
481 SerializeStruct::end(ser)
482 }
483 #[inline]
484 fn serialize_tuple_variant(self, _name: &'static str, _index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant> {
485 let (struct_index, _) = self.add_struct(1);
487 self.add_tuple_variant(struct_index, variant, len)
488 }
489 #[inline]
490 fn serialize_struct_variant(self, _name: &'static str, _index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant> {
491 let (struct_index, _) = self.add_struct(1);
493 self.add_struct_variant(struct_index, variant, len)
494 }
495}
496
497struct FieldSerializer<'a> {
499 ser: &'a mut Serializer,
501 label: LabelIndex,
503}
504impl<'a> FieldSerializer<'a> {
505 fn add_struct(&mut self, fields: usize) -> Result<(StructIndex, FieldListIndex)> {
514 let (struct_index, fields_index) = self.ser.add_struct(fields);
516
517 self.ser.fields.push(Field::Struct {
518 label: self.label,
519 struct_: struct_index
520 });
521 Ok((struct_index, fields_index))
522 }
523}
524macro_rules! primitive {
526 ($ser_method:ident, $type:ty, $tag:ident) => (
527 #[inline]
528 fn $ser_method(self, v: $type) -> Result<Self::Ok> {
529 self.ser.fields.push(Field::Simple {
530 label: self.label,
531 value: SimpleValueRef::$tag(v)
532 });
533 Ok(())
534 }
535 );
536}
537macro_rules! complex {
539 ($ser_method:ident, $type:ty, $tag:ident, $write_method:ident) => (
540 #[inline]
541 fn $ser_method(self, v: $type) -> Result<Self::Ok> {
542 let offset = self.ser.field_data.len() as u32;
543 self.ser.field_data.$write_method::<LE>(v)?;
545
546 self.ser.fields.push(Field::Simple {
548 label: self.label,
549 value: SimpleValueRef::$tag(offset.into())
550 });
551 Ok(())
552 }
553 );
554 ($ser_method:ident, $type:ty, $tag:ident) => (
555 #[inline]
556 fn $ser_method(self, v: $type) -> Result<Self::Ok> {
557 let offset = self.ser.field_data.len() as u32;
558 self.ser.field_data.write_u32::<LE>(v.len() as u32)?;
560 self.ser.field_data.write_all(v.as_ref())?;
561
562 self.ser.fields.push(Field::Simple {
564 label: self.label,
565 value: SimpleValueRef::$tag(offset.into())
566 });
567 Ok(())
568 }
569 );
570}
571impl<'a> ser::Serializer for FieldSerializer<'a> {
572 type Ok = ();
573 type Error = Error;
574
575 type SerializeSeq = ListSerializer<'a>;
576 type SerializeTuple = Self::SerializeSeq;
577 type SerializeTupleStruct = Self::SerializeSeq;
578 type SerializeTupleVariant = Self::SerializeSeq;
579 type SerializeMap = MapSerializer<'a>;
580 type SerializeStruct = StructSerializer<'a>;
581 type SerializeStructVariant = Self::SerializeStruct;
582
583 primitive!(serialize_u8 , u8 , Byte);
584 primitive!(serialize_i8 , i8 , Char);
585 primitive!(serialize_u16, u16, Word);
586 primitive!(serialize_i16, i16, Short);
587 primitive!(serialize_u32, u32, Dword);
588 primitive!(serialize_i32, i32, Int);
589 complex! (serialize_u64, u64, Dword64, write_u64);
590 complex! (serialize_i64, i64, Int64, write_i64);
591
592 primitive!(serialize_f32, f32, Float);
593 complex! (serialize_f64, f64, Double, write_f64);
594
595 #[inline]
598 fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
599 self.serialize_u8(if v { 1 } else { 0 })
600 }
601 #[inline]
604 fn serialize_char(self, v: char) -> Result<Self::Ok> {
605 let mut data = [0u8; 4];
606 self.serialize_str(v.encode_utf8(&mut data))
607 }
608
609 complex!(serialize_str , &str , String);
610 complex!(serialize_bytes, &[u8], Void);
611
612 #[inline]
613 fn serialize_none(self) -> Result<Self::Ok> {
614 self.serialize_unit()
615 }
616 #[inline]
617 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
618 where T: ?Sized + Serialize,
619 {
620 value.serialize(self)
621 }
622 #[inline]
626 fn serialize_unit(mut self) -> Result<Self::Ok> {
627 self.add_struct(0)?;
628 Ok(())
629 }
630 #[inline]
631 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
632 self.serialize_unit()
633 }
634 #[inline]
635 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok>
636 where T: ?Sized + Serialize,
637 {
638 value.serialize(self)
639 }
640 #[inline]
641 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
642 let list_index = self.ser.add_list(self.label, len);
643 Ok(ListSerializer { ser: self.ser, list_index })
644 }
645 #[inline]
646 fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct> {
647 self.serialize_tuple(len)
648 }
649 #[inline]
650 fn serialize_struct(mut self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
651 let (struct_index, fields_index) = self.add_struct(len)?;
652 Ok(StructSerializer { ser: self.ser, struct_index, fields_index })
653 }
654 #[inline]
658 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
659 self.serialize_tuple(len.unwrap_or(0))
660 }
661 #[inline]
662 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
663 let ser = self.serialize_struct("", len.unwrap_or(0))?;
664 Ok(MapSerializer { ser, label: None })
665 }
666 #[inline]
671 fn serialize_unit_variant(self, _name: &'static str, _index: u32, variant: &'static str) -> Result<Self::Ok> {
672 self.serialize_str(variant)
673 }
674 fn serialize_newtype_variant<T>(self, name: &'static str, _index: u32, variant: &'static str, value: &T) -> Result<Self::Ok>
676 where T: ?Sized + Serialize,
677 {
678 let mut ser = self.serialize_struct(name, 1)?;
679 SerializeStruct::serialize_field(&mut ser, variant, value)?;
680 SerializeStruct::end(ser)
681 }
682 #[inline]
683 fn serialize_tuple_variant(mut self, _name: &'static str, _index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant> {
684 let (struct_index, _) = self.add_struct(1)?;
686 self.ser.add_tuple_variant(struct_index, variant, len)
687 }
688 #[inline]
689 fn serialize_struct_variant(mut self, _name: &'static str, _index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant> {
690 let (struct_index, _) = self.add_struct(1)?;
692 self.ser.add_struct_variant(struct_index, variant, len)
693 }
694}
695
696pub struct StructSerializer<'a> {
699 ser: &'a mut Serializer,
701 struct_index: StructIndex,
704 fields_index: FieldListIndex,
707}
708impl<'a> StructSerializer<'a> {
709 #[inline]
711 fn serialize_value<T>(&mut self, label: LabelIndex, value: &T) -> Result<()>
712 where T: ?Sized + Serialize,
713 {
714 use self::Struct::*;
715
716 let index = self.ser.fields.len();
717 value.serialize(FieldSerializer { ser: self.ser, label })?;
718 let struct_ = &mut self.ser.structs[self.struct_index.0];
720 match struct_ {
721 NoFields => {},
723 OneField(ref mut idx) => *idx = index,
725 MultiField {..} => {
726 let fields = &mut self.ser.field_indices[self.fields_index.0];
729 fields.push(index as u32);
730 },
731 };
732 Ok(())
733 }
734}
735impl<'a> SerializeStruct for StructSerializer<'a> {
736 type Ok = ();
737 type Error = Error;
738
739 #[inline]
740 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<Self::Ok>
741 where T: ?Sized + Serialize,
742 {
743 let label = self.ser.add_label(key)?;
745 self.serialize_value(label, value)
746 }
747
748 #[inline]
749 fn end(self) -> Result<Self::Ok> { Ok(()) }
750}
751impl<'a> SerializeStructVariant for StructSerializer<'a> {
752 type Ok = ();
753 type Error = Error;
754
755 #[inline]
756 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<Self::Ok>
757 where T: ?Sized + Serialize,
758 {
759 <Self as SerializeStruct>::serialize_field(self, key, value)
760 }
761 #[inline]
762 fn end(self) -> Result<()> { <Self as SerializeStruct>::end(self) }
763}
764
765pub struct ListSerializer<'a> {
767 ser: &'a mut Serializer,
769 list_index: ListIndex,
772}
773
774impl<'a> SerializeSeq for ListSerializer<'a> {
775 type Ok = ();
776 type Error = Error;
777
778 #[inline]
779 fn serialize_element<T>(&mut self, value: &T) -> Result<Self::Ok>
780 where T: ?Sized + Serialize,
781 {
782 let index = self.ser.structs.len() as u32;
783 {
784 let list = &mut self.ser.list_indices[self.list_index.0];
785 list.push(index);
786 }
787 value.serialize(&mut *self.ser)
788 }
789
790 #[inline]
791 fn end(self) -> Result<()> { Ok(()) }
792}
793
794impl<'a> SerializeTuple for ListSerializer<'a> {
795 type Ok = ();
796 type Error = Error;
797
798 #[inline]
799 fn serialize_element<T>(&mut self, value: &T) -> Result<Self::Ok>
800 where T: ?Sized + Serialize,
801 {
802 <Self as SerializeSeq>::serialize_element(self, value)
803 }
804 #[inline]
805 fn end(self) -> Result<()> { <Self as SerializeSeq>::end(self) }
806}
807
808impl<'a> SerializeTupleStruct for ListSerializer<'a> {
809 type Ok = ();
810 type Error = Error;
811
812 #[inline]
813 fn serialize_field<T>(&mut self, value: &T) -> Result<Self::Ok>
814 where T: ?Sized + Serialize,
815 {
816 <Self as SerializeSeq>::serialize_element(self, value)
817 }
818 #[inline]
819 fn end(self) -> Result<()> { <Self as SerializeSeq>::end(self) }
820}
821
822impl<'a> SerializeTupleVariant for ListSerializer<'a> {
823 type Ok = ();
824 type Error = Error;
825
826 #[inline]
827 fn serialize_field<T>(&mut self, value: &T) -> Result<Self::Ok>
828 where T: ?Sized + Serialize,
829 {
830 <Self as SerializeSeq>::serialize_element(self, value)
831 }
832 #[inline]
833 fn end(self) -> Result<()> { <Self as SerializeSeq>::end(self) }
834}
835
836pub struct MapSerializer<'a> {
839 ser: StructSerializer<'a>,
841 label: Option<LabelIndex>,
843}
844impl<'a, 'b> ser::Serializer for &'b mut MapSerializer<'a> {
845 type Ok = LabelIndex;
846 type Error = Error;
847
848 type SerializeSeq = Impossible<Self::Ok, Self::Error>;
849 type SerializeTuple = Impossible<Self::Ok, Self::Error>;
850 type SerializeTupleStruct = Impossible<Self::Ok, Self::Error>;
851 type SerializeTupleVariant = Impossible<Self::Ok, Self::Error>;
852 type SerializeMap = Impossible<Self::Ok, Self::Error>;
853 type SerializeStruct = Impossible<Self::Ok, Self::Error>;
854 type SerializeStructVariant = Impossible<Self::Ok, Self::Error>;
855
856 unsupported!(serialize_i8(i8));
857 unsupported!(serialize_u8(u8));
858 unsupported!(serialize_i16(i16));
859 unsupported!(serialize_u16(u16));
860 unsupported!(serialize_i32(i32));
861 unsupported!(serialize_u32(u32));
862 unsupported!(serialize_i64(i64));
863 unsupported!(serialize_u64(u64));
864
865 unsupported!(serialize_f32(f32));
866 unsupported!(serialize_f64(f64));
867
868 unsupported!(serialize_bool(bool));
869 unsupported!(serialize_char(char));
870
871 #[inline]
872 fn serialize_str(self, value: &str) -> Result<Self::Ok> {
873 self.ser.ser.add_label(value)
875 }
876 unsupported!(serialize_bytes(&[u8]));
877
878 unsupported!(serialize_none());
879 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
880 where T: ?Sized + Serialize,
881 {
882 value.serialize(self)
883 }
884 unsupported!(serialize_unit());
888 unsupported!(serialize_unit_struct(&'static str));
889 #[inline]
890 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok>
891 where T: ?Sized + Serialize,
892 {
893 value.serialize(self)
894 }
895 unsupported!(serialize_tuple(usize) -> Self::SerializeTuple);
896 unsupported!(serialize_tuple_struct(&'static str, usize) -> Self::SerializeTupleStruct);
897 unsupported!(serialize_struct(&'static str, usize) -> Self::SerializeStruct);
898 unsupported!(serialize_seq(Option<usize>) -> Self::SerializeSeq);
902 unsupported!(serialize_map(Option<usize>) -> Self::SerializeMap);
903 #[inline]
907 fn serialize_unit_variant(self, _name: &'static str, _index: u32, variant: &'static str) -> Result<Self::Ok> {
908 self.serialize_str(variant)
909 }
910 fn serialize_newtype_variant<T>(self, name: &'static str, index: u32, variant: &'static str, _value: &T) -> Result<Self::Ok>
911 where T: ?Sized + Serialize,
912 {
913 unimplemented!("`serialize_newtype_variant(name: {}, index: {}, variant: {})`", name, index, variant);
914 }
915 unsupported!(serialize_tuple_variant(&'static str, u32, &'static str, usize) -> Self::SerializeTupleVariant);
916 unsupported!(serialize_struct_variant(&'static str, u32, &'static str, usize) -> Self::SerializeStructVariant);
917}
918
919impl<'a> SerializeMap for MapSerializer<'a> {
920 type Ok = ();
921 type Error = Error;
922
923 #[inline]
924 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
925 where T: ?Sized + Serialize,
926 {
927 self.label = Some(key.serialize(&mut *self)?);
928 Ok(())
929 }
930
931 #[inline]
932 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
933 where T: ?Sized + Serialize,
934 {
935 let error = || Error::Serialize("`SerializeMap::serialize_key` must be called before `SerializeMap::serialize_value`".into());
936 self.ser.serialize_value(self.label.ok_or_else(error)?, value)
937 }
938
939 #[inline]
940 fn end(self) -> Result<Self::Ok> { Ok(()) }
941}
942
943#[cfg(test)]
944mod tests {
945 use std::collections::BTreeMap;
946 use serde::Serialize;
947 use super::to_vec as to_vec_;
948 use serde_bytes::{Bytes, ByteBuf};
949
950 macro_rules! primitive_wrapped {
953 ($type:expr; $b1:expr, $b2:expr, $b3:expr, $b4:expr) => (
954 vec![
955 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 1,0,0,0,68,0,0,0, 1,0,0,0,80,0,0,0, 1,0,0,0,96,0,0,0, 0,0,0,0,96,0,0,0, 0,0,0,0,96,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 1,0,0,0,$type,0,0,0, 0,0,0,0, $b1,$b2,$b3,$b4,b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,]
977 );
978 }
979
980 macro_rules! replace_expr {
982 ($_t:tt $sub:expr) => ($sub);
983 }
984
985 macro_rules! len {
987 ($($tts:tt)*) => (
988 <[()]>::len(&[$(replace_expr!($tts ())),*])
989 );
990 }
991 macro_rules! complex_wrapped {
994 ($type:expr; $($bytes:expr),*) => ({
995 let count = len!($($bytes)*) as u8;
996
997 vec![
998 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 1,0,0,0,68,0,0,0, 1,0,0,0,80,0,0,0, 1,0,0,0,96,0,0,0, count,0,0,0,96 + count,0,0,0, 0,0,0,0,96 + count,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 1,0,0,0,$type,0,0,0, 0,0,0,0, 0,0,0,0,b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,$($bytes),*
1022 ]
1023 });
1024 }
1025 macro_rules! list_wrapped {
1028 ($($type:expr; $b1:expr, $b2:expr, $b3:expr, $b4:expr;)*) => ({
1029 let cnt = len!($($type)*) as u8;
1030 let mut i = 0u8;let mut j = 0u8;let len = (1 + len!($($type)*) as u8) * 4;
1033
1034 vec![
1035 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 1 + cnt,0,0,0,68 + cnt*4*3 ,0,0,0, 1 + cnt,0,0,0,80 + cnt*4*3*2,0,0,0, 1,0,0,0,96 + cnt*4*3*2,0,0,0, 0,0,0,0,96 + cnt*4*3*2,0,0,0, 0,0,0,0,96 + cnt*4*3*2,0,0,0, len,0,0,0,0,0,0,0, 0,0,0,0, 1,0,0,0,$(
1050 0,0,0,0, replace_expr!($type {i+=1; i}),0,0,0, 1,0,0,0,)*
1052
1053 15,0,0,0, 0,0,0,0, 0,0,0,0,$(
1057 $type,0,0,0, 0,0,0,0, $b1,$b2,$b3,$b4,)*
1059
1060 b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,cnt,0,0,0, $(replace_expr!($type {j+=1; j}),0,0,0,)*]
1066 });
1067 }
1068
1069 macro_rules! map {
1071 () => (
1072 BTreeMap::new()
1073 );
1074 ($($k:expr => $v:expr),+) => (
1075 map!($($k => $v,)*)
1076 );
1077 ($($k:expr => $v:expr,)+) => (
1078 {
1079 let mut m = BTreeMap::new();
1080 $(
1081 m.insert($k, $v);
1082 )+
1083 m
1084 }
1085 );
1086 }
1087
1088 macro_rules! map_tests {
1089 () => (
1090 #[test]
1092 fn test_map() {
1093 let empty: BTreeMap<String, ()> = map![];
1095 assert_eq!(to_vec(empty), to_vec(()));
1096
1097 #[derive(Serialize)]
1098 struct S {
1099 field1: u32,
1100 field2: u32,
1101 }
1102
1103 let map = map![
1105 "field1".to_string() => 1u32,
1106 "field2".to_string() => 2u32,
1107 ];
1108 assert_eq!(to_vec(map), to_vec(S { field1: 1, field2: 2 }));
1109
1110 let map = map![
1113 1u32 => 1u32,
1114 2u32 => 2u32,
1115 ];
1116 assert!(is_err(map));
1117 }
1118 );
1119 }
1120
1121 macro_rules! enum_tests {
1124 ($mode:tt) => (
1125 #[derive(Serialize, Copy, Clone)]
1126 struct Value {
1127 value: u32,
1128 }
1129 #[test]
1131 fn test_enum_externally_tagged() {
1132 #[derive(Serialize)]
1133 enum E {
1134 Unit,
1135 Newtype1(u32),
1136 Newtype2(Value),
1137 Tuple1(u32, u32),
1138 Tuple2(Value, Value),
1139 Struct { value: u32 },
1140 }
1141 #[derive(Serialize)]
1142 #[allow(non_snake_case)]
1143 struct Newtype1 {
1144 Newtype1: u32,
1145 }
1146 #[derive(Serialize)]
1147 #[allow(non_snake_case)]
1148 struct Newtype2 {
1149 Newtype2: Value,
1150 }
1151 #[derive(Serialize)]
1152 #[allow(non_snake_case)]
1153 struct Tuple2 {
1154 Tuple2: [Value; 2],
1155 }
1156 #[derive(Serialize)]
1157 #[allow(non_snake_case)]
1158 struct Struct {
1159 Struct: Value,
1160 }
1161
1162 let value = Value { value: 42 };
1163
1164 enum_tests!(externally $mode E);
1165
1166 let n = E::Newtype1(1);
1167 let expected = to_vec(Newtype1 { Newtype1: 1 });
1168 assert_eq!(to_vec(n), expected);
1169
1170 let n = E::Newtype2(value);
1171 let expected = to_vec(Newtype2 { Newtype2: value });
1172 assert_eq!(to_vec(n), expected);
1173
1174 let t = E::Tuple1(1, 2);
1175 assert!(is_err(t));
1178
1179 let t = E::Tuple2(value, value);
1180 let expected = to_vec(Tuple2 { Tuple2: [value, value] });
1181 assert_eq!(to_vec(t), expected);
1182
1183 let s = E::Struct { value: 42 };
1184 let expected = to_vec(Struct { Struct: value });
1185 assert_eq!(to_vec(s), expected);
1186 }
1187
1188 #[test]
1192 fn test_enum_internally_tagged() {
1193 #[derive(Serialize)]
1194 #[serde(tag = "tag")]
1195 enum E {
1196 Unit,
1197 Newtype1(u32),
1198 Newtype2(Value),
1199 Struct { value: u32 },
1201 }
1202 #[derive(Serialize)]
1204 struct Unit {
1205 tag: &'static str,
1206 }
1207 #[derive(Serialize)]
1209 struct Struct {
1210 tag: &'static str,
1211 value: u32,
1212 }
1213
1214 let u = E::Unit;
1215 let expected = to_vec(Unit { tag: "Unit" });
1216 assert_eq!(to_vec(u), expected);
1217
1218 let n = E::Newtype1(1);
1220 assert!(is_err(n));
1221
1222 let n = E::Newtype2(Value { value: 42 });
1223 let expected = to_vec(Struct { tag: "Newtype2", value: 42 });
1224 assert_eq!(to_vec(n), expected);
1225
1226 let s = E::Struct { value: 1 };
1227 let expected = to_vec(Struct { tag: "Struct", value: 1 });
1228 assert_eq!(to_vec(s), expected);
1229 }
1230
1231 #[test]
1233 fn test_enum_adjacently_tagged() {
1234 #[derive(Serialize)]
1235 #[serde(tag = "tag", content = "content")]
1236 enum E {
1237 Unit,
1238 Newtype1(u32),
1239 Newtype2(Value),
1240 Tuple1(u32, u32),
1241 Tuple2(Value, Value),
1242 Struct { value: u32 },
1243 }
1244 #[derive(Serialize)]
1246 struct Unit {
1247 tag: &'static str,
1248 }
1249 #[derive(Serialize)]
1251 struct Newtype {
1252 tag: &'static str,
1253 content: u32,
1254 }
1255 #[derive(Serialize)]
1257 struct Tuple {
1258 tag: &'static str,
1259 content: (Value, Value),
1260 }
1261 #[derive(Serialize)]
1263 struct Struct {
1264 tag: &'static str,
1265 content: Value,
1266 }
1267
1268 let value = Value { value: 42 };
1269
1270 let u = E::Unit;
1271 let expected = to_vec(Unit { tag: "Unit" });
1272 assert_eq!(to_vec(u), expected);
1273
1274 let n = E::Newtype1(1);
1275 let expected = to_vec(Newtype { tag: "Newtype1", content: 1 });
1276 assert_eq!(to_vec(n), expected);
1277
1278 let n = E::Newtype2(value);
1279 let expected = to_vec(Struct { tag: "Newtype2", content: value });
1280 assert_eq!(to_vec(n), expected);
1281
1282 let t = E::Tuple1(1, 2);
1284 assert!(is_err(t));
1285
1286 let t = E::Tuple2(value, value);
1287 let expected = to_vec(Tuple { tag: "Tuple2", content: (value, value) });
1288 assert_eq!(to_vec(t), expected);
1289
1290 let s = E::Struct { value: 42 };
1291 let expected = to_vec(Struct { tag: "Struct", content: value });
1292 assert_eq!(to_vec(s), expected);
1293 }
1294
1295 #[test]
1297 fn test_enum_untagged() {
1298 #[derive(Serialize)]
1299 #[serde(untagged)]
1300 enum E {
1301 Unit,
1302 Newtype1(u32),
1303 Newtype2(Value),
1304 Tuple1(u32, u32),
1305 Tuple2(Value, Value),
1306 Struct { value: u32 },
1307 }
1308 #[derive(Serialize, Copy, Clone)]
1310 struct Value { value: u32 };
1311
1312 let value = Value { value: 42 };
1313
1314 let u = E::Unit;
1315 let expected = ();
1316 assert_eq!(to_vec(u), to_vec(expected));
1317
1318 let n = E::Newtype2(value);
1319 assert_eq!(to_vec(n), to_vec(value));
1320
1321 let t = E::Tuple1(1, 2);
1324 assert!(is_err(t));
1325
1326 enum_tests!(untagged $mode E, value);
1327
1328 let s = E::Struct { value: 1 };
1329 let expected = Value { value: 1 };
1330 assert_eq!(to_vec(s), to_vec(expected));
1331 }
1332 );
1333
1334 (externally toplevel $E:ident) => (
1335 let u = $E::Unit;
1337 assert!(is_err(u));
1338 );
1339 (externally as_field $E:ident) => (
1340 let u = $E::Unit;
1341 let expected = to_vec("Unit");
1342 assert_eq!(to_vec(u), expected);
1343 );
1344
1345 (untagged toplevel $E:ident, $value:expr) => (
1346 let n = E::Newtype1(1);
1348 assert!(is_err(n));
1349
1350 let t = $E::Tuple2($value, $value);
1352 assert!(is_err(t));
1353 );
1354 (untagged as_field $E:ident, $value:expr) => (
1355 let n = E::Newtype1(1);
1356 assert_eq!(to_vec(n), to_vec(1u32));
1357
1358 let t = $E::Tuple2($value, $value);
1359 let expected = ($value, $value);
1360 assert_eq!(to_vec(t), to_vec(expected));
1361 );
1362 }
1363
1364 mod toplevel {
1365 use super::*;
1367 use crate::error::Result;
1368
1369 #[inline]
1370 fn to_result<T>(value: T) -> Result<Vec<u8>>
1371 where T: Serialize,
1372 {
1373 to_vec_((*b"GFF ").into(), &value)
1374 }
1375
1376 #[inline]
1377 fn is_err<T>(value: T) -> bool
1378 where T: Serialize,
1379 {
1380 to_result(value).is_err()
1381 }
1382
1383 #[inline]
1384 fn to_vec<T>(value: T) -> Vec<u8>
1385 where T: Serialize,
1386 {
1387 to_result(value).expect("Serialization fail")
1388 }
1389
1390 macro_rules! unit {
1392 () => (
1393 vec![
1394 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 1,0,0,0,68,0,0,0, 0,0,0,0,68,0,0,0, 0,0,0,0,68,0,0,0, 0,0,0,0,68,0,0,0, 0,0,0,0,68,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,]
1409 );
1410 }
1411
1412 #[test]
1414 fn test_simple_numbers() {
1415 assert!(is_err( 42u8 ));
1416 assert!(is_err( 42u16));
1417 assert!(is_err( 42u32));
1418
1419 assert!(is_err(-42i8 ));
1420 assert!(is_err(-42i16));
1421 assert!(is_err(-42i32));
1422
1423 assert!(is_err( 4.2f32));
1424 assert!(is_err( 0.0f32));
1425 assert!(is_err(-4.2f32));
1426 }
1427
1428 #[test]
1430 fn test_complex_numbers() {
1431 assert!(is_err( 42u64));
1432 assert!(is_err(-42i64));
1433
1434 assert!(is_err( 4.2f64));
1435 assert!(is_err( 0.0f64));
1436 assert!(is_err(-4.2f64));
1437 }
1438
1439 #[test]
1441 #[should_panic(expected = "`serialize_bool` can\\'t be implemented in GFF format. Wrap value to the struct and serialize struct")]
1442 fn test_bool_true() {
1443 to_result(true).unwrap();
1444 }
1445 #[test]
1447 #[should_panic(expected = "`serialize_bool` can\\'t be implemented in GFF format. Wrap value to the struct and serialize struct")]
1448 fn test_bool_false() {
1449 to_result(false).unwrap();
1450 }
1451
1452 #[test]
1454 #[should_panic(expected = "`serialize_str` can\\'t be implemented in GFF format. Wrap value to the struct and serialize struct")]
1455 fn test_str_slice() {
1456 to_result("юникод").unwrap();
1457 }
1458 #[test]
1460 #[should_panic(expected = "`serialize_str` can\\'t be implemented in GFF format. Wrap value to the struct and serialize struct")]
1461 fn test_str_owned() {
1462 to_result("юникод".to_owned()).unwrap();
1463 }
1464
1465 #[test]
1467 #[should_panic(expected = "`serialize_bytes` can\\'t be implemented in GFF format. Wrap value to the struct and serialize struct")]
1468 fn test_bytes_slice() {
1469 let array = b"Array with length more then 32 bytes";
1470
1471 to_result(Bytes::new(array)).unwrap();
1472 }
1473 #[test]
1475 #[should_panic(expected = "`serialize_bytes` can\\'t be implemented in GFF format. Wrap value to the struct and serialize struct")]
1476 fn test_bytes_owned() {
1477 let array = b"Array with length more then 32 bytes";
1478
1479 to_result(ByteBuf::from(array.as_ref())).unwrap();
1480 }
1481
1482 #[test]
1484 fn test_none() {
1485 macro_rules! none_test {
1486 ($type:ty) => (
1487 let none: Option<$type> = None;
1488 assert_eq!(to_vec(none), unit!());
1489 );
1490 }
1491 none_test!(u8);
1492 none_test!(u16);
1493 none_test!(u32);
1494 none_test!(u64);
1495
1496 none_test!(i8);
1497 none_test!(i16);
1498 none_test!(i32);
1499 none_test!(i64);
1500
1501 none_test!(f32);
1502 none_test!(f64);
1503
1504 none_test!(String);
1505 none_test!(Vec<u8>);
1506
1507 none_test!(());
1508 none_test!((u32, f32));
1509
1510 #[derive(Serialize)]
1511 struct Unit;
1512 none_test!(Unit);
1513
1514 #[derive(Serialize)]
1515 struct Newtype(u32);
1516 none_test!(Newtype);
1517
1518 #[derive(Serialize)]
1519 struct Tuple(u32, f32);
1520 none_test!(Tuple);
1521
1522 #[derive(Serialize)]
1523 struct Struct { field1: u32, field2: f32 };
1524 none_test!(Struct);
1525 }
1526
1527 #[test]
1529 fn test_some() {
1530 assert!(is_err(Some(0u8 )));
1531 assert!(is_err(Some(0u16)));
1532 assert!(is_err(Some(0u32)));
1533 assert!(is_err(Some(0u64)));
1534
1535 assert!(is_err(Some(0i8 )));
1536 assert!(is_err(Some(0i16)));
1537 assert!(is_err(Some(0i32)));
1538 assert!(is_err(Some(0i64)));
1539
1540 assert!(is_err(Some(0f32)));
1541 assert!(is_err(Some(0f64)));
1542
1543 assert!(is_err(Some(true )));
1544 assert!(is_err(Some(false)));
1545
1546 assert!(is_err(Some("string")));
1547 assert!(is_err(Some(Bytes::new(b"byte slice"))));
1548 }
1549
1550 #[test]
1552 fn test_unit() {
1553 #[derive(Serialize)]
1554 struct Unit;
1555
1556 assert_eq!(to_vec(Unit), unit!());
1557 assert_eq!(to_vec(()), unit!());
1558 }
1559
1560 #[test]
1562 fn test_newtype() {
1563 macro_rules! newtype_test {
1572 ($type:ty) => (
1573 newtype_test!($type, Default::default())
1574 );
1575 ($type:ty, $value:expr) => ({
1576 #[derive(Serialize)]
1577 struct Newtype($type);
1578
1579 let test = Newtype($value);
1580 assert!(is_err(test));
1581 });
1582 ($type:ty = $value:expr) => ({
1583 #[derive(Serialize)]
1584 struct NewtypeX($type);
1585
1586 let wrapped = NewtypeX($value);
1587 let clear = $value;
1588
1589 assert_eq!(to_vec(wrapped), to_vec(clear));
1590 });
1591 }
1592
1593 newtype_test!(u8);
1594 newtype_test!(u16);
1595 newtype_test!(u32);
1596 newtype_test!(u64);
1597
1598 newtype_test!(i8);
1599 newtype_test!(i16);
1600 newtype_test!(i32);
1601 newtype_test!(i64);
1602
1603 newtype_test!(f32);
1604 newtype_test!(f64);
1605
1606 newtype_test!(bool);
1607
1608 newtype_test!(String, "some string".into());
1609 newtype_test!(ByteBuf, ByteBuf::from(b"some vector".to_vec()));
1610
1611 newtype_test!(() = ());
1612
1613 #[derive(Serialize, Clone, Copy)]
1614 struct Item1 { payload: u32 };
1615 #[derive(Serialize, Clone, Copy)]
1616 struct Item2 { value: u64 };
1617
1618 let item1 = Item1 { payload: 123456789 };
1619 let item2 = Item2 { value: 0xDEAD_BEAF_00FF_FF00 };
1620
1621 newtype_test!((Item1, Item2), (item1, item2));
1622
1623 #[derive(Serialize)]
1624 struct Unit;
1625 newtype_test!(Unit = Unit);
1626
1627 #[derive(Serialize)]
1628 struct Newtype(Item1);
1629 newtype_test!(Newtype = Newtype(item1));
1630
1631 #[derive(Serialize)]
1632 struct Tuple(Item1, Item2);
1633 newtype_test!(Tuple, Tuple(item1, item2));
1634
1635 #[derive(Serialize)]
1636 struct Struct { field1: u32, field2: f32 };
1637 newtype_test!(Struct = Struct { field1: 42, field2: 42.0 });
1638 }
1639
1640 #[test]
1642 fn test_struct() {
1643 #[derive(Serialize)]
1644 struct Struct {
1645 field1: String,
1646 field2: String,
1647 };
1648
1649 let test = Struct {
1650 field1: "value".into(),
1651 field2: "another value".into(),
1652 };
1653 let expected = vec![
1654 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 1,0,0,0,68,0,0,0, 2,0,0,0,92,0,0,0, 2,0,0,0,124,0,0,0, 26,0,0,0,150,0,0,0, 8,0,0,0,158,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 2,0,0,0,10,0,0,0, 0,0,0,0, 0,0,0,0,10,0,0,0, 1,0,0,0, 9,0,0,0,b'f',b'i',b'e',b'l',b'd',b'1',0,0,0,0,0,0,0,0,0,0,b'f',b'i',b'e',b'l',b'd',b'2',0,0,0,0,0,0,0,0,0,0,5,0,0,0, b'v',b'a',b'l',b'u',b'e',
1680 13,0,0,0, b'a',b'n',b'o',b't',b'h',b'e',b'r',b' ',b'v',b'a',b'l',b'u',b'e',
1681
1682 0,0,0,0, 1,0,0,0,];
1685 assert_eq!(to_vec(test), expected);
1686 }
1687
1688 #[test]
1690 fn test_tuple_with_non_struct_item() {
1691 #[derive(Serialize, Clone, Copy)]
1692 struct Item { value: u32 }
1693 #[derive(Serialize)]
1694 struct Tuple1(u32, f32);
1695 #[derive(Serialize)]
1696 struct Tuple2(Item, f32);
1697
1698 let item = Item { value: 42 };
1699
1700 assert!(is_err((42u32, 42f32)));
1701 assert!(is_err((item, 42f32)));
1702 assert!(is_err(Tuple1(42, 42.0)));
1703 assert!(is_err(Tuple2(item, 42.0)));
1704 }
1705
1706 #[test]
1708 fn test_tuple_with_struct_item() {
1709 #[derive(Serialize, Clone, Copy)]
1710 struct Item1 { value: u32 }
1711 #[derive(Serialize, Clone, Copy)]
1712 struct Item2 { value: f32 }
1713 #[derive(Serialize)]
1714 struct Tuple(Item1, Item2);
1715
1716 let item1 = Item1 { value: 42 };
1717 let item2 = Item2 { value: 42.0 };
1718
1719 assert!(is_err((item1, item2)));
1720 assert!(is_err(Tuple(item1, item2)));
1721 }
1722
1723 #[test]
1725 fn test_list_with_non_struct_item() {
1726 let array = [
1727 41u8,
1728 42u8,
1729 43u8,
1730 ];
1731 let owned = array.to_vec();
1732
1733 assert!(is_err(owned));
1734 assert!(is_err(&array[..]));
1735 assert!(is_err(array));
1736 }
1737
1738 #[test]
1740 fn test_list_with_struct_item() {
1741 #[derive(Serialize, Clone)]
1742 struct Item<T: Serialize + Clone> {
1743 value: T
1744 }
1745
1746 let array = [
1747 Item { value: 41u8 },
1748 Item { value: 42u8 },
1749 Item { value: 43u8 },
1750 ];
1751 let owned = array.to_vec();
1752
1753 assert!(is_err(owned));
1754 assert!(is_err(&array[..]));
1755 assert!(is_err(array));
1756 }
1757 map_tests!();
1758 enum_tests!(toplevel);
1759 }
1760
1761 mod as_field {
1762 use super::*;
1764 use crate::error::Result;
1765
1766 #[inline]
1769 fn to_result<T>(value: T) -> Result<Vec<u8>>
1770 where T: Serialize,
1771 {
1772 #[derive(Serialize)]
1773 struct Storage<T: Serialize> {
1774 value: T
1775 }
1776 to_vec_((*b"GFF ").into(), &Storage { value })
1777 }
1778
1779 #[inline]
1780 fn is_err<T>(value: T) -> bool
1781 where T: Serialize,
1782 {
1783 to_result(value).is_err()
1784 }
1785
1786 #[inline]
1789 fn to_vec<T>(value: T) -> Vec<u8>
1790 where T: Serialize,
1791 {
1792 to_result(value).expect("Serialization fail")
1793 }
1794
1795 macro_rules! unit {
1798 () => (
1799 vec![
1800 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 2,0,0,0,80,0,0,0, 1,0,0,0,92,0,0,0, 1,0,0,0,108,0,0,0, 0,0,0,0,108,0,0,0, 0,0,0,0,108,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,14,0,0,0, 0,0,0,0, 1,0,0,0,b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,]
1823 );
1824 }
1825
1826 #[test]
1828 fn test_simple_numbers() {
1829 assert_eq!(to_vec( 42u8 ), primitive_wrapped![0; 0x2A,0,0,0]);
1830 assert_eq!(to_vec( 42u16), primitive_wrapped![2; 0x2A,0,0,0]);
1831 assert_eq!(to_vec( 42u32), primitive_wrapped![4; 0x2A,0,0,0]);
1832
1833 assert_eq!(to_vec(-42i8 ), primitive_wrapped![1; 0xD6,0,0,0]);
1834 assert_eq!(to_vec(-42i16), primitive_wrapped![3; 0xD6,0xFF,0,0]);
1835 assert_eq!(to_vec(-42i32), primitive_wrapped![5; 0xD6,0xFF,0xFF,0xFF]);
1836
1837 assert_eq!(to_vec( 42f32), primitive_wrapped![8; 0,0,0x28,0x42]);
1838 assert_eq!(to_vec( 0f32), primitive_wrapped![8; 0,0,0,0]);
1839 assert_eq!(to_vec(-42f32), primitive_wrapped![8; 0,0,0x28,0xC2]);
1840 }
1841
1842 #[test]
1844 fn test_complex_numbers() {
1845 assert_eq!(to_vec( 42u64), complex_wrapped![6; 0x2A,0,0,0,0,0,0,0]);
1846 assert_eq!(to_vec(-42i64), complex_wrapped![7; 0xD6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]);
1847
1848 assert_eq!(to_vec( 42f64), complex_wrapped![9; 0,0,0,0,0,0,0x45,0x40]);
1849 assert_eq!(to_vec( 0f64), complex_wrapped![9; 0,0,0,0,0,0,0,0]);
1850 assert_eq!(to_vec(-42f64), complex_wrapped![9; 0,0,0,0,0,0,0x45,0xC0]);
1851 }
1852
1853 #[test]
1855 fn test_bool() {
1856 assert_eq!(to_vec(true ), primitive_wrapped![0; 1,0,0,0]);
1857 assert_eq!(to_vec(false), primitive_wrapped![0; 0,0,0,0]);
1858 }
1859
1860 #[test]
1862 fn test_string() {
1863 let slice = "юникод";
1864 let expected = complex_wrapped![10; 12,0,0,0, 0xD1,0x8E, 0xD0,0xBD, 0xD0,0xB8, 0xD0,0xBA, 0xD0,0xBE, 0xD0,0xB4];
1865 assert_eq!(to_vec(slice), expected);
1866 assert_eq!(to_vec(slice.to_owned()), expected);
1867 }
1868
1869 #[test]
1871 fn test_bytes() {
1872 let array = b"Array with length more then 32 bytes";
1873 let expected = complex_wrapped![13; 36,0,0,0,
1874 b'A',b'r',b'r',b'a',b'y',b' ',
1875 b'w',b'i',b't',b'h',b' ',
1876 b'l',b'e',b'n',b'g',b't',b'h',b' ',
1877 b'm',b'o',b'r',b'e',b' ',
1878 b't',b'h',b'e',b'n',b' ',
1879 b'3',b'2',b' ',
1880 b'b',b'y',b't',b'e',b's'];
1881
1882 #[derive(Serialize)]
1883 struct StorageRef<'a> {
1884 #[serde(with = "serde_bytes")]
1885 value: &'a [u8]
1886 }
1887 let storage = StorageRef { value: array.as_ref() };
1888 assert_eq!(to_vec_((*b"GFF ").into(), &storage).expect("Serialization fail"), expected);
1889
1890 #[derive(Serialize)]
1891 struct StorageVec {
1892 #[serde(with = "serde_bytes")]
1893 value: Vec<u8>
1894 }
1895 let storage = StorageVec { value: array.to_vec() };
1896 assert_eq!(to_vec_((*b"GFF ").into(), &storage).expect("Serialization fail"), expected);
1897 }
1898
1899 #[test]
1901 fn test_none() {
1902 macro_rules! none_test {
1903 ($type:ty) => (
1904 let none: Option<$type> = None;
1905 assert_eq!(to_vec(none), unit!());
1906 );
1907 }
1908 none_test!(u8);
1909 none_test!(u16);
1910 none_test!(u32);
1911 none_test!(u64);
1912
1913 none_test!(i8);
1914 none_test!(i16);
1915 none_test!(i32);
1916 none_test!(i64);
1917
1918 none_test!(f32);
1919 none_test!(f64);
1920
1921 none_test!(String);
1922 none_test!(Vec<u8>);
1923
1924 none_test!(());
1925 none_test!((u32, f32));
1926
1927 #[derive(Serialize)]
1928 struct Unit;
1929 none_test!(Unit);
1930
1931 #[derive(Serialize)]
1932 struct Newtype(u32);
1933 none_test!(Newtype);
1934
1935 #[derive(Serialize)]
1936 struct Tuple(u32, f32);
1937 none_test!(Tuple);
1938
1939 #[derive(Serialize)]
1940 struct Struct { field1: u32, field2: f32 };
1941 none_test!(Struct);
1942 }
1943
1944 #[test]
1946 fn test_some() {
1947 assert_eq!(to_vec(Some( 42u8 )), primitive_wrapped![0; 0x2A,0,0,0]);
1948 assert_eq!(to_vec(Some( 42u16)), primitive_wrapped![2; 0x2A,0,0,0]);
1949 assert_eq!(to_vec(Some( 42u32)), primitive_wrapped![4; 0x2A,0,0,0]);
1950 assert_eq!(to_vec(Some( 42u64)), complex_wrapped![6; 0x2A,0,0,0,0,0,0,0]);
1951
1952 assert_eq!(to_vec(Some(-42i8 )), primitive_wrapped![1; 0xD6,0,0,0]);
1953 assert_eq!(to_vec(Some(-42i16)), primitive_wrapped![3; 0xD6,0xFF,0,0]);
1954 assert_eq!(to_vec(Some(-42i32)), primitive_wrapped![5; 0xD6,0xFF,0xFF,0xFF]);
1955 assert_eq!(to_vec(Some(-42i64)), complex_wrapped![7; 0xD6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]);
1956
1957 assert_eq!(to_vec(Some(42f32)), primitive_wrapped![8; 0,0,0x28,0x42]);
1958 assert_eq!(to_vec(Some(42f64)), complex_wrapped![9; 0,0,0,0,0,0,0x45,0x40]);
1959
1960 assert_eq!(to_vec(Some(true )), primitive_wrapped![0; 1,0,0,0]);
1961 assert_eq!(to_vec(Some(false)), primitive_wrapped![0; 0,0,0,0]);
1962
1963 assert_eq!(to_vec(Some("string")), complex_wrapped![10; 6,0,0,0, b's',b't',b'r',b'i',b'n',b'g']);
1964 assert_eq!(to_vec(Some(Bytes::new(b"bytes"))), complex_wrapped![13; 5,0,0,0, b'b',b'y',b't',b'e',b's']);
1965 }
1966
1967 #[test]
1969 fn test_unit() {
1970 #[derive(Serialize)]
1971 struct Unit;
1972
1973 assert_eq!(to_vec(Unit), unit!());
1974 assert_eq!(to_vec(()), unit!());
1975 }
1976
1977 #[test]
1979 fn test_newtype() {
1980 macro_rules! newtype_test {
1989 ($type:ty = $value:expr) => ({
1990 #[derive(Serialize)]
1991 struct NewtypeX($type);
1992
1993 let wrapped = NewtypeX($value);
1994 let clear = $value;
1995
1996 assert_eq!(to_vec(wrapped), to_vec(clear));
1997 });
1998 }
1999
2000 newtype_test!(u8 = 42u8);
2001 newtype_test!(u16 = 42u16);
2002 newtype_test!(u32 = 42u32);
2003 newtype_test!(u64 = 42u64);
2004
2005 newtype_test!(i8 = -42i8);
2006 newtype_test!(i16 = -42i16);
2007 newtype_test!(i32 = -42i32);
2008 newtype_test!(i64 = -42i64);
2009
2010 newtype_test!(f32 = 42f32);
2011 newtype_test!(f64 = 42f64);
2012
2013 newtype_test!(bool = true);
2014 newtype_test!(bool = false);
2015
2016 newtype_test!(String = String::from("some string"));
2017 newtype_test!(ByteBuf = ByteBuf::from(b"some vector".to_vec()));
2018
2019 newtype_test!(() = ());
2020
2021 #[derive(Serialize, Clone, Copy)]
2022 struct Item1 { payload: u32 };
2023 #[derive(Serialize, Clone, Copy)]
2024 struct Item2 { value: u64 };
2025
2026 let item1 = Item1 { payload: 123456789 };
2027 let item2 = Item2 { value: 0xDEAD_BEAF_00FF_FF00 };
2028
2029 newtype_test!((Item1, Item2) = (item1, item2));
2030
2031 #[derive(Serialize)]
2032 struct Unit;
2033 newtype_test!(Unit = Unit);
2034
2035 #[derive(Serialize)]
2036 struct Newtype(Item1);
2037 newtype_test!(Newtype = Newtype(item1));
2038
2039 #[derive(Serialize)]
2040 struct Tuple(Item1, Item2);
2041 newtype_test!(Tuple = Tuple(item1, item2));
2042
2043 #[derive(Serialize)]
2044 struct Struct { field1: u32, field2: f32 };
2045 newtype_test!(Struct = Struct { field1: 42, field2: 42.0 });
2046 }
2047
2048 #[test]
2052 fn test_struct() {
2053 #[derive(Serialize)]
2054 struct Nested {
2055 field1: String,
2056 field2: String,
2057 }
2058 #[derive(Serialize)]
2059 struct Struct {
2060 field1: String,
2061 field2: Nested,
2062 field3: String,
2063 }
2064
2065 let test = Struct {
2066 field1: "value 1".into(),
2067 field2: Nested {
2068 field1: "value 2".into(),
2069 field2: "value 3".into(),
2070 },
2071 field3: "value 4".into(),
2072 };
2073 let expected = vec![
2074 b'G',b'F',b'F',b' ',b'V',b'3',b'.',b'2',56,0,0,0, 2,0,0,0,80,0,0,0, 5,0,0,0,140,0,0,0, 3,0,0,0,188,0,0,0, 44,0,0,0,232,0,0,0, 20,0,0,0,252,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 3,0,0,0,0,0,0,0, 12,0,0,0, 2,0,0,0,10,0,0,0, 0,0,0,0, 0,0,0,0,14,0,0,0, 1,0,0,0, 1,0,0,0,10,0,0,0, 0,0,0,0, 11,0,0,0,10,0,0,0, 1,0,0,0, 22,0,0,0,10,0,0,0, 2,0,0,0, 33,0,0,0,b'f',b'i',b'e',b'l',b'd',b'1',0,0,0,0,0,0,0,0,0,0,b'f',b'i',b'e',b'l',b'd',b'2',0,0,0,0,0,0,0,0,0,0,b'f',b'i',b'e',b'l',b'd',b'3',0,0,0,0,0,0,0,0,0,0,7,0,0,0, b'v',b'a',b'l',b'u',b'e',b' ',b'1',
2105 7,0,0,0, b'v',b'a',b'l',b'u',b'e',b' ',b'2',
2106 7,0,0,0, b'v',b'a',b'l',b'u',b'e',b' ',b'3',
2107 7,0,0,0, b'v',b'a',b'l',b'u',b'e',b' ',b'4',
2108
2109 0,0,0,0, 1,0,0,0, 4,0,0,0,2,0,0,0, 3,0,0,0, ];
2113 assert_eq!(to_vec_((*b"GFF ").into(), &test).expect("Serialization fail"), expected);
2114 }
2115
2116 #[test]
2118 fn test_tuple_with_non_struct_item() {
2119 #[derive(Serialize, Clone, Copy)]
2120 struct Item { value: u32 }
2121 #[derive(Serialize)]
2122 struct Tuple1(u32, f32);
2123 #[derive(Serialize)]
2124 struct Tuple2(Item, f32);
2125
2126 let item = Item { value: 42 };
2127
2128 assert!(is_err((42u32, 42f32)));
2129 assert!(is_err((item, 42f32)));
2130 assert!(is_err(Tuple1(42, 42.0)));
2131 assert!(is_err(Tuple2(item, 42.0)));
2132 }
2133
2134 #[test]
2136 fn test_tuple_with_struct_item() {
2137 #[derive(Serialize, Clone, Copy)]
2138 struct Item1 { value: u32 }
2139 #[derive(Serialize, Clone, Copy)]
2140 struct Item2 { value: f32 }
2141 #[derive(Serialize)]
2142 struct Tuple(Item1, Item2);
2143
2144 let item1 = Item1 { value: 42 };
2145 let item2 = Item2 { value: 42.0 };
2146
2147 let expected = list_wrapped![
2148 4; 42,0,0,0;
2149 8; 0,0,0x28,0x42;
2150 ];
2151 assert_eq!(to_vec((item1, item2)), expected);
2152 assert_eq!(to_vec(Tuple(item1, item2)), expected);
2153 }
2154
2155 #[test]
2157 fn test_list_with_non_struct_item() {
2158 let array = [
2159 41u8,
2160 42u8,
2161 43u8,
2162 ];
2163 let owned = array.to_vec();
2164
2165 assert!(is_err(owned));
2166 assert!(is_err(&array[..]));
2167 assert!(is_err(array));
2168 }
2169
2170 #[test]
2172 fn test_list_with_struct_item() {
2173 #[derive(Serialize, Copy, Clone)]
2174 struct Item { value: u8 }
2175
2176 let array = [
2177 Item { value: 41 },
2178 Item { value: 42 },
2179 Item { value: 43 },
2180 ];
2181 let owned = array.to_vec();
2182
2183 let expected = list_wrapped![
2184 0; 41,0,0,0;
2185 0; 42,0,0,0;
2186 0; 43,0,0,0;
2187 ];
2188
2189 assert_eq!(to_vec(owned), expected);
2190 assert_eq!(to_vec(&array[..]), expected);
2191 assert_eq!(to_vec(array), expected);
2192 }
2193 #[test]
2196 fn test_multilist_with_struct_item() {
2197 #[derive(Serialize)]
2198 struct Item;
2199
2200 #[derive(Serialize)]
2201 struct List {
2202 list1: Vec<Item>,
2203 list2: Vec<Item>,
2204 }
2205
2206 let list = List {
2207 list1: vec![Item, Item, Item],
2208 list2: vec![Item, Item],
2209 };
2210
2211 let expected = vec![
2212 b'G',b'F',b'F',b' ',
2213 b'V',b'3',b'.',b'2',
2214 56,0,0,0, 6,0,0,0,128,0,0,0, 2,0,0,0,152,0,0,0, 2,0,0,0,184,0,0,0, 0,0,0,0,184,0,0,0, 8,0,0,0,192,0,0,0, 28,0,0,0,0,0,0,0, 0,0,0,0, 2,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,15,0,0,0, 0,0,0,0, 0,0,0,0,15,0,0,0, 1,0,0,0, 16,0,0,0,b'l',b'i',b's',b't',b'1',0,0,0,0,0,0,0,0,0,0,0,b'l',b'i',b's',b't',b'2',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,3,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0,2,0,0,0, 4,0,0,0, 5,0,0,0 ];
2249 assert_eq!(to_vec_((*b"GFF ").into(), &list).expect("Serialization fail"), expected);
2250 }
2251 #[test]
2253 fn test_nested_list_with_struct_item() {
2254 #[derive(Serialize)]
2255 struct Item {
2256 list: Vec<()>,
2257 }
2258
2259 #[derive(Serialize)]
2260 struct List {
2261 list: Vec<Item>,
2262 }
2263
2264 let list = List {
2265 list: vec![
2266 Item { list: vec![] },
2267 Item { list: vec![(), ()] },
2268 Item { list: vec![] },
2269 ],
2270 };
2271
2272 let expected = vec![
2273 b'G',b'F',b'F',b' ',
2274 b'V',b'3',b'.',b'2',
2275 56,0,0,0, 6,0,0,0,128,0,0,0, 4,0,0,0,176,0,0,0, 1,0,0,0,192,0,0,0, 0,0,0,0,192,0,0,0, 0,0,0,0,192,0,0,0, 36,0,0,0,0,0,0,0, 0,0,0,0, 1,0,0,0,0,0,0,0, 1,0,0,0, 1,0,0,0,0,0,0,0, 2,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0, 3,0,0,0, 1,0,0,0,15,0,0,0, 0,0,0,0, 0,0,0,0,15,0,0,0, 0,0,0,0, 16,0,0,0,15,0,0,0, 0,0,0,0, 20,0,0,0,15,0,0,0, 0,0,0,0, 32,0,0,0,b'l',b'i',b's',b't',0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, 1,0,0,0, 2,0,0,0, 5,0,0,0,0,0,0,0, 2,0,0,0, 3,0,0,0, 4,0,0,0, 0,0,0,0, ];
2312 assert_eq!(to_vec_((*b"GFF ").into(), &list).expect("Serialization fail"), expected);
2313 }
2314 map_tests!();
2315 enum_tests!(as_field);
2316 }
2317}