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