serde_gff/
sig.rs

1//! Содержит реализацию структуры, описывающей сигнатуру GFF файла, реализацию типажей для
2//! конвертации других типов данных в сигнатуру и обратно и известные форматы файлов
3
4use std::io::{Read, Write, Result};
5
6/// Определяет назначение файла. Сигнатура записана в первых 4-х байтах файла на диске
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum Signature {
9  /// Информация о модуле
10  IFO,
11
12  /// Описание области
13  ARE,
14  /// Инстанции игровых объектов и динамические свойства области
15  GIT,
16  /// Комментарий к области
17  GIC,
18
19  /// Шаблон (blueprint) существа
20  UTC,
21  /// Шаблон (blueprint) двери
22  UTD,
23  /// Шаблон (blueprint) схватки (encounter)
24  UTE,
25  /// Шаблон (blueprint) предмета
26  UTI,
27  /// Шаблон (blueprint) размещаемого объекта окружения (placeable)
28  UTP,
29  /// Шаблон (blueprint) звука
30  UTS,
31  /// Шаблон (blueprint) магазина
32  UTM,
33  /// Шаблон (blueprint) триггера
34  UTT,
35  /// Шаблон (blueprint) навигационной точки (waypoint)
36  UTW,
37
38  /// Диалог
39  DLG,
40  /// Журнал заданий
41  JRL,
42  /// Описания фракций
43  FAC,
44  /// Палитра
45  ITP,
46
47  /// Файл мастера сценариев: plot instance/plot manager file
48  PTM,
49  /// Файл мастера сценариев: plot wizard blueprint
50  PTT,
51
52  /// Параметры существа или игрового персонажа, создаваемые игрой
53  BIC,
54
55  /// Прочие виды файлов
56  Other([u8; 4]),
57}
58
59impl Signature {
60  /// Читает из указанного потока 4 байта сигнатуры файла
61  #[inline]
62  pub fn read<R: Read>(reader: &mut R) -> Result<Self> {
63    let mut sig = [0u8; 4];
64    reader.read_exact(&mut sig)?;
65    Ok(sig.into())
66  }
67  /// Записывает 4 байта сигнатуры в поток
68  #[inline]
69  pub fn write<W: Write>(&self, writer: &mut W) -> Result<()> {
70    writer.write_all(self.as_ref())
71  }
72}
73
74impl From<[u8; 4]> for Signature {
75  fn from(arr: [u8; 4]) -> Self {
76    use self::Signature::*;
77
78    match &arr {
79      b"IFO " => IFO,
80
81      b"ARE " => ARE,
82      b"GIT " => GIT,
83      b"GIC " => GIC,
84
85      b"UTC " => UTC,
86      b"UTD " => UTD,
87      b"UTE " => UTE,
88      b"UTI " => UTI,
89      b"UTP " => UTP,
90      b"UTS " => UTS,
91      b"UTM " => UTM,
92      b"UTT " => UTT,
93      b"UTW " => UTW,
94
95      b"DLG " => DLG,
96      b"JRL " => JRL,
97      b"FAC " => FAC,
98      b"ITP " => ITP,
99
100      b"PTM " => PTM,
101      b"PTT " => PTT,
102
103      b"BIC " => BIC,
104
105      _ => Other(arr),
106    }
107  }
108}
109
110impl AsRef<[u8]> for Signature {
111  fn as_ref(&self) -> &[u8] {
112    use self::Signature::*;
113
114    match *self {
115      IFO => b"IFO ",
116
117      ARE => b"ARE ",
118      GIT => b"GIT ",
119      GIC => b"GIC ",
120
121      UTC => b"UTC ",
122      UTD => b"UTD ",
123      UTE => b"UTE ",
124      UTI => b"UTI ",
125      UTP => b"UTP ",
126      UTS => b"UTS ",
127      UTM => b"UTM ",
128      UTT => b"UTT ",
129      UTW => b"UTW ",
130
131      DLG => b"DLG ",
132      JRL => b"JRL ",
133      FAC => b"FAC ",
134      ITP => b"ITP ",
135
136      PTM => b"PTM ",
137      PTT => b"PTT ",
138
139      BIC => b"BIC ",
140
141      Other(ref sig) => sig,
142    }
143  }
144}