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