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 InlineElementCreated,
38 InlineElementUpdated,
39 InlineElementRemoved,
40 ListCreated,
41 ListUpdated,
42 ListRemoved,
43 ResourceCreated,
44 ResourceUpdated,
45 ResourceRemoved,
46 TableCreated,
47 TableUpdated,
48 TableRemoved,
49 TableCellCreated,
50 TableCellUpdated,
51 TableCellRemoved,
52
53 DocumentEditingInsertText,
55 DocumentEditingDeleteText,
56 DocumentEditingInsertBlock,
57 DocumentEditingInsertImage,
58 DocumentEditingInsertFrame,
59 DocumentEditingInsertFormattedText,
60 DocumentEditingCreateList,
61 DocumentEditingInsertList,
62 DocumentEditingInsertFragment,
63 DocumentEditingInsertHtmlAtPosition,
64 DocumentEditingInsertMarkdownAtPosition,
65 DocumentEditingInsertTable,
66 DocumentEditingRemoveTable,
67 DocumentEditingInsertTableRow,
68 DocumentEditingInsertTableColumn,
69 DocumentEditingRemoveTableRow,
70 DocumentEditingRemoveTableColumn,
71 DocumentEditingMergeTableCells,
72 DocumentEditingSplitTableCell,
73 DocumentEditingAddBlockToList,
74 DocumentEditingRemoveBlockFromList,
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::InlineElement(EntityEvent::Created) => {
153 FlatEventKind::InlineElementCreated
154 }
155 DirectAccessEntity::InlineElement(EntityEvent::Updated) => {
156 FlatEventKind::InlineElementUpdated
157 }
158 DirectAccessEntity::InlineElement(EntityEvent::Removed) => {
159 FlatEventKind::InlineElementRemoved
160 }
161 DirectAccessEntity::List(EntityEvent::Created) => FlatEventKind::ListCreated,
162 DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
163 DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
164 DirectAccessEntity::Resource(EntityEvent::Created) => {
165 FlatEventKind::ResourceCreated
166 }
167 DirectAccessEntity::Resource(EntityEvent::Updated) => {
168 FlatEventKind::ResourceUpdated
169 }
170 DirectAccessEntity::Resource(EntityEvent::Removed) => {
171 FlatEventKind::ResourceRemoved
172 }
173 DirectAccessEntity::Table(EntityEvent::Created) => FlatEventKind::TableCreated,
174 DirectAccessEntity::Table(EntityEvent::Updated) => FlatEventKind::TableUpdated,
175 DirectAccessEntity::Table(EntityEvent::Removed) => FlatEventKind::TableRemoved,
176 DirectAccessEntity::TableCell(EntityEvent::Created) => {
177 FlatEventKind::TableCellCreated
178 }
179 DirectAccessEntity::TableCell(EntityEvent::Updated) => {
180 FlatEventKind::TableCellUpdated
181 }
182 DirectAccessEntity::TableCell(EntityEvent::Removed) => {
183 FlatEventKind::TableCellRemoved
184 }
185 },
186
187 Origin::DocumentEditing(fe) => match fe {
188 DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
189 DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
190 DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
191 DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
192 DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
193 DocumentEditingEvent::InsertFormattedText => {
194 FlatEventKind::DocumentEditingInsertFormattedText
195 }
196 DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
197 DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
198 DocumentEditingEvent::InsertFragment => {
199 FlatEventKind::DocumentEditingInsertFragment
200 }
201 DocumentEditingEvent::InsertHtmlAtPosition => {
202 FlatEventKind::DocumentEditingInsertHtmlAtPosition
203 }
204 DocumentEditingEvent::InsertMarkdownAtPosition => {
205 FlatEventKind::DocumentEditingInsertMarkdownAtPosition
206 }
207 DocumentEditingEvent::InsertTable => FlatEventKind::DocumentEditingInsertTable,
208 DocumentEditingEvent::RemoveTable => FlatEventKind::DocumentEditingRemoveTable,
209 DocumentEditingEvent::InsertTableRow => {
210 FlatEventKind::DocumentEditingInsertTableRow
211 }
212 DocumentEditingEvent::InsertTableColumn => {
213 FlatEventKind::DocumentEditingInsertTableColumn
214 }
215 DocumentEditingEvent::RemoveTableRow => {
216 FlatEventKind::DocumentEditingRemoveTableRow
217 }
218 DocumentEditingEvent::RemoveTableColumn => {
219 FlatEventKind::DocumentEditingRemoveTableColumn
220 }
221 DocumentEditingEvent::MergeTableCells => {
222 FlatEventKind::DocumentEditingMergeTableCells
223 }
224 DocumentEditingEvent::SplitTableCell => {
225 FlatEventKind::DocumentEditingSplitTableCell
226 }
227 DocumentEditingEvent::AddBlockToList => {
228 FlatEventKind::DocumentEditingAddBlockToList
229 }
230 DocumentEditingEvent::RemoveBlockFromList => {
231 FlatEventKind::DocumentEditingRemoveBlockFromList
232 }
233 },
234 Origin::DocumentFormatting(fe) => match fe {
235 DocumentFormattingEvent::SetTextFormat => {
236 FlatEventKind::DocumentFormattingSetTextFormat
237 }
238 DocumentFormattingEvent::MergeTextFormat => {
239 FlatEventKind::DocumentFormattingMergeTextFormat
240 }
241 DocumentFormattingEvent::SetBlockFormat => {
242 FlatEventKind::DocumentFormattingSetBlockFormat
243 }
244 DocumentFormattingEvent::SetFrameFormat => {
245 FlatEventKind::DocumentFormattingSetFrameFormat
246 }
247 DocumentFormattingEvent::SetTableFormat => {
248 FlatEventKind::DocumentFormattingSetTableFormat
249 }
250 DocumentFormattingEvent::SetTableCellFormat => {
251 FlatEventKind::DocumentFormattingSetTableCellFormat
252 }
253 DocumentFormattingEvent::SetListFormat => {
254 FlatEventKind::DocumentFormattingSetListFormat
255 }
256 },
257 Origin::DocumentIo(fe) => match fe {
258 DocumentIoEvent::ImportPlainText => FlatEventKind::DocumentIoImportPlainText,
259 DocumentIoEvent::ExportPlainText => FlatEventKind::DocumentIoExportPlainText,
260 DocumentIoEvent::ImportMarkdown => FlatEventKind::DocumentIoImportMarkdown,
261 DocumentIoEvent::ExportMarkdown => FlatEventKind::DocumentIoExportMarkdown,
262 DocumentIoEvent::ImportHtml => FlatEventKind::DocumentIoImportHtml,
263 DocumentIoEvent::ExportHtml => FlatEventKind::DocumentIoExportHtml,
264 DocumentIoEvent::ExportLatex => FlatEventKind::DocumentIoExportLatex,
265 DocumentIoEvent::ExportDocx => FlatEventKind::DocumentIoExportDocx,
266 },
267 Origin::DocumentSearch(fe) => match fe {
268 DocumentSearchEvent::FindText => FlatEventKind::DocumentSearchFindText,
269 DocumentSearchEvent::FindAll => FlatEventKind::DocumentSearchFindAll,
270 DocumentSearchEvent::ReplaceText => FlatEventKind::DocumentSearchReplaceText,
271 },
272 Origin::DocumentInspection(fe) => match fe {
273 DocumentInspectionEvent::GetDocumentStats => {
274 FlatEventKind::DocumentInspectionGetDocumentStats
275 }
276 DocumentInspectionEvent::GetTextAtPosition => {
277 FlatEventKind::DocumentInspectionGetTextAtPosition
278 }
279 DocumentInspectionEvent::GetBlockAtPosition => {
280 FlatEventKind::DocumentInspectionGetBlockAtPosition
281 }
282 DocumentInspectionEvent::ExtractFragment => {
283 FlatEventKind::DocumentInspectionExtractFragment
284 }
285 },
286 Origin::UndoRedo(ur) => match ur {
287 UndoRedoEvent::Undone => FlatEventKind::UndoPerformed,
288 UndoRedoEvent::Redone => FlatEventKind::RedoPerformed,
289 UndoRedoEvent::BeginComposite => FlatEventKind::CompositeBegin,
290 UndoRedoEvent::EndComposite => FlatEventKind::CompositeEnd,
291 UndoRedoEvent::CancelComposite => FlatEventKind::CompositeCancelled,
292 },
293 Origin::LongOperation(lo) => match lo {
294 LongOperationEvent::Started => FlatEventKind::LongOperationStarted,
295 LongOperationEvent::Progress => FlatEventKind::LongOperationProgress,
296 LongOperationEvent::Completed => FlatEventKind::LongOperationCompleted,
297 LongOperationEvent::Failed => FlatEventKind::LongOperationFailed,
298 LongOperationEvent::Cancelled => FlatEventKind::LongOperationCancelled,
299 },
300 };
301 FlatEvent {
302 kind,
303 ids: event.ids,
304 data: event.data,
305 }
306 }
307}
308
309pub fn is_mutation(kind: &FlatEventKind) -> bool {
311 use FlatEventKind::*;
312 matches!(
313 kind,
314 RootCreated
315 | RootUpdated
316 | RootRemoved
317 | DocumentCreated
318 | DocumentUpdated
319 | DocumentRemoved
320 | FrameCreated
321 | FrameUpdated
322 | FrameRemoved
323 | BlockCreated
324 | BlockUpdated
325 | BlockRemoved
326 | InlineElementCreated
327 | InlineElementUpdated
328 | InlineElementRemoved
329 | ListCreated
330 | ListUpdated
331 | ListRemoved
332 | ResourceCreated
333 | ResourceUpdated
334 | ResourceRemoved
335 | TableCreated
336 | TableUpdated
337 | TableRemoved
338 | TableCellCreated
339 | TableCellUpdated
340 | TableCellRemoved
341 )
342}
343
344#[cfg(test)]
345mod tests {
346 use super::*;
347
348 #[test]
349 fn test_entity_event_converts_to_flat() {
350 let event = Event {
351 origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
352 ids: vec![],
353 data: None,
354 };
355 let flat: FlatEvent = event.into();
356 assert_eq!(flat.kind, FlatEventKind::Reset);
357 }
358
359 #[test]
360 fn test_undo_redo_converts_to_flat() {
361 let event = Event {
362 origin: Origin::UndoRedo(UndoRedoEvent::Undone),
363 ids: vec![],
364 data: None,
365 };
366 let flat: FlatEvent = event.into();
367 assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
368 }
369
370 #[test]
371 fn test_is_mutation() {
372 assert!(is_mutation(&FlatEventKind::RootCreated));
373 assert!(is_mutation(&FlatEventKind::RootUpdated));
374 assert!(is_mutation(&FlatEventKind::RootRemoved));
375
376 assert!(is_mutation(&FlatEventKind::DocumentCreated));
377 assert!(is_mutation(&FlatEventKind::DocumentUpdated));
378 assert!(is_mutation(&FlatEventKind::DocumentRemoved));
379
380 assert!(is_mutation(&FlatEventKind::FrameCreated));
381 assert!(is_mutation(&FlatEventKind::FrameUpdated));
382 assert!(is_mutation(&FlatEventKind::FrameRemoved));
383
384 assert!(is_mutation(&FlatEventKind::BlockCreated));
385 assert!(is_mutation(&FlatEventKind::BlockUpdated));
386 assert!(is_mutation(&FlatEventKind::BlockRemoved));
387
388 assert!(is_mutation(&FlatEventKind::InlineElementCreated));
389 assert!(is_mutation(&FlatEventKind::InlineElementUpdated));
390 assert!(is_mutation(&FlatEventKind::InlineElementRemoved));
391
392 assert!(is_mutation(&FlatEventKind::ListCreated));
393 assert!(is_mutation(&FlatEventKind::ListUpdated));
394 assert!(is_mutation(&FlatEventKind::ListRemoved));
395
396 assert!(is_mutation(&FlatEventKind::ResourceCreated));
397 assert!(is_mutation(&FlatEventKind::ResourceUpdated));
398 assert!(is_mutation(&FlatEventKind::ResourceRemoved));
399
400 assert!(is_mutation(&FlatEventKind::TableCreated));
401 assert!(is_mutation(&FlatEventKind::TableUpdated));
402 assert!(is_mutation(&FlatEventKind::TableRemoved));
403
404 assert!(is_mutation(&FlatEventKind::TableCellCreated));
405 assert!(is_mutation(&FlatEventKind::TableCellUpdated));
406 assert!(is_mutation(&FlatEventKind::TableCellRemoved));
407
408 assert!(!is_mutation(&FlatEventKind::Reset));
409 assert!(!is_mutation(&FlatEventKind::UndoPerformed));
410 assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
411 }
412}