Skip to main content

serde_gff/ser/
mod.rs

1//! Сериализатор для формата Bioware GFF (Generic File Format)
2
3use 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/// Вспомогательная структура, описывающая индекс структуры, для типобезопасности
20#[derive(Debug, Copy, Clone)]
21struct StructIndex(usize);
22
23/// Вспомогательная структура, описывающая индекс списка полей структуры, для типобезопасности.
24/// Любая GFF структура, имеющая более двух полей, ссылается по такому индексу на список с
25/// перечислением имеющихся у нее полей
26#[derive(Debug, Copy, Clone)]
27struct FieldListIndex(usize);
28
29/// Вспомогательная структура, описывающая индекс списка элементов GFF списка, для типобезопасности
30#[derive(Debug, Copy, Clone)]
31struct ListIndex(usize);
32
33/// Промежуточное представление сериализуемых структур. Содержит данные, которые после
34/// небольшого преобразования, возможного только после окончания сериализации, могут
35/// быть записаны в файл
36#[derive(Debug)]
37enum Struct {
38  /// Структура без полей
39  NoFields,
40  /// Структура, состоящая только из одного поля, содержит индекс этого поля
41  OneField(usize),
42  /// Структура, состоящая из двух и более полей. Содержит индекс списка и количество полей
43  MultiField { list: FieldListIndex, fields: u32 }
44}
45impl Struct {
46  /// Преобразует промежуточное представление в окончательное, которое может быть записано в файл
47  #[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/// Промежуточное представление сериализуемого поля структуры. Содержит данные, которые после
60/// небольшого преобразования, возможного только после окончания сериализации, могут
61/// быть записаны в файл
62#[derive(Debug)]
63enum Field {
64  /// Поле, представленное значением без внутренней структуры. Содержит метку поля и его значение
65  Simple { label: LabelIndex, value: SimpleValueRef },
66  /// Поле, представленное значением с внутренней структурой. Содержит метку поля и индекс
67  /// промежуточного представления структуры в массиве [`structs`](struct.Serializer.html#field.structs)
68  Struct { label: LabelIndex, struct_: StructIndex },
69  /// Поле, представленное списком значений. Содержит метку поля и индекс списка в массиве
70  /// [`list_indices`](struct.Serializer.html#field.list_indices)
71  List   { label: LabelIndex, list: ListIndex },
72}
73impl Field {
74  /// Преобразует промежуточное представление в окончательное, которое может быть записано в файл
75  #[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  /// Конвертирует возможно ссылочное значение в структуру, которая может быть записана в файл
99  ///
100  /// # Параметры
101  /// - `label`: индекс метки для поля
102  #[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/// Структура для сериализации значения Rust в Bioware GFF.
131///
132/// Формат поддерживает непосредственную сериализацию только структур, перечислений и отображений.
133/// Остальные значения необходимо обернуть в одну из этих структур данных для возможности их
134/// сериализации.
135#[derive(Default, Debug)]
136pub struct Serializer {
137  /// Массив, содержащий описания структур в файле
138  structs: Vec<Struct>,
139  /// Массив, содержащий описания полей структур в файле
140  fields: Vec<Field>,
141  /// Множество, содержащие названия всех полей всех структур файла в порядке их добавления
142  labels: IndexSet<Label>,
143  /// Массив, содержащий данные комплексных полей
144  field_data: Vec<u8>,
145  /// Массив списков с индексами полей структур. Каждый элемент массива описывает набор
146  /// полей одной структуры, которая содержит более одного поля
147  field_indices: Vec<Vec<u32>>,
148  /// Массив списков с индексами структур, содержащихся в каждом списке. Каждый элемент
149  /// массива описывает набор структур, содержащихся в списке. Общее количество полей-списков
150  /// равно размеру массива.
151  list_indices: Vec<Vec<u32>>,
152}
153
154impl Serializer {
155  /// Добавляет в список известных названий полей для сериализации указанное и возвращает
156  /// его индекс в этом списке. Если такое поле уже имеется в индексе, не добавляет его
157  /// повторно.
158  ///
159  /// В случае, если метка содержит более 16 байт в UTF-8 представлении, метод завершается
160  /// с ошибкой.
161  fn add_label(&mut self, label: &str) -> Result<LabelIndex> {
162    let label = label.parse()?;
163    self.labels.insert(label);
164    // Мы только что вставили значение, ошибка может быть только в случае переполнения, что вряд ли случится
165    let (index, _) = self.labels.get_full(&label).unwrap();
166    Ok(LabelIndex(index as u32))
167  }
168  /// Добавляет в список структур новую структуру с указанным количеством полей.
169  /// Корректная ссылка на данные еще не заполнена, ее нужно будет скорректировать
170  /// после того, как содержимое структуры будет записано
171  ///
172  /// # Параметры
173  /// - `fields`: Количество полей в структуре
174  ///
175  /// Возвращает пару индексов: добавленной структуры и списка с полями структуры,
176  /// если полей несколько
177  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      // Для структуры с одним полем записываем placeholder, он будет перезаписан после записи поля
184      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  /// Добавляет в список списков индексов с элементами новый элемент на указанное
193  /// количество элементов и заполняет тип поля.
194  ///
195  /// # Параметры
196  /// - `field_index`: индекс поля, которому нужно обновить тип
197  /// - `len`: длина списка элементов, хранящемся в этом поле
198  ///
199  /// Возвращает индекс списка, в который нужно добавлять элементы в процессе их сериализации
200  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    // Обновляем ссылки из записи о структуре
208    if let Struct::OneField(ref mut index) = self.structs[struct_index.0] {
209      *index = self.fields.len();
210    }
211    // Добавляем запись о метке
212    let label = self.add_label(variant)?;
213    // Добавляем список элементов указанной длины
214    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    // Обновляем ссылки из записи о структуре
219    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    // Добавляем запись о метке
226    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  /// Создает заголовок файла на основе его содержания
232  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        // Версия, сигнатура и 6 секций
240        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      /// Создает секцию, подсчитывая количество байт во всех списках массива `vec`
249      #[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)// Количество в данной секции задается в байтах, а не элементах
253      }
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)// Количество в данной секции задается в байтах, а не элементах
258      }
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),// 3 * u32
266      fields:        builder.add_section(self.fields.len(),  3 * 4),// 3 * u32
267      labels:        builder.add_section(self.labels.len(), 16 * 1),// 16 * u8
268      field_data:    builder.add_section(self.field_data.len(), 1), // 1 * u8
269      field_indices: builder.fields(&self.field_indices),
270      list_indices:  builder.lists(&self.list_indices),
271    }
272  }
273  /// Записывает в поток все собранные данные
274  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  /// Записывает в поток информацию о структурах файла
291  #[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  /// Записывает в поток информацию о полях файла
300  #[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  /// Записывает в поток информацию о метках файла
309  #[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  /// Записывает в поток информацию об индексах файла
317  #[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  /// Вычисляет смещения, на которые нужно заменить индексы в структурах для ссылки на списки их полей
325  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  /// Вычисляет смещения, на которые нужно заменить индексы, хранимые в поле с типом List
335  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      // +1 для длины списка
341      last_offset += (elements.len() + 1) * 4;
342    }
343    offsets
344  }
345}
346
347/// Сериализует значение в произвольный поток. Значение должно являться Rust структурой или перечислением
348#[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/// Сериализует значение в массив. Значение должно являться Rust структурой или перечислением
358#[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
367/// Реализует метод, возвращающий ошибку при попытке сериализовать значение, с описанием
368/// причины, что GFF не поддерживает данный тип на верхнем уровне и требуется обернуть его
369/// в структуру
370macro_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  //-----------------------------------------------------------------------------------------------
423  // Сериализация структурных элементов
424  //-----------------------------------------------------------------------------------------------
425  #[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  //-----------------------------------------------------------------------------------------------
456  // Сериализация последовательностей и отображений
457  //-----------------------------------------------------------------------------------------------
458  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  //-----------------------------------------------------------------------------------------------
464  // Сериализация компонентов перечисления
465  //-----------------------------------------------------------------------------------------------
466  /// Всегда возвращает ошибку сериализации `Error::Serialize`, т.к. unit-варианты перечисления
467  /// должны сериализоваться, как строки `variant`, а сериализация строк на верхнем уровне невозможна
468  #[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  /// Сериализует `value` как структуру с одним полем с именем `variant` и значением `value`
476  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    // Добавляем запись о структуре с одним полем
486    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    // Добавляем запись о структуре с одним полем
492    let (struct_index, _) = self.add_struct(1);
493    self.add_struct_variant(struct_index, variant, len)
494  }
495}
496
497/// Сериализатор, записывающий значение поля
498struct FieldSerializer<'a> {
499  /// Хранилище записываемых данных
500  ser: &'a mut Serializer,
501  /// Номер метки, ассоциированной с сериализуемым полем
502  label: LabelIndex,
503}
504impl<'a> FieldSerializer<'a> {
505  /// Добавляет в список структур новую структуру с указанным количеством полей, а
506  /// в список полей -- новое поле типа "структура".
507  ///
508  /// Корректная ссылка на данные еще не заполнена, ее нужно будет скорректировать
509  /// после того, как содержимое структуры будет записано
510  ///
511  /// Возвращает пару индексов: добавленной структуры и списка с полями структуры,
512  /// если полей несколько
513  fn add_struct(&mut self, fields: usize) -> Result<(StructIndex, FieldListIndex)> {
514    // Добавляем запись о структуре
515    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}
524/// Записывает значения поля, чей размер не превышает 4 байта
525macro_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}
537/// Записывает значения поля, чей размер превышает 4 байта
538macro_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      // Записываем данные поля в сторонке
544      self.ser.field_data.$write_method::<LE>(v)?;
545
546      // Добавляем само поле
547      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      // Записываем данные поля в сторонке
559      self.ser.field_data.write_u32::<LE>(v.len() as u32)?;
560      self.ser.field_data.write_all(v.as_ref())?;
561
562      // Добавляем само поле
563      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  /// Формат не поддерживает сериализацию булевых значений, поэтому значение сериализуется,
596  /// как `u8`: `true` представляется в виде `1`, а `false` -- в виде `0`.
597  #[inline]
598  fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
599    self.serialize_u8(if v { 1 } else { 0 })
600  }
601  /// Формат не поддерживает сериализацию произвольных символов как отдельную сущность, поэтому
602  /// они сериализуются, как строка из одного символа
603  #[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  //-----------------------------------------------------------------------------------------------
623  // Сериализация структурных элементов
624  //-----------------------------------------------------------------------------------------------
625  #[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  //-----------------------------------------------------------------------------------------------
655  // Сериализация последовательностей и отображений
656  //-----------------------------------------------------------------------------------------------
657  #[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  //-----------------------------------------------------------------------------------------------
667  // Сериализация компонентов перечисления
668  //-----------------------------------------------------------------------------------------------
669  /// Сериализует вариант перечисления, как строку `variant`
670  #[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  /// Сериализует `value` как структуру с одним полем с именем `variant` и значением `value`
675  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    // Добавляем запись о структуре с одним полем
685    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    // Добавляем запись о структуре с одним полем
691    let (struct_index, _) = self.add_struct(1)?;
692    self.ser.add_struct_variant(struct_index, variant, len)
693  }
694}
695
696/// Сериализует все поля структуры, заполняя массив с индексами полей (если полей
697/// в структуре несколько) или обновляя индекс в структуре на поле, если поле одно.
698pub struct StructSerializer<'a> {
699  /// Хранилище записываемых данных
700  ser: &'a mut Serializer,
701  /// Номер структуры в массиве `ser.structs`, которую нужно обновить по завершении
702  /// сериализации структуры
703  struct_index: StructIndex,
704  /// Номер списка полей в массиве `ser.field_indices`, в который необходимо помещать
705  /// индексы полей по мере их сериализации
706  fields_index: FieldListIndex,
707}
708impl<'a> StructSerializer<'a> {
709  /// Сериализует значение, обновляя поле с указанным индексом
710  #[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    // Обновляем ссылки из записи о структуре
719    let struct_ = &mut self.ser.structs[self.struct_index.0];
720    match struct_ {
721      // Если полей нет, ничего делать не нужно
722      NoFields => {},
723      // Если поле одно, то структура хранит ссылку на само поле
724      OneField(ref mut idx) => *idx = index,
725      MultiField {..} => {
726        // Если полей несколько, то структура содержит ссылку на список с полями. Добавляем
727        // индекс этого поля в нее
728        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    // Добавляем запись о метке
744    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
765/// Сериализует все поля списка или кортежа, заполняя массив с индексами элементов списка
766pub struct ListSerializer<'a> {
767  /// Хранилище записываемых данных
768  ser: &'a mut Serializer,
769  /// Индекс в массиве `ser.list_indices`, определяющий заполняемый данным сериализатором
770  /// список с индексами структур, составляющих элементы списка.
771  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
836/// Структура, реализующая сериализацию ключа карты. Сериализация значений делегируется
837/// вложенному `StructSerializer`-у
838pub struct MapSerializer<'a> {
839  /// Хранилище записываемых данных
840  ser: StructSerializer<'a>,
841  /// Индекс поля в массиве `ser.fields`, которое будет отражать сериализованную запись
842  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    // Добавляем запись о метке
874    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  //-----------------------------------------------------------------------------------------------
885  // Сериализация структурных элементов
886  //-----------------------------------------------------------------------------------------------
887  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  //-----------------------------------------------------------------------------------------------
899  // Сериализация последовательностей и отображений
900  //-----------------------------------------------------------------------------------------------
901  unsupported!(serialize_seq(Option<usize>) -> Self::SerializeSeq);
902  unsupported!(serialize_map(Option<usize>) -> Self::SerializeMap);
903  //-----------------------------------------------------------------------------------------------
904  // Сериализация компонентов перечисления
905  //-----------------------------------------------------------------------------------------------
906  #[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  /// Формирует байтовый массив, соответствующий сериализованной структуре с одним полем
951  /// `value` заданного типа, который хранится в записи о самом поле.
952  macro_rules! primitive_wrapped {
953    ($type:expr; $b1:expr, $b2:expr, $b3:expr, $b4:expr) => (
954      vec![
955        // Заголовок
956        b'G',b'F',b'F',b' ',// Тип файла
957        b'V',b'3',b'.',b'2',// Версия
958        56,0,0,0,   1,0,0,0,// Начальное смещение и количество структур
959        68,0,0,0,   1,0,0,0,// Начальное смещение и количество полей (1 поле)
960        80,0,0,0,   1,0,0,0,// Начальное смещение и количество меток (1 метка)
961        96,0,0,0,   0,0,0,0,// Начальное смещение и количество байт данных (данных нет)
962        96,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках полей (списков нет)
963        96,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках структур (списков нет)
964
965        // Структуры
966        // тег     ссылка      кол-во
967        //        на данные    полей
968        0,0,0,0,   0,0,0,0,   1,0,0,0,// Структура 0 (тег 0, 1 поле)
969
970        // Поля
971        // тип          метка     значение
972        $type,0,0,0,   0,0,0,0,   $b1,$b2,$b3,$b4,// Поле 1 (ссылается на метку 1)
973
974        // Метки
975        b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,// Метка 1
976      ]
977    );
978  }
979
980  /// Заменяет дерево токенов указанный выражением
981  macro_rules! replace_expr {
982    ($_t:tt $sub:expr) => ($sub);
983  }
984
985  /// Подсчитывает количество деревьев токенов, переданных в макрос
986  macro_rules! len {
987    ($($tts:tt)*) => (
988      <[()]>::len(&[$(replace_expr!($tts ())),*])
989    );
990  }
991  /// Формирует байтовый массив, соответствующий сериализованной структуре с одним полем
992  /// `value` заданного типа, который хранится в записи о самом поле.
993  macro_rules! complex_wrapped {
994    ($type:expr; $($bytes:expr),*) => ({
995      let count = len!($($bytes)*) as u8;
996
997      vec![
998        // Заголовок
999        b'G',b'F',b'F',b' ',// Тип файла
1000        b'V',b'3',b'.',b'2',// Версия
1001        56,0,0,0,   1,0,0,0,// Начальное смещение и количество структур
1002        68,0,0,0,   1,0,0,0,// Начальное смещение и количество полей (1 поле)
1003        80,0,0,0,   1,0,0,0,// Начальное смещение и количество меток (1 метка)
1004        96,0,0,0,   count,0,0,0,// Начальное смещение и количество байт данных ($count байт данных)
1005        96 + count,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках полей (списков нет)
1006        96 + count,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках структур (списков нет)
1007
1008        // Структуры
1009        // тег     ссылка      кол-во
1010        //        на данные    полей
1011        0,0,0,0,   0,0,0,0,   1,0,0,0,// Структура 0 (тег 0, 1 поле)
1012
1013        // Поля
1014        // тип          метка     значение
1015        $type,0,0,0,   0,0,0,0,   0,0,0,0,// Поле 1 (ссылается на метку 1, и на данные с начала массива с данными)
1016
1017        // Метки
1018        b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,// Метка 1
1019
1020        // Данные
1021        $($bytes),*
1022      ]
1023    });
1024  }
1025  /// Формирует байтовый массив, соответствующий сериализованной структуре с одним полем
1026  /// `value` со списком элементов заданного типа, который хранится в записи о самом поле.
1027  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;// Номер поля структуры
1031      let mut j = 0u8;// Номер структуры в списке
1032      let len = (1 + len!($($type)*) as u8) * 4;
1033
1034      vec![
1035        // Заголовок
1036        b'G',b'F',b'F',b' ',// Тип файла
1037        b'V',b'3',b'.',b'2',// Версия
1038        56,0,0,0,   1 + cnt,0,0,0,// Начальное смещение и количество структур (cnt + 1 - корневая)
1039        68 + cnt*4*3  ,0,0,0,   1 + cnt,0,0,0,// Начальное смещение и количество полей (cnt + 1 поле - по одному на каждую структуру)
1040        80 + cnt*4*3*2,0,0,0,   1,0,0,0,// Начальное смещение и количество меток (1 метка - у всех структур поля называются одинаково)
1041        96 + cnt*4*3*2,0,0,0,   0,0,0,0,// Начальное смещение и количество байт данных (байт данных нет)
1042        96 + cnt*4*3*2,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках полей (списков нет)
1043        96 + cnt*4*3*2,0,0,0, len,0,0,0,// Начальное смещение и количество байт в списках структур (x списков)
1044
1045        // Структуры
1046        // тег     ссылка      кол-во
1047        //        на данные    полей
1048        0,0,0,0,   0,0,0,0,   1,0,0,0,// Структура 0 (тег 0, 1 поле)
1049        $(
1050          0,0,0,0,  replace_expr!($type {i+=1; i}),0,0,0,  1,0,0,0,// Структура i (тег 0, 1 поле)
1051        )*
1052
1053        // Поля
1054        // тип      метка     значение
1055        15,0,0,0,  0,0,0,0,   0,0,0,0,// Поле структуры 0 (ссылаются на метку 1 и список 1)
1056        $(
1057          $type,0,0,0,  0,0,0,0,  $b1,$b2,$b3,$b4,// Поля (ссылаются на метку 1)
1058        )*
1059
1060        // Метки
1061        b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,// Метка 1
1062
1063        // Ссылки на элементы списков
1064        cnt,0,0,0, $(replace_expr!($type {j+=1; j}),0,0,0,)*// Список 1
1065      ]
1066    });
1067  }
1068
1069  /// Создает отображение ключей на значения
1070  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      /// Тестирует запись отображения строк на значения
1091      #[test]
1092      fn test_map() {
1093        // Пустая карта аналогична пустой или Unit-структуре
1094        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        // Карта с полями аналогична структуре
1104        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        // карта с не строковыми ключами не может быть сериализована
1111        // TODO: Ослабить ограничение до типажа AsStr<str>
1112        let map = map![
1113          1u32 => 1u32,
1114          2u32 => 2u32,
1115        ];
1116        assert!(is_err(map));
1117      }
1118    );
1119  }
1120
1121  /// Создает тесты сериализации перечислений, для случаев, работающих одинаково на верхнем
1122  /// уровне, и как поле структуры
1123  macro_rules! enum_tests {
1124    ($mode:tt) => (
1125      #[derive(Serialize, Copy, Clone)]
1126      struct Value {
1127        value: u32,
1128      }
1129      /// Тестирует запись перечислений со значениями разных видов
1130      #[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        // Кортеж сериализуется, как последовательность, а последовательности должны
1176        // состоять из элементов-структур
1177        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      /// Тестирует запись перечислений со значениями разных видов при записи тега,
1189      /// определяющего вариант перечисления, в качестве одного из поля данных, на
1190      /// одном уровне с другими полями
1191      #[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          // serde не умеет сериализовать кортежи в данном режиме
1200          Struct { value: u32 },
1201        }
1202        /// Значение Unit перечисления должно сериализоваться также, как эта структура
1203        #[derive(Serialize)]
1204        struct Unit {
1205          tag: &'static str,
1206        }
1207        /// Значения Newtype2 и Struct перечисления должны сериализоваться также, как эта структура
1208        #[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        // serde умеет сериализовать только структуры и карты внутри newtype
1219        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      /// Тестирует запись перечислений со значениями разных видов
1232      #[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        /// Значение Unit перечисления должно сериализоваться также, как эта структура
1245        #[derive(Serialize)]
1246        struct Unit {
1247          tag: &'static str,
1248        }
1249        /// Значение Newtype1 перечисления должно сериализоваться также, как эта структура
1250        #[derive(Serialize)]
1251        struct Newtype {
1252          tag: &'static str,
1253          content: u32,
1254        }
1255        /// Значение Tuple2 перечисления должно сериализоваться также, как эта структура
1256        #[derive(Serialize)]
1257        struct Tuple {
1258          tag: &'static str,
1259          content: (Value, Value),
1260        }
1261        /// Значения Struct и Newtype2 перечисления должны сериализоваться также, как эта структура
1262        #[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        // GFF умеет сериализовать только структуры в кортежах,
1283        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      /// Тестирует запись перечислений со значениями разных видов при из записи без тега
1296      #[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        /// Значения Newtype2 и Struct перечисления должны сериализоваться также, как эта структура
1309        #[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        // GFF умеет сериализовать только структуры в кортежах,
1322        // кроме того, сериализация кортежа на верхнем уровне невозможна
1323        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      // Сериализация unit-варианта на верхнем уровне невозможна
1336      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      // GFF умеет сериализовать только структуры на верхнем уровне
1347      let n = E::Newtype1(1);
1348      assert!(is_err(n));
1349
1350      // Сериализация кортежа на верхнем уровне невозможна
1351      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    //! Тестирует сериализацию различных значений, когда они не включены ни в какую структуру
1366    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    /// Формирует байтовый массив, соответствующий сериализованной структуре без полей
1391    macro_rules! unit {
1392      () => (
1393        vec![
1394          // Заголовок
1395          b'G',b'F',b'F',b' ',// Тип файла
1396          b'V',b'3',b'.',b'2',// Версия
1397          56,0,0,0,   1,0,0,0,// Начальное смещение и количество структур
1398          68,0,0,0,   0,0,0,0,// Начальное смещение и количество полей (полей нет)
1399          68,0,0,0,   0,0,0,0,// Начальное смещение и количество меток (меток нет)
1400          68,0,0,0,   0,0,0,0,// Начальное смещение и количество байт данных (данных нет)
1401          68,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках полей (списков нет)
1402          68,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках структур (списков нет)
1403
1404          // Структуры
1405          // тег      ссылка      кол-во
1406          //         на данные    полей
1407          0,0,0,0,   0,0,0,0,   0,0,0,0,// Структура 0 (0 полей)
1408        ]
1409      );
1410    }
1411
1412    /// Тестирует запись простых числовых значений, которые хранятся в файле в разделе полей рядом с типом поля
1413    #[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    /// Тестирует запись комплексных числовых значений, которых хранятся в файле отдельно от описания самого поля
1429    #[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    /// Тестирует запись булевых значений, которые не поддерживаются форматом нативно
1440    #[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    /// Тестирует запись булевых значений, которые не поддерживаются форматом нативно
1446    #[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    /// Тестирует запись строковых срезов
1453    #[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    /// Тестирует запись строк
1459    #[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    /// Тестирует запись байтовых срезов
1466    #[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    /// Тестирует запись байтовых массивов
1474    #[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    /// Тестирует запись отсутствующего опционального значения
1483    #[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    /// Тестирует запись опционального значения
1528    #[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    /// Тестирует запись структур без полей
1551    #[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    /// Тестирует запись значения, обернутого в новый тип
1561    #[test]
1562    fn test_newtype() {
1563      /// Первая форма тестирует, что указанный в параметре тип не сериализуется,
1564      /// инициализируя сериализуемое значение значением по умолчанию его типа.
1565      ///
1566      /// Вторая форма делает то же самое, но инициализатор передается явно
1567      ///
1568      /// Третья форма проверяет, что результат сериализуется без ошибок и результат
1569      /// сериализации обернутого в новый тип выражения равен такому же выражению, не
1570      /// обернутому в новый тип
1571      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    /// Тестирует запись структуры с более чем одним полем
1641    #[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        // Заголовок
1655         b'G',b'F',b'F',b' ',// Тип файла
1656         b'V',b'3',b'.',b'2',// Версия
1657         56,0,0,0,   1,0,0,0,// Начальное смещение и количество структур (1 - корневая)
1658         68,0,0,0,   2,0,0,0,// Начальное смещение и количество полей (2 поля)
1659         92,0,0,0,   2,0,0,0,// Начальное смещение и количество меток (2 метки)
1660        124,0,0,0,  26,0,0,0,// Начальное смещение и количество байт данных ((4+5) + (4+13) байт)
1661        150,0,0,0,   8,0,0,0,// Начальное смещение и количество байт в списках полей (2*4 байт - 1 список с 2 полями)
1662        158,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках структур (списков нет)
1663
1664        // Структуры
1665        // тег       ссылка      кол-во
1666        //          на данные    полей
1667          0,0,0,0,   0,0,0,0,   2,0,0,0,// Структура 0 (тег 0, 2 поля)
1668
1669        // Поля
1670        // тип        метка     значение
1671        10,0,0,0,   0,0,0,0,   0,0,0,0,// Поле 1 (String) структуры 0 (ссылается на метку 1)
1672        10,0,0,0,   1,0,0,0,   9,0,0,0,// Поле 2 (String) структуры 0 (ссылается на метку 2)
1673
1674        // Метки
1675        b'f',b'i',b'e',b'l',b'd',b'1',0,0,0,0,0,0,0,0,0,0,// Метка 1
1676        b'f',b'i',b'e',b'l',b'd',b'2',0,0,0,0,0,0,0,0,0,0,// Метка 2
1677
1678        // Данные
1679          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        // Списки полей структур
1683          0,0,0,0, 1,0,0,0,// Список 1, поля 1 и 2
1684      ];
1685      assert_eq!(to_vec(test), expected);
1686    }
1687
1688    /// Тестирует запись кортежа из значений разных типов, не все из которых являются структурами
1689    #[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    /// Тестирует запись кортежа из значений структур разных типов
1707    #[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    /// Тестирует запись списков с элементом не структурой. Запись таких списков невозможна
1724    #[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    /// Тестирует запись списков с элементом-структурой. Только такие списки могут быть записаны
1739    #[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    //! Тестирует сериализацию различных значений, когда они включены как поле в структуру
1763    use super::*;
1764    use crate::error::Result;
1765
1766    /// Сериализует значение, оборачивая его в структуру, т.к. формат не поддерживает на
1767    /// верхнем уровне ничего, кроме структур
1768    #[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    /// Сериализует значение, оборачивая его в структуру, т.к. формат не поддерживает на
1787    /// верхнем уровне ничего, кроме структур
1788    #[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    /// Формирует байтовый массив, соответствующий сериализованной структуре без полей
1796    /// внутри корневой структуры в поле `value`
1797    macro_rules! unit {
1798      () => (
1799        vec![
1800          // Заголовок
1801           b'G',b'F',b'F',b' ',// Тип файла
1802           b'V',b'3',b'.',b'2',// Версия
1803           56,0,0,0,   2,0,0,0,// Начальное смещение и количество структур (2 структуры - корневая и тестируемая)
1804           80,0,0,0,   1,0,0,0,// Начальное смещение и количество полей (1 поле корневой структуры)
1805           92,0,0,0,   1,0,0,0,// Начальное смещение и количество меток (1 метка для поля корневой структуры)
1806          108,0,0,0,   0,0,0,0,// Начальное смещение и количество байт данных (данных нет)
1807          108,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках полей (списков нет)
1808          108,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках структур (списков нет)
1809
1810          // Структуры
1811          // тег      ссылка      кол-во
1812          //         на данные    полей
1813          0,0,0,0,   0,0,0,0,   1,0,0,0,// Структура 0 (1 поле)
1814          0,0,0,0,   0,0,0,0,   0,0,0,0,// Структура 1 (полей нет)
1815
1816          // Поля
1817          // тип      метка     значение
1818          14,0,0,0,  0,0,0,0,   1,0,0,0,// Поле структуры 0 (ссылаются на метку 1 и структуру 1)
1819
1820          // Метки
1821          b'v',b'a',b'l',b'u',b'e',0,0,0,0,0,0,0,0,0,0,0,// Метка 1
1822        ]
1823      );
1824    }
1825
1826    /// Тестирует запись простых числовых значений, которые хранятся в файле в разделе полей рядом с типом поля
1827    #[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    /// Тестирует запись комплексных числовых значений, которых хранятся в файле отдельно от описания самого поля
1843    #[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    /// Тестирует запись булевых значений, которые не поддерживаются форматом нативно
1854    #[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    /// Тестирует запись строковых срезов и строк
1861    #[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    /// Тестирует запись байтовых срезов и байтовых массивов
1870    #[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    /// Тестирует запись отсутствующего опционального значения
1900    #[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    /// Тестирует запись присутствующего опционального значения
1945    #[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    /// Тестирует запись структур без полей
1968    #[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    /// Тестирует запись значения, обернутого в новый тип
1978    #[test]
1979    fn test_newtype() {
1980      /// Первая форма тестирует, что указанный в параметре тип не сериализуется,
1981      /// инициализируя сериализуемое значение значением по умолчанию его типа.
1982      ///
1983      /// Вторая форма делает то же самое, но инициализатор передается явно
1984      ///
1985      /// Третья форма проверяет, что результат сериализуется без ошибок и результат
1986      /// сериализации обернутого в новый тип выражения равен такому же выражению, не
1987      /// обернутому в новый тип
1988      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    /// Тестирует запись структуры с более чем одним полем - в структурах должны быть байтовые
2049    /// смещения на списке полей, а не индексы (хотя размер элементов известен и индексы были бы
2050    /// логичнее)
2051    #[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        // Заголовок
2075         b'G',b'F',b'F',b' ',// Тип файла
2076         b'V',b'3',b'.',b'2',// Версия
2077         56,0,0,0,   2,0,0,0,// Начальное смещение и количество структур (2 структуры - Struct + Nested)
2078         80,0,0,0,   5,0,0,0,// Начальное смещение и количество полей (5 полей)
2079        140,0,0,0,   3,0,0,0,// Начальное смещение и количество меток (3 метки)
2080        188,0,0,0,  44,0,0,0,// Начальное смещение и количество байт данных ((4+7)*4 байт)
2081        232,0,0,0,  20,0,0,0,// Начальное смещение и количество байт в списках полей (3*4 + 2*4 байт)
2082        252,0,0,0,   0,0,0,0,// Начальное смещение и количество байт в списках структур (списков нет)
2083
2084        // Структуры (2)
2085        // тег     ссылка      кол-во
2086        //        на данные    полей
2087        0,0,0,0,   0,0,0,0,   3,0,0,0,// Структура 0 (3 поля - смешение 0)
2088        0,0,0,0,  12,0,0,0,   2,0,0,0,// Структура 1 (2 поля - смещение 12 = 3*4)
2089
2090        // Поля (5)
2091        // тип        метка     значение
2092        10,0,0,0,  0,0,0,0,   0,0,0,0,// Struct.field1 (String) - метка 0, смещение данных 0
2093        14,0,0,0,  1,0,0,0,   1,0,0,0,// Struct.field2 (Nested) - метка 1, структура 1
2094        10,0,0,0,  0,0,0,0,  11,0,0,0,// Nested.field1 (String) - метка 0, смещение данных 11
2095        10,0,0,0,  1,0,0,0,  22,0,0,0,// Nested.field2 (String) - метка 1, смещение данных 22
2096        10,0,0,0,  2,0,0,0,  33,0,0,0,// Struct.field3 (Strung) - метка 2, смещение данных 33
2097
2098        // Метки (3)
2099        b'f',b'i',b'e',b'l',b'd',b'1',0,0,0,0,0,0,0,0,0,0,// Метка 1
2100        b'f',b'i',b'e',b'l',b'd',b'2',0,0,0,0,0,0,0,0,0,0,// Метка 2
2101        b'f',b'i',b'e',b'l',b'd',b'3',0,0,0,0,0,0,0,0,0,0,// Метка 3
2102
2103        // Данные (44 байта)
2104         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        // Списки полей структур (20 байт)
2110        0,0,0,0,   1,0,0,0,   4,0,0,0,// Список 1 (для Struct), поля 0, 1 и 4
2111        2,0,0,0,   3,0,0,0,           // Список 2 (для Nested), поля 2 и 3
2112      ];
2113      assert_eq!(to_vec_((*b"GFF ").into(), &test).expect("Serialization fail"), expected);
2114    }
2115
2116    /// Тестирует запись кортежа из значений разных типов, не все из которых являются структурами
2117    #[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    /// Тестирует запись кортежа из значений структур разных типов
2135    #[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    /// Тестирует запись списков с элементом не структурой. Запись таких списков невозможна
2156    #[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    /// Тестирует запись списков с элементом-структурой. Только такие списки могут быть записаны
2171    #[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    /// Тестирует, что ссылки на списки элементов идут по байтовым смещениям, а не по индексам
2194    /// элементов в списке
2195    #[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,// 6 структур - List + 5*Item
2215        128,0,0,0,   2,0,0,0,// 2 поля - list1, list2
2216        152,0,0,0,   2,0,0,0,// 2 метки - list1, list2
2217        184,0,0,0,   0,0,0,0,// Байт данных нет
2218        184,0,0,0,   8,0,0,0,// 8 = 2*4 байт в списках индексов полей структур для структуры List с 2 полями
2219        192,0,0,0,  28,0,0,0,// 28 = (3+1 + 2+1)*4 байт в списках индексов элементов списков
2220
2221        // Структуры (6)
2222        // тег       ссылка      кол-во
2223        //          на данные    полей
2224          0,0,0,0,   0,0,0,0,   2,0,0,0,// List - 2 поля
2225          0,0,0,0,   0,0,0,0,   0,0,0,0,// Item 0 - 0 полей
2226          0,0,0,0,   0,0,0,0,   0,0,0,0,// Item 1 - 0 полей
2227          0,0,0,0,   0,0,0,0,   0,0,0,0,// Item 2 - 0 полей
2228          0,0,0,0,   0,0,0,0,   0,0,0,0,// Item 3 - 0 полей
2229          0,0,0,0,   0,0,0,0,   0,0,0,0,// Item 4 - 0 полей
2230
2231        // Поля (2)
2232        // тип        метка     значение
2233         15,0,0,0,   0,0,0,0,   0,0,0,0,// list1 - смещение 0
2234         15,0,0,0,   1,0,0,0,  16,0,0,0,// list2 - смещение 16 = (3+1)*4
2235
2236        // Метки (2)
2237         b'l',b'i',b's',b't',b'1',0,0,0,0,0,0,0,0,0,0,0,// list1
2238         b'l',b'i',b's',b't',b'2',0,0,0,0,0,0,0,0,0,0,0,// list2
2239
2240        // Данных нет
2241
2242        // Списки полей структур (8 байт)
2243          0,0,0,0,   1,0,0,0,// Список 1 (для List) - поля 0 и 1
2244
2245        // Списки элементов в списках (28 байт)
2246          3,0,0,0,   1,0,0,0,   2,0,0,0,   3,0,0,0,// Список 1 (3 элемента) - структуры 1, 2, 3
2247          2,0,0,0,   4,0,0,0,   5,0,0,0            // Список 2 (2 элемента) - структуры 4, 5
2248      ];
2249      assert_eq!(to_vec_((*b"GFF ").into(), &list).expect("Serialization fail"), expected);
2250    }
2251    /// Тестирует, что ссылки на списки элементов корректны при наличии вложенных списков
2252    #[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,// 6 структур - List + 3*Item + 2*()
2276        128,0,0,0,   4,0,0,0,// 4 поля - list в 4-х структурах
2277        176,0,0,0,   1,0,0,0,// 1 метка - list1, list2
2278        192,0,0,0,   0,0,0,0,// Байт данных нет
2279        192,0,0,0,   0,0,0,0,// Списков полей нет - Все структуры с одним полем
2280        192,0,0,0,  36,0,0,0,// 36 = (3+1 + 0+1 + 2+1 + 0+1)*4 байт в списках индексов элементов списков
2281
2282        // Структуры (6)
2283        // тег       ссылка      кол-во
2284        //          на данные    полей
2285          0,0,0,0,   0,0,0,0,   1,0,0,0,// List - 1 поле
2286          0,0,0,0,   1,0,0,0,   1,0,0,0,// Item 0 (поле 1) - 0 полей
2287          0,0,0,0,   2,0,0,0,   1,0,0,0,// Item 1 (поле 2) - 0 полей
2288          0,0,0,0,   0,0,0,0,   0,0,0,0,// () 0 - 0 полей
2289          0,0,0,0,   0,0,0,0,   0,0,0,0,// () 1 - 0 полей
2290          0,0,0,0,   3,0,0,0,   1,0,0,0,// Item 2 (поле 3) - 0 полей
2291
2292        // Поля (4)
2293        // тип        метка     значение
2294         15,0,0,0,   0,0,0,0,   0,0,0,0,// list (в List) - смещение 0
2295         15,0,0,0,   0,0,0,0,  16,0,0,0,// list (в Item 0) - смещение 16 = (3+1)*4
2296         15,0,0,0,   0,0,0,0,  20,0,0,0,// list (в Item 1) - смещение 20 = (3+1 + 0+1)*4
2297         15,0,0,0,   0,0,0,0,  32,0,0,0,// list (в Item 2) - смещение 32 = (3+1 + 0+1 + 2+1)*4
2298
2299        // Метки (1)
2300         b'l',b'i',b's',b't',0,0,0,0,0,0,0,0,0,0,0,0,// list
2301
2302        // Данных нет
2303
2304        // Списков полей структур нет
2305
2306        // Списки элементов в списках (36 байт)
2307          3,0,0,0,   1,0,0,0,   2,0,0,0,   5,0,0,0,// Список 1 (3 элемента) - структуры 1, 2, 5
2308          0,0,0,0,                                 // Список 2 (0 элементов)
2309          2,0,0,0,   3,0,0,0,   4,0,0,0,           // Список 3 (2 элемента) - структуры 3, 4
2310          0,0,0,0,                                 // Список 4 (0 элементов)
2311      ];
2312      assert_eq!(to_vec_((*b"GFF ").into(), &list).expect("Serialization fail"), expected);
2313    }
2314    map_tests!();
2315    enum_tests!(as_field);
2316  }
2317}