[][src]Crate serde_gff

Реализация парсера файлов формата Bioware GFF, используемых в играх на движке Aurora (Neverwinter Nights, The Witcher) и в игре Neverwinter Nights 2.

Формат имеет некоторые ограничения:

  • элементами верхнего уровня могут быть только структуры или перечисления Rust в unit или struct варианте
  • имена полей структур не должны быть длиннее 16 байт в UTF-8. При нарушении при сериализации будет ошибка
  • то же самое касается ключей карт. Кроме того, ключами могут быть только строки (&str или String)

Пример

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

Modules

de

Десериализатор для формата Bioware GFF (Generic File Format)

error

Реализация структуры, описывающей ошибки кодирования или декодирования GFF

header

Содержит описания структур заголовка GFF файла

index

Содержит описание структур-индексов различных данных в GFF файле

parser

Реализация потокового парсера GFF файла. См. описание структуры Parser

raw

Вспомогательный модуль, содержащий описание структур, непосредственно хранимых в GFF файле на диске. Обычно нет необходимости использовать данный модуль -- он может понадобиться только при отладке

ser

Сериализатор для формата Bioware GFF (Generic File Format)

value

Содержит описания значений, которые может хранить GFF файл

Structs

Label

Описание названия поля структуры GFF файла. GFF файл состоит из дерева структур, а каждая структура -- из полей с именем и значением. Имена полей представлены данной структурой

LocString

Локализуемая строка, содержащая в себе все данные, которые могут храниться в GFF файле. Может содержать логически некорректные данные, поэтому, если не требуется анализировать непосредственное содержимое GFF файла без потерь, лучше сразу преобразовать ее в GffString, используя into(), и работать с ней.

ResRef

Представляет ссылку на игровой ресурс, которым может быть шаблон объекта

StrRef

Индекс в файле dialog.tlk, содержащий локализованный текст

StringKey

Ключ, используемый для индексации локализуемых строк во внутреннем представлении строк (когда строки внедрены в GFF файл, а не используются ссылки на строки в TLK файле).

SubString

Часть локализованной строки, хранящая информацию для одного языка и пола

Enums

Gender

Виды пола персонажа, на которых могут храниться локализованные строки в объекте LocString

GffString

Локализуемая строка, представленная в виде, в котором некорректные значения непредставимы.

Language

Виды языков, на которых могут храниться локализованные строки в объекте LocString