Skip to main content

text_document_frontend/
flat_event.rs

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