1use common::event::{
11 AllEvent, DirectAccessEntity, DocumentEditingEvent, DocumentFormattingEvent,
12 DocumentInspectionEvent, DocumentIoEvent, DocumentSearchEvent, EntityEvent, Event,
13 LongOperationEvent, Origin, UndoRedoEvent,
14};
15use common::types::EntityId;
16
17#[derive(Debug, Clone, PartialEq, Eq, Hash)]
23pub enum FlatEventKind {
24 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 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 DocumentEditingInsertTable,
65 DocumentEditingRemoveTable,
66 DocumentEditingInsertTableRow,
67 DocumentEditingInsertTableColumn,
68 DocumentEditingRemoveTableRow,
69 DocumentEditingRemoveTableColumn,
70 DocumentEditingMergeTableCells,
71 DocumentEditingSplitTableCell,
72
73 DocumentFormattingSetTextFormat,
74 DocumentFormattingMergeTextFormat,
75 DocumentFormattingSetBlockFormat,
76 DocumentFormattingSetFrameFormat,
77 DocumentFormattingSetTableFormat,
78 DocumentFormattingSetTableCellFormat,
79 DocumentFormattingSetListFormat,
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 UndoPerformed,
101 RedoPerformed,
102 CompositeBegin,
103 CompositeEnd,
104 CompositeCancelled,
105
106 LongOperationStarted,
108 LongOperationProgress,
109 LongOperationCompleted,
110 LongOperationFailed,
111 LongOperationCancelled,
112
113 Reset,
115}
116
117#[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::List(EntityEvent::Created) => FlatEventKind::ListCreated,
150 DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
151 DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
152 DirectAccessEntity::Resource(EntityEvent::Created) => {
153 FlatEventKind::ResourceCreated
154 }
155 DirectAccessEntity::Resource(EntityEvent::Updated) => {
156 FlatEventKind::ResourceUpdated
157 }
158 DirectAccessEntity::Resource(EntityEvent::Removed) => {
159 FlatEventKind::ResourceRemoved
160 }
161 DirectAccessEntity::Table(EntityEvent::Created) => FlatEventKind::TableCreated,
162 DirectAccessEntity::Table(EntityEvent::Updated) => FlatEventKind::TableUpdated,
163 DirectAccessEntity::Table(EntityEvent::Removed) => FlatEventKind::TableRemoved,
164 DirectAccessEntity::TableCell(EntityEvent::Created) => {
165 FlatEventKind::TableCellCreated
166 }
167 DirectAccessEntity::TableCell(EntityEvent::Updated) => {
168 FlatEventKind::TableCellUpdated
169 }
170 DirectAccessEntity::TableCell(EntityEvent::Removed) => {
171 FlatEventKind::TableCellRemoved
172 }
173 },
174
175 Origin::DocumentEditing(fe) => match fe {
176 DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
177 DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
178 DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
179 DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
180 DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
181 DocumentEditingEvent::InsertFormattedText => {
182 FlatEventKind::DocumentEditingInsertFormattedText
183 }
184 DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
185 DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
186 DocumentEditingEvent::AddBlockToList => {
187 FlatEventKind::DocumentEditingAddBlockToList
188 }
189 DocumentEditingEvent::RemoveBlockFromList => {
190 FlatEventKind::DocumentEditingRemoveBlockFromList
191 }
192 DocumentEditingEvent::InsertFragment => {
193 FlatEventKind::DocumentEditingInsertFragment
194 }
195 DocumentEditingEvent::InsertHtmlAtPosition => {
196 FlatEventKind::DocumentEditingInsertHtmlAtPosition
197 }
198 DocumentEditingEvent::InsertMarkdownAtPosition => {
199 FlatEventKind::DocumentEditingInsertMarkdownAtPosition
200 }
201 DocumentEditingEvent::InsertTable => FlatEventKind::DocumentEditingInsertTable,
202 DocumentEditingEvent::RemoveTable => FlatEventKind::DocumentEditingRemoveTable,
203 DocumentEditingEvent::InsertTableRow => {
204 FlatEventKind::DocumentEditingInsertTableRow
205 }
206 DocumentEditingEvent::InsertTableColumn => {
207 FlatEventKind::DocumentEditingInsertTableColumn
208 }
209 DocumentEditingEvent::RemoveTableRow => {
210 FlatEventKind::DocumentEditingRemoveTableRow
211 }
212 DocumentEditingEvent::RemoveTableColumn => {
213 FlatEventKind::DocumentEditingRemoveTableColumn
214 }
215 DocumentEditingEvent::MergeTableCells => {
216 FlatEventKind::DocumentEditingMergeTableCells
217 }
218 DocumentEditingEvent::SplitTableCell => {
219 FlatEventKind::DocumentEditingSplitTableCell
220 }
221 },
222 Origin::DocumentFormatting(fe) => match fe {
223 DocumentFormattingEvent::SetTextFormat => {
224 FlatEventKind::DocumentFormattingSetTextFormat
225 }
226 DocumentFormattingEvent::MergeTextFormat => {
227 FlatEventKind::DocumentFormattingMergeTextFormat
228 }
229 DocumentFormattingEvent::SetBlockFormat => {
230 FlatEventKind::DocumentFormattingSetBlockFormat
231 }
232 DocumentFormattingEvent::SetFrameFormat => {
233 FlatEventKind::DocumentFormattingSetFrameFormat
234 }
235 DocumentFormattingEvent::SetTableFormat => {
236 FlatEventKind::DocumentFormattingSetTableFormat
237 }
238 DocumentFormattingEvent::SetTableCellFormat => {
239 FlatEventKind::DocumentFormattingSetTableCellFormat
240 }
241 DocumentFormattingEvent::SetListFormat => {
242 FlatEventKind::DocumentFormattingSetListFormat
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
297pub 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 | ListCreated
315 | ListUpdated
316 | ListRemoved
317 | ResourceCreated
318 | ResourceUpdated
319 | ResourceRemoved
320 | TableCreated
321 | TableUpdated
322 | TableRemoved
323 | TableCellCreated
324 | TableCellUpdated
325 | TableCellRemoved
326 )
327}
328
329#[cfg(test)]
330mod tests {
331 use super::*;
332
333 #[test]
334 fn test_entity_event_converts_to_flat() {
335 let event = Event {
336 origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
337 ids: vec![],
338 data: None,
339 };
340 let flat: FlatEvent = event.into();
341 assert_eq!(flat.kind, FlatEventKind::Reset);
342 }
343
344 #[test]
345 fn test_undo_redo_converts_to_flat() {
346 let event = Event {
347 origin: Origin::UndoRedo(UndoRedoEvent::Undone),
348 ids: vec![],
349 data: None,
350 };
351 let flat: FlatEvent = event.into();
352 assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
353 }
354
355 #[test]
356 fn test_is_mutation() {
357 assert!(is_mutation(&FlatEventKind::RootCreated));
358 assert!(is_mutation(&FlatEventKind::RootUpdated));
359 assert!(is_mutation(&FlatEventKind::RootRemoved));
360
361 assert!(is_mutation(&FlatEventKind::DocumentCreated));
362 assert!(is_mutation(&FlatEventKind::DocumentUpdated));
363 assert!(is_mutation(&FlatEventKind::DocumentRemoved));
364
365 assert!(is_mutation(&FlatEventKind::FrameCreated));
366 assert!(is_mutation(&FlatEventKind::FrameUpdated));
367 assert!(is_mutation(&FlatEventKind::FrameRemoved));
368
369 assert!(is_mutation(&FlatEventKind::BlockCreated));
370 assert!(is_mutation(&FlatEventKind::BlockUpdated));
371 assert!(is_mutation(&FlatEventKind::BlockRemoved));
372
373 assert!(is_mutation(&FlatEventKind::ListCreated));
374 assert!(is_mutation(&FlatEventKind::ListUpdated));
375 assert!(is_mutation(&FlatEventKind::ListRemoved));
376
377 assert!(is_mutation(&FlatEventKind::ResourceCreated));
378 assert!(is_mutation(&FlatEventKind::ResourceUpdated));
379 assert!(is_mutation(&FlatEventKind::ResourceRemoved));
380
381 assert!(is_mutation(&FlatEventKind::TableCreated));
382 assert!(is_mutation(&FlatEventKind::TableUpdated));
383 assert!(is_mutation(&FlatEventKind::TableRemoved));
384
385 assert!(is_mutation(&FlatEventKind::TableCellCreated));
386 assert!(is_mutation(&FlatEventKind::TableCellUpdated));
387 assert!(is_mutation(&FlatEventKind::TableCellRemoved));
388
389 assert!(!is_mutation(&FlatEventKind::Reset));
390 assert!(!is_mutation(&FlatEventKind::UndoPerformed));
391 assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
392 }
393}