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