Generic File Format (GFF) -- формат файлов, используемый играми на движке Bioware Aurora: Newerwinter Nights, The Witcher и Newerwinter Nights 2.
Формат имеет некоторые ограничения:
- элементами верхнего уровня могут быть только структуры или перечисления Rust в unit или struct варианте
- имена полей структур не должны быть длиннее 16 байт в UTF-8. При нарушении при сериализации будет ошибка
- то же самое касается ключей карт. Кроме того, ключами могут быть только строки (&str
или String
)
Выполните в корне проекта
sh
cargo add serde_gff
или добавьте следующую строку в Cargo.toml
:
toml
[dependencies]
serde_gff = "0.2"
```rust extern crate serde;
extern crate serdederive; extern crate serdebytes; extern crate serde_gff;
use std::f32::consts::PI; use std::f64::consts::E; use std::io::Cursor; use serde::Deserialize;
use serdegff::de::Deserializer; use serdegff::ser::tovec; use serdegff::value::Value;
struct Item { u8: u8, i8: i8 }
struct Struct { f32: f32, f64: f64,
#[serde(with = "serde_bytes")]
bytes: Vec
struct Test { u16: u16, i16: i16, u32: u32, i32: i32, u64: u64, i64: i64,
string: String,
Struct: Struct,
list: Vec
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); } ```