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 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 UndoPerformed,
109 RedoPerformed,
110 CompositeBegin,
111 CompositeEnd,
112 CompositeCancelled,
113
114 LongOperationStarted,
116 LongOperationProgress,
117 LongOperationCompleted,
118 LongOperationFailed,
119 LongOperationCancelled,
120
121 Reset,
123}
124
125#[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
321pub 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}