serde_gff/parser/token.rs
1use crate::index::LabelIndex;
2use crate::value::SimpleValueRef;
3use super::Tag;
4
5/// Возможные виды событий, которые могут возникнуть при чтении GFF файла. Отражают
6/// появление в потоке значений из файла и структурных единиц (списков, структур, ...)
7#[derive(Debug, Clone)]
8pub enum Token {
9 /// Событие о начале разбора GFF-читателем структуры с индексом 0 в GFF файле.
10 ///
11 /// Возникает после чтения заголовка файла, и позиционирования на начало первой
12 /// (с индексом 0) структуры, но перед ее чтением. Следующим событием может быть:
13 /// - `RootEnd`: если корневая структура не содержит полей
14 /// - `StructBegin`: если первым полем корневой структуры является значение с типом `Struct`
15 /// - `ListBegin`: если первым полем корневой структуры является значение с типом `List`
16 /// - `Value`: если первым полем корневой структуры является значение с любым другим типом
17 RootBegin {
18 /// Уникальный (по задумке) идентификатор типа структуры в файле. На самом деле движок,
19 /// похоже, не проверяет уникальность этих значений
20 tag: Tag,
21 /// Количество полей в данной структуре
22 count: u32,
23 },
24 /// Событие об окончании разбора GFF-читателем структуры с индексом 0 в GFF файле,
25 /// что сигнализирует о завершении файла.
26 ///
27 /// Это последнее событие при чтении файла, после него следующих событий не будет
28 RootEnd,
29 /// Событие о начале разбора поля в структуре. После данного события возникают события:
30 /// - `StructBegin`: если полем структуры является значение с типом `Struct`
31 /// - `ListBegin`: если полем структуры является значение с типом `List`
32 /// - `Value`: если полем структуры является значение с любым другим типом
33 Label(LabelIndex),
34 /// Событие о начале разбора GFF-читателем любой структуры, кроме самой первой
35 /// (для нее используется событие `RootBegin`).
36 ///
37 /// Возникает после позиционирования на начало любой структуры, кроме первой
38 /// (с индексом 0), но перед ее чтением. Следующим событием может быть:
39 /// - `StructBegin`: если первым полем структуры является значение с типом `Struct`
40 /// - `ListBegin`: если первым полем структуры является значение с типом `List`
41 /// - `Value`: если первым полем структуры является значение с любым другим типом
42 StructBegin {
43 /// Уникальный (по задумке) идентификатор типа структуры в файле. На самом деле движок,
44 /// похоже, не проверяет уникальность этих значений
45 tag: Tag,
46 /// Количество полей в данной структуре
47 count: u32,
48 },
49 /// Событие об окончании разбора GFF-читателем любой структуры, кроме самой первой
50 /// (для нее используется событие `FileEnd`)
51 StructEnd,
52 /// Событие о начале разбора GFF-читателем списка объектов структуры. В параметре
53 /// содержится количество записей в списке.
54 ///
55 /// Список всегда содержит набор структур, поэтому разбор каждой записи предваряется
56 /// событием `ItemBegin` и завершается событием `ItemEnd`
57 ListBegin(u32),
58 /// Событие об окончании разбора GFF-читателем списка объектов
59 ListEnd,
60 /// Событие о начале разбора GFF-читателем любой структуры внутри списка. В отличие от
61 /// обычных, такие структуры не имеют метки.
62 ///
63 /// Возникает после позиционирования на начало любой структуры списка.
64 /// Следующим событием может быть:
65 /// - `ItemEnd`: если структура списка не содержит полей
66 /// - `StructBegin`: если первым полем структуры списка является поле с типом `Struct`
67 /// - `ListBegin`: если первым полем структуры списка является поле с типом `List`
68 /// - `Value`: если первым полем структуры списка является поле с любым другим типом
69 ItemBegin {
70 /// Уникальный (по задумке) идентификатор типа структуры в файле. На самом деле движок,
71 /// похоже, не проверяет уникальность этих значений
72 tag: Tag,
73 /// Количество полей в данной структуре
74 count: u32,
75 /// Номер элемента в списке
76 index: u32,
77 },
78 /// Событие об окончании разбора GFF-читателем любой структуры списка
79 ItemEnd,
80
81 /// Поле, представляющее примитивное (не имеющее структуры) значение, хранимое в файле
82 Value(SimpleValueRef),
83}