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 97 98 99 100 101 102 103 104 105 106 107 108 109 110
//! Реализация парсера файлов формата Bioware GFF, используемых в играх на движке Aurora
//! (Neverwinter Nights, The Witcher) и в игре Neverwinter Nights 2.
//!
//! Формат имеет некоторые ограничения:
//! - элементами верхнего уровня могут быть только структуры или перечисления Rust в unit или struct варианте
//! - имена полей структур не должны быть длиннее 16 байт в UTF-8. При нарушении при сериализации будет ошибка
//! - то же самое касается ключей карт. Кроме того, ключами могут быть только строки (`&str` или `String`)
//!
//! # Пример
//! ```rust
//! extern crate serde;
//! #[macro_use]
//! extern crate serde_derive;
//! extern crate serde_bytes;
//! extern crate serde_gff;
//!
//! use std::f32::consts::PI;
//! use std::f64::consts::E;
//! use std::io::Cursor;
//! use serde::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)]
extern crate byteorder;
extern crate encoding;
extern crate indexmap;
#[macro_use]
extern crate serde;
#[cfg(test)]
#[macro_use]
extern crate serde_derive;
// Модули описания заголовка
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 label::*;
pub use resref::*;
pub use string::*;
// Модули для поддержки инфраструктуры serde
pub mod de;
pub mod ser;