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    DocumentEditingWrapBlocksInFrame,
73    DocumentEditingUnwrapFrame,
74    DocumentEditingUnwrapBlockFromFrame,
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::List(EntityEvent::Created) => FlatEventKind::ListCreated,
153                DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
154                DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
155                DirectAccessEntity::Resource(EntityEvent::Created) => {
156                    FlatEventKind::ResourceCreated
157                }
158                DirectAccessEntity::Resource(EntityEvent::Updated) => {
159                    FlatEventKind::ResourceUpdated
160                }
161                DirectAccessEntity::Resource(EntityEvent::Removed) => {
162                    FlatEventKind::ResourceRemoved
163                }
164                DirectAccessEntity::Table(EntityEvent::Created) => FlatEventKind::TableCreated,
165                DirectAccessEntity::Table(EntityEvent::Updated) => FlatEventKind::TableUpdated,
166                DirectAccessEntity::Table(EntityEvent::Removed) => FlatEventKind::TableRemoved,
167                DirectAccessEntity::TableCell(EntityEvent::Created) => {
168                    FlatEventKind::TableCellCreated
169                }
170                DirectAccessEntity::TableCell(EntityEvent::Updated) => {
171                    FlatEventKind::TableCellUpdated
172                }
173                DirectAccessEntity::TableCell(EntityEvent::Removed) => {
174                    FlatEventKind::TableCellRemoved
175                }
176            },
177
178            Origin::DocumentEditing(fe) => match fe {
179                DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
180                DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
181                DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
182                DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
183                DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
184                DocumentEditingEvent::InsertFormattedText => {
185                    FlatEventKind::DocumentEditingInsertFormattedText
186                }
187                DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
188                DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
189                DocumentEditingEvent::AddBlockToList => {
190                    FlatEventKind::DocumentEditingAddBlockToList
191                }
192                DocumentEditingEvent::RemoveBlockFromList => {
193                    FlatEventKind::DocumentEditingRemoveBlockFromList
194                }
195                DocumentEditingEvent::InsertFragment => {
196                    FlatEventKind::DocumentEditingInsertFragment
197                }
198                DocumentEditingEvent::InsertHtmlAtPosition => {
199                    FlatEventKind::DocumentEditingInsertHtmlAtPosition
200                }
201                DocumentEditingEvent::InsertMarkdownAtPosition => {
202                    FlatEventKind::DocumentEditingInsertMarkdownAtPosition
203                }
204                DocumentEditingEvent::InsertTable => FlatEventKind::DocumentEditingInsertTable,
205                DocumentEditingEvent::RemoveTable => FlatEventKind::DocumentEditingRemoveTable,
206                DocumentEditingEvent::InsertTableRow => {
207                    FlatEventKind::DocumentEditingInsertTableRow
208                }
209                DocumentEditingEvent::InsertTableColumn => {
210                    FlatEventKind::DocumentEditingInsertTableColumn
211                }
212                DocumentEditingEvent::RemoveTableRow => {
213                    FlatEventKind::DocumentEditingRemoveTableRow
214                }
215                DocumentEditingEvent::RemoveTableColumn => {
216                    FlatEventKind::DocumentEditingRemoveTableColumn
217                }
218                DocumentEditingEvent::MergeTableCells => {
219                    FlatEventKind::DocumentEditingMergeTableCells
220                }
221                DocumentEditingEvent::SplitTableCell => {
222                    FlatEventKind::DocumentEditingSplitTableCell
223                }
224                DocumentEditingEvent::WrapBlocksInFrame => {
225                    FlatEventKind::DocumentEditingWrapBlocksInFrame
226                }
227                DocumentEditingEvent::UnwrapFrame => FlatEventKind::DocumentEditingUnwrapFrame,
228                DocumentEditingEvent::UnwrapBlockFromFrame => {
229                    FlatEventKind::DocumentEditingUnwrapBlockFromFrame
230                }
231            },
232            Origin::DocumentFormatting(fe) => match fe {
233                DocumentFormattingEvent::SetTextFormat => {
234                    FlatEventKind::DocumentFormattingSetTextFormat
235                }
236                DocumentFormattingEvent::MergeTextFormat => {
237                    FlatEventKind::DocumentFormattingMergeTextFormat
238                }
239                DocumentFormattingEvent::SetBlockFormat => {
240                    FlatEventKind::DocumentFormattingSetBlockFormat
241                }
242                DocumentFormattingEvent::SetFrameFormat => {
243                    FlatEventKind::DocumentFormattingSetFrameFormat
244                }
245                DocumentFormattingEvent::SetTableFormat => {
246                    FlatEventKind::DocumentFormattingSetTableFormat
247                }
248                DocumentFormattingEvent::SetTableCellFormat => {
249                    FlatEventKind::DocumentFormattingSetTableCellFormat
250                }
251                DocumentFormattingEvent::SetListFormat => {
252                    FlatEventKind::DocumentFormattingSetListFormat
253                }
254            },
255            Origin::DocumentIo(fe) => match fe {
256                DocumentIoEvent::ImportPlainText => FlatEventKind::DocumentIoImportPlainText,
257                DocumentIoEvent::ExportPlainText => FlatEventKind::DocumentIoExportPlainText,
258                DocumentIoEvent::ImportMarkdown => FlatEventKind::DocumentIoImportMarkdown,
259                DocumentIoEvent::ExportMarkdown => FlatEventKind::DocumentIoExportMarkdown,
260                DocumentIoEvent::ImportHtml => FlatEventKind::DocumentIoImportHtml,
261                DocumentIoEvent::ExportHtml => FlatEventKind::DocumentIoExportHtml,
262                DocumentIoEvent::ExportLatex => FlatEventKind::DocumentIoExportLatex,
263                DocumentIoEvent::ExportDocx => FlatEventKind::DocumentIoExportDocx,
264            },
265            Origin::DocumentSearch(fe) => match fe {
266                DocumentSearchEvent::FindText => FlatEventKind::DocumentSearchFindText,
267                DocumentSearchEvent::FindAll => FlatEventKind::DocumentSearchFindAll,
268                DocumentSearchEvent::ReplaceText => FlatEventKind::DocumentSearchReplaceText,
269            },
270            Origin::DocumentInspection(fe) => match fe {
271                DocumentInspectionEvent::GetDocumentStats => {
272                    FlatEventKind::DocumentInspectionGetDocumentStats
273                }
274                DocumentInspectionEvent::GetTextAtPosition => {
275                    FlatEventKind::DocumentInspectionGetTextAtPosition
276                }
277                DocumentInspectionEvent::GetBlockAtPosition => {
278                    FlatEventKind::DocumentInspectionGetBlockAtPosition
279                }
280                DocumentInspectionEvent::ExtractFragment => {
281                    FlatEventKind::DocumentInspectionExtractFragment
282                }
283            },
284            Origin::UndoRedo(ur) => match ur {
285                UndoRedoEvent::Undone => FlatEventKind::UndoPerformed,
286                UndoRedoEvent::Redone => FlatEventKind::RedoPerformed,
287                UndoRedoEvent::BeginComposite => FlatEventKind::CompositeBegin,
288                UndoRedoEvent::EndComposite => FlatEventKind::CompositeEnd,
289                UndoRedoEvent::CancelComposite => FlatEventKind::CompositeCancelled,
290            },
291            Origin::LongOperation(lo) => match lo {
292                LongOperationEvent::Started => FlatEventKind::LongOperationStarted,
293                LongOperationEvent::Progress => FlatEventKind::LongOperationProgress,
294                LongOperationEvent::Completed => FlatEventKind::LongOperationCompleted,
295                LongOperationEvent::Failed => FlatEventKind::LongOperationFailed,
296                LongOperationEvent::Cancelled => FlatEventKind::LongOperationCancelled,
297            },
298        };
299        FlatEvent {
300            kind,
301            ids: event.ids,
302            data: event.data,
303        }
304    }
305}
306
307/// Returns `true` if this event kind represents an entity mutation (created, updated, or removed).
308pub fn is_mutation(kind: &FlatEventKind) -> bool {
309    use FlatEventKind::*;
310    matches!(
311        kind,
312        RootCreated
313            | RootUpdated
314            | RootRemoved
315            | DocumentCreated
316            | DocumentUpdated
317            | DocumentRemoved
318            | FrameCreated
319            | FrameUpdated
320            | FrameRemoved
321            | BlockCreated
322            | BlockUpdated
323            | BlockRemoved
324            | ListCreated
325            | ListUpdated
326            | ListRemoved
327            | ResourceCreated
328            | ResourceUpdated
329            | ResourceRemoved
330            | TableCreated
331            | TableUpdated
332            | TableRemoved
333            | TableCellCreated
334            | TableCellUpdated
335            | TableCellRemoved
336    )
337}
338
339#[cfg(test)]
340mod tests {
341    use super::*;
342
343    #[test]
344    fn test_entity_event_converts_to_flat() {
345        let event = Event {
346            origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
347            ids: vec![],
348            data: None,
349        };
350        let flat: FlatEvent = event.into();
351        assert_eq!(flat.kind, FlatEventKind::Reset);
352    }
353
354    #[test]
355    fn test_undo_redo_converts_to_flat() {
356        let event = Event {
357            origin: Origin::UndoRedo(UndoRedoEvent::Undone),
358            ids: vec![],
359            data: None,
360        };
361        let flat: FlatEvent = event.into();
362        assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
363    }
364
365    #[test]
366    fn test_is_mutation() {
367        assert!(is_mutation(&FlatEventKind::RootCreated));
368        assert!(is_mutation(&FlatEventKind::RootUpdated));
369        assert!(is_mutation(&FlatEventKind::RootRemoved));
370
371        assert!(is_mutation(&FlatEventKind::DocumentCreated));
372        assert!(is_mutation(&FlatEventKind::DocumentUpdated));
373        assert!(is_mutation(&FlatEventKind::DocumentRemoved));
374
375        assert!(is_mutation(&FlatEventKind::FrameCreated));
376        assert!(is_mutation(&FlatEventKind::FrameUpdated));
377        assert!(is_mutation(&FlatEventKind::FrameRemoved));
378
379        assert!(is_mutation(&FlatEventKind::BlockCreated));
380        assert!(is_mutation(&FlatEventKind::BlockUpdated));
381        assert!(is_mutation(&FlatEventKind::BlockRemoved));
382
383        assert!(is_mutation(&FlatEventKind::ListCreated));
384        assert!(is_mutation(&FlatEventKind::ListUpdated));
385        assert!(is_mutation(&FlatEventKind::ListRemoved));
386
387        assert!(is_mutation(&FlatEventKind::ResourceCreated));
388        assert!(is_mutation(&FlatEventKind::ResourceUpdated));
389        assert!(is_mutation(&FlatEventKind::ResourceRemoved));
390
391        assert!(is_mutation(&FlatEventKind::TableCreated));
392        assert!(is_mutation(&FlatEventKind::TableUpdated));
393        assert!(is_mutation(&FlatEventKind::TableRemoved));
394
395        assert!(is_mutation(&FlatEventKind::TableCellCreated));
396        assert!(is_mutation(&FlatEventKind::TableCellUpdated));
397        assert!(is_mutation(&FlatEventKind::TableCellRemoved));
398
399        assert!(!is_mutation(&FlatEventKind::Reset));
400        assert!(!is_mutation(&FlatEventKind::UndoPerformed));
401        assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
402    }
403}