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