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