1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//! Реализация парсера файлов формата Bioware GFF, используемых в играх на движке Aurora
//! (Neverwinter Nights, The Witcher) и в игре Neverwinter Nights 2.
//!
//! Формат имеет некоторые ограничения:
//! - элементами верхнего уровня могут быть только структуры или перечисления Rust в unit или struct варианте
//! - имена полей структур не должны быть длиннее 16 байт в UTF-8. При нарушении при сериализации будет ошибка
//! - то же самое касается ключей карт. Кроме того, ключами могут быть только строки (`&str` или `String`)
//!
//! # Пример
//! ```rust
//! use std::f32::consts::PI;
//! use std::f64::consts::E;
//! use std::io::Cursor;
//! use serde::{Serialize, Deserialize};
//!
//! use serde_gff::de::Deserializer;
//! use serde_gff::ser::to_vec;
//! use serde_gff::value::Value;
//!
//! #[derive(Debug, Serialize, Deserialize)]
//! struct Item { u8: u8, i8: i8 }
//!
//! #[derive(Debug, Serialize, Deserialize)]
//! struct Struct {
//!   f32: f32,
//!   f64: f64,
//!
//!   #[serde(with = "serde_bytes")]
//!   bytes: Vec<u8>,
//! }
//!
//! #[derive(Debug, Serialize, Deserialize)]
//! #[allow(non_snake_case)]
//! struct Test {
//!   u16: u16,
//!   i16: i16,
//!   u32: u32,
//!   i32: i32,
//!   u64: u64,
//!   i64: i64,
//!
//!   string: String,
//!
//!   Struct: Struct,
//!   list: Vec<Item>,
//! }
//!
//! fn main() {
//!   let data = Test {
//!     u16: 1, i16: 2,
//!     u32: 3, i32: 4,
//!     u64: 5, i64: 6,
//!
//!     string: "String".into(),
//!
//!     Struct: Struct { f32: PI, f64: E, bytes: b"Vec<u8>".to_vec() },
//!     list: vec![
//!       Item { u8: 7, i8:  -8 },
//!       Item { u8: 9, i8: -10 },
//!     ],
//!   };
//!
//!   let mut vec = to_vec((*b"GFF ").into(), &data).expect("can't write data");
//!   // Важный нюанс - не забыть, что создание десериализатора читает заголовок и возвращает
//!   // Result, а не сам десериализатор, поэтому требуется распаковка результата
//!   let mut de = Deserializer::new(Cursor::new(vec)).expect("can't read GFF header");
//!   let val = Value::deserialize(&mut de).expect("can't deserialize data");
//!
//!   println!("{:#?}", val);
//! }
//! ```
#![warn(missing_docs)]

// Модули описания заголовка
mod sig;
mod ver;
pub mod header;

pub mod parser;
pub mod index;
pub mod value;
pub mod error;
pub mod raw;

// Модули, чье содержимое реэкспортируется, разделено для удобства сопровождения
mod label;
mod resref;
mod string;

pub use crate::label::*;
pub use crate::resref::*;
pub use crate::string::*;

// Модули для поддержки инфраструктуры serde
pub mod de;
pub mod ser;