Skip to main content

text_document_frontend/
flat_event.rs

1// Generated by Qleany v1.7.3 from frontend_flat_event.tera
2
3//! Flat event representation for simplified consumer-side matching.
4//!
5//! Collapses the nested `Origin → DirectAccessEntity → EntityEvent` hierarchy
6//! into a single-level `FlatEventKind` enum. Every consumer can subscribe to
7//! all events once and match on a flat enum instead of reconstructing nested
8//! `Origin` values.
9
10use common::event::{
11    AllEvent, DirectAccessEntity, DocumentEditingEvent, DocumentFormattingEvent,
12    DocumentInspectionEvent, DocumentIoEvent, DocumentSearchEvent, EntityEvent, Event,
13    LongOperationEvent, Origin, UndoRedoEvent,
14};
15use common::types::EntityId;
16
17/// Flat representation of all event origins.
18///
19/// Collapses `Origin → DirectAccessEntity → EntityEvent` into a single level.
20/// Generated from the manifest: adding an entity or feature adds variants,
21/// and the compiler flags every consumer that needs updating.
22#[derive(Debug, Clone, PartialEq, Eq, Hash)]
23pub enum FlatEventKind {
24    // Per-entity events
25    RootCreated,
26    RootUpdated,
27    RootRemoved,
28    DocumentCreated,
29    DocumentUpdated,
30    DocumentRemoved,
31    FrameCreated,
32    FrameUpdated,
33    FrameRemoved,
34    BlockCreated,
35    BlockUpdated,
36    BlockRemoved,
37    ListCreated,
38    ListUpdated,
39    ListRemoved,
40    ResourceCreated,
41    ResourceUpdated,
42    ResourceRemoved,
43    TableCreated,
44    TableUpdated,
45    TableRemoved,
46    TableCellCreated,
47    TableCellUpdated,
48    TableCellRemoved,
49
50    // Per-feature use case events
51    DocumentEditingInsertText,
52    DocumentEditingDeleteText,
53    DocumentEditingInsertBlock,
54    DocumentEditingInsertImage,
55    DocumentEditingInsertFrame,
56    DocumentEditingInsertFormattedText,
57    DocumentEditingCreateList,
58    DocumentEditingInsertList,
59    DocumentEditingAddBlockToList,
60    DocumentEditingRemoveBlockFromList,
61    DocumentEditingInsertFragment,
62    DocumentEditingInsertHtmlAtPosition,
63    DocumentEditingInsertMarkdownAtPosition,
64    DocumentEditingInsertTable,
65    DocumentEditingRemoveTable,
66    DocumentEditingInsertTableRow,
67    DocumentEditingInsertTableColumn,
68    DocumentEditingRemoveTableRow,
69    DocumentEditingRemoveTableColumn,
70    DocumentEditingMergeTableCells,
71    DocumentEditingSplitTableCell,
72
73    DocumentFormattingSetTextFormat,
74    DocumentFormattingMergeTextFormat,
75    DocumentFormattingSetBlockFormat,
76    DocumentFormattingSetFrameFormat,
77    DocumentFormattingSetTableFormat,
78    DocumentFormattingSetTableCellFormat,
79    DocumentFormattingSetListFormat,
80
81    DocumentIoImportPlainText,
82    DocumentIoExportPlainText,
83    DocumentIoImportMarkdown,
84    DocumentIoExportMarkdown,
85    DocumentIoImportHtml,
86    DocumentIoExportHtml,
87    DocumentIoExportLatex,
88    DocumentIoExportDocx,
89
90    DocumentSearchFindText,
91    DocumentSearchFindAll,
92    DocumentSearchReplaceText,
93
94    DocumentInspectionGetDocumentStats,
95    DocumentInspectionGetTextAtPosition,
96    DocumentInspectionGetBlockAtPosition,
97    DocumentInspectionExtractFragment,
98
99    // Undo/redo
100    UndoPerformed,
101    RedoPerformed,
102    CompositeBegin,
103    CompositeEnd,
104    CompositeCancelled,
105
106    // Long operations
107    LongOperationStarted,
108    LongOperationProgress,
109    LongOperationCompleted,
110    LongOperationFailed,
111    LongOperationCancelled,
112
113    // System
114    Reset,
115}
116
117/// An event with a flattened kind, ready for consumer-side matching.
118#[derive(Debug, Clone)]
119pub struct FlatEvent {
120    pub kind: FlatEventKind,
121    pub ids: Vec<EntityId>,
122    pub data: Option<String>,
123}
124
125impl From<Event> for FlatEvent {
126    fn from(event: Event) -> Self {
127        let kind = match &event.origin {
128            Origin::DirectAccess(da) => match da {
129                DirectAccessEntity::All(AllEvent::Reset) => FlatEventKind::Reset,
130
131                DirectAccessEntity::Root(EntityEvent::Created) => FlatEventKind::RootCreated,
132                DirectAccessEntity::Root(EntityEvent::Updated) => FlatEventKind::RootUpdated,
133                DirectAccessEntity::Root(EntityEvent::Removed) => FlatEventKind::RootRemoved,
134                DirectAccessEntity::Document(EntityEvent::Created) => {
135                    FlatEventKind::DocumentCreated
136                }
137                DirectAccessEntity::Document(EntityEvent::Updated) => {
138                    FlatEventKind::DocumentUpdated
139                }
140                DirectAccessEntity::Document(EntityEvent::Removed) => {
141                    FlatEventKind::DocumentRemoved
142                }
143                DirectAccessEntity::Frame(EntityEvent::Created) => FlatEventKind::FrameCreated,
144                DirectAccessEntity::Frame(EntityEvent::Updated) => FlatEventKind::FrameUpdated,
145                DirectAccessEntity::Frame(EntityEvent::Removed) => FlatEventKind::FrameRemoved,
146                DirectAccessEntity::Block(EntityEvent::Created) => FlatEventKind::BlockCreated,
147                DirectAccessEntity::Block(EntityEvent::Updated) => FlatEventKind::BlockUpdated,
148                DirectAccessEntity::Block(EntityEvent::Removed) => FlatEventKind::BlockRemoved,
149                DirectAccessEntity::List(EntityEvent::Created) => FlatEventKind::ListCreated,
150                DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
151                DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
152                DirectAccessEntity::Resource(EntityEvent::Created) => {
153                    FlatEventKind::ResourceCreated
154                }
155                DirectAccessEntity::Resource(EntityEvent::Updated) => {
156                    FlatEventKind::ResourceUpdated
157                }
158                DirectAccessEntity::Resource(EntityEvent::Removed) => {
159                    FlatEventKind::ResourceRemoved
160                }
161                DirectAccessEntity::Table(EntityEvent::Created) => FlatEventKind::TableCreated,
162                DirectAccessEntity::Table(EntityEvent::Updated) => FlatEventKind::TableUpdated,
163                DirectAccessEntity::Table(EntityEvent::Removed) => FlatEventKind::TableRemoved,
164                DirectAccessEntity::TableCell(EntityEvent::Created) => {
165                    FlatEventKind::TableCellCreated
166                }
167                DirectAccessEntity::TableCell(EntityEvent::Updated) => {
168                    FlatEventKind::TableCellUpdated
169                }
170                DirectAccessEntity::TableCell(EntityEvent::Removed) => {
171                    FlatEventKind::TableCellRemoved
172                }
173            },
174
175            Origin::DocumentEditing(fe) => match fe {
176                DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
177                DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
178                DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
179                DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
180                DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
181                DocumentEditingEvent::InsertFormattedText => {
182                    FlatEventKind::DocumentEditingInsertFormattedText
183                }
184                DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
185                DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
186                DocumentEditingEvent::AddBlockToList => {
187                    FlatEventKind::DocumentEditingAddBlockToList
188                }
189                DocumentEditingEvent::RemoveBlockFromList => {
190                    FlatEventKind::DocumentEditingRemoveBlockFromList
191                }
192                DocumentEditingEvent::InsertFragment => {
193                    FlatEventKind::DocumentEditingInsertFragment
194                }
195                DocumentEditingEvent::InsertHtmlAtPosition => {
196                    FlatEventKind::DocumentEditingInsertHtmlAtPosition
197                }
198                DocumentEditingEvent::InsertMarkdownAtPosition => {
199                    FlatEventKind::DocumentEditingInsertMarkdownAtPosition
200                }
201                DocumentEditingEvent::InsertTable => FlatEventKind::DocumentEditingInsertTable,
202                DocumentEditingEvent::RemoveTable => FlatEventKind::DocumentEditingRemoveTable,
203                DocumentEditingEvent::InsertTableRow => {
204                    FlatEventKind::DocumentEditingInsertTableRow
205                }
206                DocumentEditingEvent::InsertTableColumn => {
207                    FlatEventKind::DocumentEditingInsertTableColumn
208                }
209                DocumentEditingEvent::RemoveTableRow => {
210                    FlatEventKind::DocumentEditingRemoveTableRow
211                }
212                DocumentEditingEvent::RemoveTableColumn => {
213                    FlatEventKind::DocumentEditingRemoveTableColumn
214                }
215                DocumentEditingEvent::MergeTableCells => {
216                    FlatEventKind::DocumentEditingMergeTableCells
217                }
218                DocumentEditingEvent::SplitTableCell => {
219                    FlatEventKind::DocumentEditingSplitTableCell
220                }
221            },
222            Origin::DocumentFormatting(fe) => match fe {
223                DocumentFormattingEvent::SetTextFormat => {
224                    FlatEventKind::DocumentFormattingSetTextFormat
225                }
226                DocumentFormattingEvent::MergeTextFormat => {
227                    FlatEventKind::DocumentFormattingMergeTextFormat
228                }
229                DocumentFormattingEvent::SetBlockFormat => {
230                    FlatEventKind::DocumentFormattingSetBlockFormat
231                }
232                DocumentFormattingEvent::SetFrameFormat => {
233                    FlatEventKind::DocumentFormattingSetFrameFormat
234                }
235                DocumentFormattingEvent::SetTableFormat => {
236                    FlatEventKind::DocumentFormattingSetTableFormat
237                }
238                DocumentFormattingEvent::SetTableCellFormat => {
239                    FlatEventKind::DocumentFormattingSetTableCellFormat
240                }
241                DocumentFormattingEvent::SetListFormat => {
242                    FlatEventKind::DocumentFormattingSetListFormat
243                }
244            },
245            Origin::DocumentIo(fe) => match fe {
246                DocumentIoEvent::ImportPlainText => FlatEventKind::DocumentIoImportPlainText,
247                DocumentIoEvent::ExportPlainText => FlatEventKind::DocumentIoExportPlainText,
248                DocumentIoEvent::ImportMarkdown => FlatEventKind::DocumentIoImportMarkdown,
249                DocumentIoEvent::ExportMarkdown => FlatEventKind::DocumentIoExportMarkdown,
250                DocumentIoEvent::ImportHtml => FlatEventKind::DocumentIoImportHtml,
251                DocumentIoEvent::ExportHtml => FlatEventKind::DocumentIoExportHtml,
252                DocumentIoEvent::ExportLatex => FlatEventKind::DocumentIoExportLatex,
253                DocumentIoEvent::ExportDocx => FlatEventKind::DocumentIoExportDocx,
254            },
255            Origin::DocumentSearch(fe) => match fe {
256                DocumentSearchEvent::FindText => FlatEventKind::DocumentSearchFindText,
257                DocumentSearchEvent::FindAll => FlatEventKind::DocumentSearchFindAll,
258                DocumentSearchEvent::ReplaceText => FlatEventKind::DocumentSearchReplaceText,
259            },
260            Origin::DocumentInspection(fe) => match fe {
261                DocumentInspectionEvent::GetDocumentStats => {
262                    FlatEventKind::DocumentInspectionGetDocumentStats
263                }
264                DocumentInspectionEvent::GetTextAtPosition => {
265                    FlatEventKind::DocumentInspectionGetTextAtPosition
266                }
267                DocumentInspectionEvent::GetBlockAtPosition => {
268                    FlatEventKind::DocumentInspectionGetBlockAtPosition
269                }
270                DocumentInspectionEvent::ExtractFragment => {
271                    FlatEventKind::DocumentInspectionExtractFragment
272                }
273            },
274            Origin::UndoRedo(ur) => match ur {
275                UndoRedoEvent::Undone => FlatEventKind::UndoPerformed,
276                UndoRedoEvent::Redone => FlatEventKind::RedoPerformed,
277                UndoRedoEvent::BeginComposite => FlatEventKind::CompositeBegin,
278                UndoRedoEvent::EndComposite => FlatEventKind::CompositeEnd,
279                UndoRedoEvent::CancelComposite => FlatEventKind::CompositeCancelled,
280            },
281            Origin::LongOperation(lo) => match lo {
282                LongOperationEvent::Started => FlatEventKind::LongOperationStarted,
283                LongOperationEvent::Progress => FlatEventKind::LongOperationProgress,
284                LongOperationEvent::Completed => FlatEventKind::LongOperationCompleted,
285                LongOperationEvent::Failed => FlatEventKind::LongOperationFailed,
286                LongOperationEvent::Cancelled => FlatEventKind::LongOperationCancelled,
287            },
288        };
289        FlatEvent {
290            kind,
291            ids: event.ids,
292            data: event.data,
293        }
294    }
295}
296
297/// Returns `true` if this event kind represents an entity mutation (created, updated, or removed).
298pub fn is_mutation(kind: &FlatEventKind) -> bool {
299    use FlatEventKind::*;
300    matches!(
301        kind,
302        RootCreated
303            | RootUpdated
304            | RootRemoved
305            | DocumentCreated
306            | DocumentUpdated
307            | DocumentRemoved
308            | FrameCreated
309            | FrameUpdated
310            | FrameRemoved
311            | BlockCreated
312            | BlockUpdated
313            | BlockRemoved
314            | ListCreated
315            | ListUpdated
316            | ListRemoved
317            | ResourceCreated
318            | ResourceUpdated
319            | ResourceRemoved
320            | TableCreated
321            | TableUpdated
322            | TableRemoved
323            | TableCellCreated
324            | TableCellUpdated
325            | TableCellRemoved
326    )
327}
328
329#[cfg(test)]
330mod tests {
331    use super::*;
332
333    #[test]
334    fn test_entity_event_converts_to_flat() {
335        let event = Event {
336            origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
337            ids: vec![],
338            data: None,
339        };
340        let flat: FlatEvent = event.into();
341        assert_eq!(flat.kind, FlatEventKind::Reset);
342    }
343
344    #[test]
345    fn test_undo_redo_converts_to_flat() {
346        let event = Event {
347            origin: Origin::UndoRedo(UndoRedoEvent::Undone),
348            ids: vec![],
349            data: None,
350        };
351        let flat: FlatEvent = event.into();
352        assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
353    }
354
355    #[test]
356    fn test_is_mutation() {
357        assert!(is_mutation(&FlatEventKind::RootCreated));
358        assert!(is_mutation(&FlatEventKind::RootUpdated));
359        assert!(is_mutation(&FlatEventKind::RootRemoved));
360
361        assert!(is_mutation(&FlatEventKind::DocumentCreated));
362        assert!(is_mutation(&FlatEventKind::DocumentUpdated));
363        assert!(is_mutation(&FlatEventKind::DocumentRemoved));
364
365        assert!(is_mutation(&FlatEventKind::FrameCreated));
366        assert!(is_mutation(&FlatEventKind::FrameUpdated));
367        assert!(is_mutation(&FlatEventKind::FrameRemoved));
368
369        assert!(is_mutation(&FlatEventKind::BlockCreated));
370        assert!(is_mutation(&FlatEventKind::BlockUpdated));
371        assert!(is_mutation(&FlatEventKind::BlockRemoved));
372
373        assert!(is_mutation(&FlatEventKind::ListCreated));
374        assert!(is_mutation(&FlatEventKind::ListUpdated));
375        assert!(is_mutation(&FlatEventKind::ListRemoved));
376
377        assert!(is_mutation(&FlatEventKind::ResourceCreated));
378        assert!(is_mutation(&FlatEventKind::ResourceUpdated));
379        assert!(is_mutation(&FlatEventKind::ResourceRemoved));
380
381        assert!(is_mutation(&FlatEventKind::TableCreated));
382        assert!(is_mutation(&FlatEventKind::TableUpdated));
383        assert!(is_mutation(&FlatEventKind::TableRemoved));
384
385        assert!(is_mutation(&FlatEventKind::TableCellCreated));
386        assert!(is_mutation(&FlatEventKind::TableCellUpdated));
387        assert!(is_mutation(&FlatEventKind::TableCellRemoved));
388
389        assert!(!is_mutation(&FlatEventKind::Reset));
390        assert!(!is_mutation(&FlatEventKind::UndoPerformed));
391        assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
392    }
393}