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