serde_gff/
value.rs

1//! Содержит описания значений, которые может хранить GFF файл
2
3use indexmap::IndexMap;
4
5use crate::{Label, LocString, ResRef};
6use crate::index::{U64Index, I64Index, F64Index, StringIndex, ResRefIndex, LocStringIndex, BinaryIndex};
7
8/// Перечисление, представляющее все примитивные типы данных, который может хранить GFF файл.
9///
10/// Кроме примитивных типов данных GFF файл также может хранить рекурсивные структуры из
11/// данных типов и их списки.
12#[derive(Debug, Clone, PartialEq)]
13pub enum SimpleValueRef {
14  /// Беззнаковое байтовое значение (от 0 до 255), занимающее один байт.
15  ///
16  /// Тег, ассоциированный с типом, равен `0`.
17  Byte(u8),
18  /// Символ текста в диапазоне `0x00-0xFF`, занимающий один байт.
19  ///
20  /// Тег, ассоциированный с типом, равен `1`.
21  Char(i8),
22  /// Беззнаковое целое (от 0 до 65535), занимающее 2 байта.
23  ///
24  /// Тег, ассоциированный с типом, равен `2`.
25  Word(u16),
26  /// Знаковое целое (от -32768 до 32767), занимающее 2 байта.
27  ///
28  /// Тег, ассоциированный с типом, равен `3`.
29  Short(i16),
30  /// Беззнаковое целое (от 0 до 4294967296), занимающее 4 байта.
31  ///
32  /// Тег, ассоциированный с типом, равен `4`.
33  Dword(u32),
34  /// Знаковое целое (от -2147483648 до 2147483647), занимающее 4 байта.
35  ///
36  /// Тег, ассоциированный с типом, равен `5`.
37  Int(i32),
38  /// Беззнаковое целое (от 0 до примерно 18e+18), занимающее 8 байт.
39  ///
40  /// Тег, ассоциированный с типом, равен `6`.
41  Dword64(U64Index),
42  /// Знаковое целое (примерно от -9e+18 до +9e+18), занимающее 8 байт.
43  ///
44  /// Тег, ассоциированный с типом, равен `7`.
45  Int64(I64Index),
46  /// Число с плавающей запятой одинарной точности, занимающее 4 байта.
47  ///
48  /// Тег, ассоциированный с типом, равен `8`.
49  Float(f32),
50  /// Число с плавающей запятой двойной точности, занимающее 8 байт.
51  ///
52  /// Тег, ассоциированный с типом, равен `9`.
53  Double(F64Index),
54  /// Нелокализуемая строка.
55  ///
56  /// Предпочитаемый максимальный размер - 1024 символа. Это ограничение установлено в первую
57  /// очередь для того, чтобы сохранить пропускную способность сети в том случае, если строку
58  /// необходимо передавать с сервера на клиент.
59  ///
60  /// Данный вид строк не должен использоваться для текста, который может увидеть игрок, так как
61  /// он будет одинаковым независимо от языка клиента игры. Область применения данного типа -
62  /// текст для разработчиков/дизайнеров уровней, например, тегов объектов, используемых в скриптах.
63  ///
64  /// Тег, ассоциированный с типом, равен `10`.
65  String(StringIndex),
66  /// Имя файла ресурса, до 16 символов.
67  ///
68  /// Тег, ассоциированный с типом, равен `11`.
69  ResRef(ResRefIndex),
70  /// Локализуемая строка. Содержит `StringRef` и несколько `CExoString`, каждую со своим номером языка.
71  ///
72  /// Тег, ассоциированный с типом, равен `12`.
73  LocString(LocStringIndex),
74  /// Произвольные данные любой длины.
75  ///
76  /// Тег, ассоциированный с типом, равен `13`.
77  Void(BinaryIndex),
78}
79
80/// Перечисление, представляющее все примитивные типы данных, который может хранить GFF файл.
81/// В отличие от [`SimpleValueRef`] содержит полностью прочитанные данные из файла, а не только
82/// ссылки на них
83///
84/// Кроме примитивных типов данных GFF файл также может хранить рекурсивные структуры из
85/// данных типов и их списки.
86///
87/// [`SimpleValueRef`]: enum.SimpleValueRef.html
88#[derive(Debug, Clone, PartialEq)]
89pub enum SimpleValue {
90  /// Беззнаковое байтовое значение (от 0 до 255), занимающее один байт.
91  ///
92  /// Тег, ассоциированный с типом, равен `0`.
93  Byte(u8),
94  /// Символ текста в диапазоне `0x00-0xFF`, занимающий один байт.
95  ///
96  /// Тег, ассоциированный с типом, равен `1`.
97  Char(i8),
98  /// Беззнаковое целое (от 0 до 65535), занимающее 2 байта.
99  ///
100  /// Тег, ассоциированный с типом, равен `2`.
101  Word(u16),
102  /// Знаковое целое (от -32768 до 32767), занимающее 2 байта.
103  ///
104  /// Тег, ассоциированный с типом, равен `3`.
105  Short(i16),
106  /// Беззнаковое целое (от 0 до 4294967296), занимающее 4 байта.
107  ///
108  /// Тег, ассоциированный с типом, равен `4`.
109  Dword(u32),
110  /// Знаковое целое (от -2147483648 до 2147483647), занимающее 4 байта.
111  ///
112  /// Тег, ассоциированный с типом, равен `5`.
113  Int(i32),
114  /// Беззнаковое целое (от 0 до примерно 18e+18), занимающее 8 байт.
115  ///
116  /// Тег, ассоциированный с типом, равен `6`.
117  Dword64(u64),
118  /// Знаковое целое (примерно от -9e+18 до +9e+18), занимающее 8 байт.
119  ///
120  /// Тег, ассоциированный с типом, равен `7`.
121  Int64(i64),
122  /// Число с плавающей запятой одинарной точности, занимающее 4 байта.
123  ///
124  /// Тег, ассоциированный с типом, равен `8`.
125  Float(f32),
126  /// Число с плавающей запятой двойной точности, занимающее 8 байт.
127  ///
128  /// Тег, ассоциированный с типом, равен `9`.
129  Double(f64),
130  /// Нелокализуемая строка.
131  ///
132  /// Предпочитаемый максимальный размер - 1024 символа. Это ограничение установлено в первую
133  /// очередь для того, чтобы сохранить пропускную способность сети в том случае, если строку
134  /// необходимо передавать с сервера на клиент.
135  ///
136  /// Данный вид строк не должен использоваться для текста, который может увидеть игрок, так как
137  /// он будет одинаковым независимо от языка клиента игры. Область применения данного типа -
138  /// текст для разработчиков/дизайнеров уровней, например, тегов объектов, используемых в скриптах.
139  ///
140  /// Тег, ассоциированный с типом, равен `10`.
141  String(String),
142  /// Имя файла ресурса, до 16 символов.
143  ///
144  /// Тег, ассоциированный с типом, равен `11`.
145  ResRef(ResRef),
146  /// Локализуемая строка. Содержит `StringRef` и несколько `CExoString`, каждую со своим номером языка.
147  ///
148  /// Тег, ассоциированный с типом, равен `12`.
149  LocString(LocString),
150  /// Произвольные данные любой длины.
151  ///
152  /// Тег, ассоциированный с типом, равен `13`.
153  Void(Vec<u8>),
154}
155
156/// Перечисление, представляющее все возможные типы данных, которых способен хранить GFF файл,
157/// в обобщенном виде. Аналог `serde_json::Value`
158#[derive(Debug, Clone, PartialEq)]
159pub enum Value {
160  /// Беззнаковое байтовое значение (от 0 до 255), занимающее один байт.
161  ///
162  /// Тег, ассоциированный с типом, равен `0`.
163  Byte(u8),
164  /// Символ текста в диапазоне `0x00-0xFF`, занимающий один байт.
165  ///
166  /// Тег, ассоциированный с типом, равен `1`.
167  Char(i8),
168  /// Беззнаковое целое (от 0 до 65535), занимающее 2 байта.
169  ///
170  /// Тег, ассоциированный с типом, равен `2`.
171  Word(u16),
172  /// Знаковое целое (от -32768 до 32767), занимающее 2 байта.
173  ///
174  /// Тег, ассоциированный с типом, равен `3`.
175  Short(i16),
176  /// Беззнаковое целое (от 0 до 4294967296), занимающее 4 байта.
177  ///
178  /// Тег, ассоциированный с типом, равен `4`.
179  Dword(u32),
180  /// Знаковое целое (от -2147483648 до 2147483647), занимающее 4 байта.
181  ///
182  /// Тег, ассоциированный с типом, равен `5`.
183  Int(i32),
184  /// Беззнаковое целое (от 0 до примерно 18e+18), занимающее 8 байт.
185  ///
186  /// Тег, ассоциированный с типом, равен `6`.
187  Dword64(u64),
188  /// Знаковое целое (примерно от -9e+18 до +9e+18), занимающее 8 байт.
189  ///
190  /// Тег, ассоциированный с типом, равен `7`.
191  Int64(i64),
192  /// Число с плавающей запятой одинарной точности, занимающее 4 байта.
193  ///
194  /// Тег, ассоциированный с типом, равен `8`.
195  Float(f32),
196  /// Число с плавающей запятой двойной точности, занимающее 8 байт.
197  ///
198  /// Тег, ассоциированный с типом, равен `9`.
199  Double(f64),
200  /// Нелокализуемая строка.
201  ///
202  /// Предпочитаемый максимальный размер - 1024 символа. Это ограничение установлено в первую
203  /// очередь для того, чтобы сохранить пропускную способность сети в том случае, если строку
204  /// необходимо передавать с сервера на клиент.
205  ///
206  /// Данный вид строк не должен использоваться для текста, который может увидеть игрок, так как
207  /// он будет одинаковым независимо от языка клиента игры. Область применения данного типа -
208  /// текст для разработчиков/дизайнеров уровней, например, тегов объектов, используемых в скриптах.
209  ///
210  /// Тег, ассоциированный с типом, равен `10`.
211  String(String),
212  /// Имя файла ресурса, до 16 символов.
213  ///
214  /// Тег, ассоциированный с типом, равен `11`.
215  ResRef(ResRef),
216  /// Локализуемая строка. Содержит `StringRef` и несколько `CExoString`, каждую со своим номером языка.
217  ///
218  /// Тег, ассоциированный с типом, равен `12`.
219  LocString(LocString),
220  /// Произвольные данные любой длины.
221  ///
222  /// Тег, ассоциированный с типом, равен `13`.
223  Void(Vec<u8>),
224  /// Вложенная структура. Порядок полей в структуре постоянный и определяется порядком их добавления
225  ///
226  /// Тег, ассоциированный с типом, равен `14`.
227  Struct(IndexMap<Label, Value>),
228  /// Список значений любой длины.
229  ///
230  /// Тег, ассоциированный с типом, равен `15`.
231  List(Vec<Value>),
232}
233
234impl From<SimpleValue> for Value {
235  #[inline]
236  fn from(value: SimpleValue) -> Value {
237    use self::SimpleValue::*;
238
239    match value {
240      Byte(val)      => Value::Byte(val),
241      Char(val)      => Value::Char(val),
242      Word(val)      => Value::Word(val),
243      Short(val)     => Value::Short(val),
244      Dword(val)     => Value::Dword(val),
245      Int(val)       => Value::Int(val),
246      Dword64(val)   => Value::Dword64(val),
247      Int64(val)     => Value::Int64(val),
248      Float(val)     => Value::Float(val),
249      Double(val)    => Value::Double(val),
250      String(val)    => Value::String(val),
251      ResRef(val)    => Value::ResRef(val),
252      LocString(val) => Value::LocString(val),
253      Void(val)      => Value::Void(val),
254    }
255  }
256}