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}