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}