serde-gff

Crates.io Документация Лицензия MIT

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;

[macro_use]

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;

[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, }

[derive(Debug, Serialize, Deserialize)]

[allow(nonsnakecase)]

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); } ```