Skip to main content

text_document_frontend/
flat_event.rs

1// Generated by Qleany v1.4.8 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
47    // Per-feature use case events
48    DocumentEditingInsertText,
49    DocumentEditingDeleteText,
50    DocumentEditingInsertBlock,
51    DocumentEditingInsertImage,
52    DocumentEditingInsertFrame,
53    DocumentEditingInsertFormattedText,
54    DocumentEditingCreateList,
55    DocumentEditingInsertList,
56    DocumentEditingInsertFragment,
57    DocumentEditingInsertHtmlAtPosition,
58    DocumentEditingInsertMarkdownAtPosition,
59
60    DocumentFormattingSetTextFormat,
61    DocumentFormattingMergeTextFormat,
62    DocumentFormattingSetBlockFormat,
63    DocumentFormattingSetFrameFormat,
64
65    DocumentIoImportPlainText,
66    DocumentIoExportPlainText,
67    DocumentIoImportMarkdown,
68    DocumentIoExportMarkdown,
69    DocumentIoImportHtml,
70    DocumentIoExportHtml,
71    DocumentIoExportLatex,
72    DocumentIoExportDocx,
73
74    DocumentSearchFindText,
75    DocumentSearchFindAll,
76    DocumentSearchReplaceText,
77
78    DocumentInspectionGetDocumentStats,
79    DocumentInspectionGetTextAtPosition,
80    DocumentInspectionGetBlockAtPosition,
81    DocumentInspectionExtractFragment,
82
83    // Undo/redo
84    UndoPerformed,
85    RedoPerformed,
86    CompositeBegin,
87    CompositeEnd,
88    CompositeCancelled,
89
90    // Long operations
91    LongOperationStarted,
92    LongOperationProgress,
93    LongOperationCompleted,
94    LongOperationFailed,
95    LongOperationCancelled,
96
97    // System
98    Reset,
99}
100
101/// An event with a flattened kind, ready for consumer-side matching.
102#[derive(Debug, Clone)]
103pub struct FlatEvent {
104    pub kind: FlatEventKind,
105    pub ids: Vec<EntityId>,
106    pub data: Option<String>,
107}
108
109impl From<Event> for FlatEvent {
110    fn from(event: Event) -> Self {
111        let kind = match &event.origin {
112            Origin::DirectAccess(da) => match da {
113                DirectAccessEntity::All(AllEvent::Reset) => FlatEventKind::Reset,
114
115                DirectAccessEntity::Root(EntityEvent::Created) => FlatEventKind::RootCreated,
116                DirectAccessEntity::Root(EntityEvent::Updated) => FlatEventKind::RootUpdated,
117                DirectAccessEntity::Root(EntityEvent::Removed) => FlatEventKind::RootRemoved,
118                DirectAccessEntity::Document(EntityEvent::Created) => {
119                    FlatEventKind::DocumentCreated
120                }
121                DirectAccessEntity::Document(EntityEvent::Updated) => {
122                    FlatEventKind::DocumentUpdated
123                }
124                DirectAccessEntity::Document(EntityEvent::Removed) => {
125                    FlatEventKind::DocumentRemoved
126                }
127                DirectAccessEntity::Frame(EntityEvent::Created) => FlatEventKind::FrameCreated,
128                DirectAccessEntity::Frame(EntityEvent::Updated) => FlatEventKind::FrameUpdated,
129                DirectAccessEntity::Frame(EntityEvent::Removed) => FlatEventKind::FrameRemoved,
130                DirectAccessEntity::Block(EntityEvent::Created) => FlatEventKind::BlockCreated,
131                DirectAccessEntity::Block(EntityEvent::Updated) => FlatEventKind::BlockUpdated,
132                DirectAccessEntity::Block(EntityEvent::Removed) => FlatEventKind::BlockRemoved,
133                DirectAccessEntity::InlineElement(EntityEvent::Created) => {
134                    FlatEventKind::InlineElementCreated
135                }
136                DirectAccessEntity::InlineElement(EntityEvent::Updated) => {
137                    FlatEventKind::InlineElementUpdated
138                }
139                DirectAccessEntity::InlineElement(EntityEvent::Removed) => {
140                    FlatEventKind::InlineElementRemoved
141                }
142                DirectAccessEntity::List(EntityEvent::Created) => FlatEventKind::ListCreated,
143                DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
144                DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
145                DirectAccessEntity::Resource(EntityEvent::Created) => {
146                    FlatEventKind::ResourceCreated
147                }
148                DirectAccessEntity::Resource(EntityEvent::Updated) => {
149                    FlatEventKind::ResourceUpdated
150                }
151                DirectAccessEntity::Resource(EntityEvent::Removed) => {
152                    FlatEventKind::ResourceRemoved
153                }
154            },
155
156            Origin::DocumentEditing(fe) => match fe {
157                DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
158                DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
159                DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
160                DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
161                DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
162                DocumentEditingEvent::InsertFormattedText => {
163                    FlatEventKind::DocumentEditingInsertFormattedText
164                }
165                DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
166                DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
167                DocumentEditingEvent::InsertFragment => {
168                    FlatEventKind::DocumentEditingInsertFragment
169                }
170                DocumentEditingEvent::InsertHtmlAtPosition => {
171                    FlatEventKind::DocumentEditingInsertHtmlAtPosition
172                }
173                DocumentEditingEvent::InsertMarkdownAtPosition => {
174                    FlatEventKind::DocumentEditingInsertMarkdownAtPosition
175                }
176            },
177            Origin::DocumentFormatting(fe) => match fe {
178                DocumentFormattingEvent::SetTextFormat => {
179                    FlatEventKind::DocumentFormattingSetTextFormat
180                }
181                DocumentFormattingEvent::MergeTextFormat => {
182                    FlatEventKind::DocumentFormattingMergeTextFormat
183                }
184                DocumentFormattingEvent::SetBlockFormat => {
185                    FlatEventKind::DocumentFormattingSetBlockFormat
186                }
187                DocumentFormattingEvent::SetFrameFormat => {
188                    FlatEventKind::DocumentFormattingSetFrameFormat
189                }
190            },
191            Origin::DocumentIo(fe) => match fe {
192                DocumentIoEvent::ImportPlainText => FlatEventKind::DocumentIoImportPlainText,
193                DocumentIoEvent::ExportPlainText => FlatEventKind::DocumentIoExportPlainText,
194                DocumentIoEvent::ImportMarkdown => FlatEventKind::DocumentIoImportMarkdown,
195                DocumentIoEvent::ExportMarkdown => FlatEventKind::DocumentIoExportMarkdown,
196                DocumentIoEvent::ImportHtml => FlatEventKind::DocumentIoImportHtml,
197                DocumentIoEvent::ExportHtml => FlatEventKind::DocumentIoExportHtml,
198                DocumentIoEvent::ExportLatex => FlatEventKind::DocumentIoExportLatex,
199                DocumentIoEvent::ExportDocx => FlatEventKind::DocumentIoExportDocx,
200            },
201            Origin::DocumentSearch(fe) => match fe {
202                DocumentSearchEvent::FindText => FlatEventKind::DocumentSearchFindText,
203                DocumentSearchEvent::FindAll => FlatEventKind::DocumentSearchFindAll,
204                DocumentSearchEvent::ReplaceText => FlatEventKind::DocumentSearchReplaceText,
205            },
206            Origin::DocumentInspection(fe) => match fe {
207                DocumentInspectionEvent::GetDocumentStats => {
208                    FlatEventKind::DocumentInspectionGetDocumentStats
209                }
210                DocumentInspectionEvent::GetTextAtPosition => {
211                    FlatEventKind::DocumentInspectionGetTextAtPosition
212                }
213                DocumentInspectionEvent::GetBlockAtPosition => {
214                    FlatEventKind::DocumentInspectionGetBlockAtPosition
215                }
216                DocumentInspectionEvent::ExtractFragment => {
217                    FlatEventKind::DocumentInspectionExtractFragment
218                }
219            },
220            Origin::UndoRedo(ur) => match ur {
221                UndoRedoEvent::Undone => FlatEventKind::UndoPerformed,
222                UndoRedoEvent::Redone => FlatEventKind::RedoPerformed,
223                UndoRedoEvent::BeginComposite => FlatEventKind::CompositeBegin,
224                UndoRedoEvent::EndComposite => FlatEventKind::CompositeEnd,
225                UndoRedoEvent::CancelComposite => FlatEventKind::CompositeCancelled,
226            },
227            Origin::LongOperation(lo) => match lo {
228                LongOperationEvent::Started => FlatEventKind::LongOperationStarted,
229                LongOperationEvent::Progress => FlatEventKind::LongOperationProgress,
230                LongOperationEvent::Completed => FlatEventKind::LongOperationCompleted,
231                LongOperationEvent::Failed => FlatEventKind::LongOperationFailed,
232                LongOperationEvent::Cancelled => FlatEventKind::LongOperationCancelled,
233            },
234        };
235        FlatEvent {
236            kind,
237            ids: event.ids,
238            data: event.data,
239        }
240    }
241}
242
243/// Returns `true` if this event kind represents an entity mutation (created, updated, or removed).
244pub fn is_mutation(kind: &FlatEventKind) -> bool {
245    use FlatEventKind::*;
246    matches!(
247        kind,
248        RootCreated
249            | RootUpdated
250            | RootRemoved
251            | DocumentCreated
252            | DocumentUpdated
253            | DocumentRemoved
254            | FrameCreated
255            | FrameUpdated
256            | FrameRemoved
257            | BlockCreated
258            | BlockUpdated
259            | BlockRemoved
260            | InlineElementCreated
261            | InlineElementUpdated
262            | InlineElementRemoved
263            | ListCreated
264            | ListUpdated
265            | ListRemoved
266            | ResourceCreated
267            | ResourceUpdated
268            | ResourceRemoved
269    )
270}
271
272#[cfg(test)]
273mod tests {
274    use super::*;
275
276    #[test]
277    fn test_entity_event_converts_to_flat() {
278        let event = Event {
279            origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
280            ids: vec![],
281            data: None,
282        };
283        let flat: FlatEvent = event.into();
284        assert_eq!(flat.kind, FlatEventKind::Reset);
285    }
286
287    #[test]
288    fn test_undo_redo_converts_to_flat() {
289        let event = Event {
290            origin: Origin::UndoRedo(UndoRedoEvent::Undone),
291            ids: vec![],
292            data: None,
293        };
294        let flat: FlatEvent = event.into();
295        assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
296    }
297
298    #[test]
299    fn test_is_mutation() {
300        assert!(is_mutation(&FlatEventKind::RootCreated));
301        assert!(is_mutation(&FlatEventKind::RootUpdated));
302        assert!(is_mutation(&FlatEventKind::RootRemoved));
303
304        assert!(is_mutation(&FlatEventKind::DocumentCreated));
305        assert!(is_mutation(&FlatEventKind::DocumentUpdated));
306        assert!(is_mutation(&FlatEventKind::DocumentRemoved));
307
308        assert!(is_mutation(&FlatEventKind::FrameCreated));
309        assert!(is_mutation(&FlatEventKind::FrameUpdated));
310        assert!(is_mutation(&FlatEventKind::FrameRemoved));
311
312        assert!(is_mutation(&FlatEventKind::BlockCreated));
313        assert!(is_mutation(&FlatEventKind::BlockUpdated));
314        assert!(is_mutation(&FlatEventKind::BlockRemoved));
315
316        assert!(is_mutation(&FlatEventKind::InlineElementCreated));
317        assert!(is_mutation(&FlatEventKind::InlineElementUpdated));
318        assert!(is_mutation(&FlatEventKind::InlineElementRemoved));
319
320        assert!(is_mutation(&FlatEventKind::ListCreated));
321        assert!(is_mutation(&FlatEventKind::ListUpdated));
322        assert!(is_mutation(&FlatEventKind::ListRemoved));
323
324        assert!(is_mutation(&FlatEventKind::ResourceCreated));
325        assert!(is_mutation(&FlatEventKind::ResourceUpdated));
326        assert!(is_mutation(&FlatEventKind::ResourceRemoved));
327
328        assert!(!is_mutation(&FlatEventKind::Reset));
329        assert!(!is_mutation(&FlatEventKind::UndoPerformed));
330        assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
331    }
332}