serde_gff/
lib.rs

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