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
74 DocumentFormattingSetTextFormat,
75 DocumentFormattingMergeTextFormat,
76 DocumentFormattingSetBlockFormat,
77 DocumentFormattingSetFrameFormat,
78 DocumentFormattingSetTableFormat,
79 DocumentFormattingSetTableCellFormat,
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::InlineElement(EntityEvent::Created) => {
150 FlatEventKind::InlineElementCreated
151 }
152 DirectAccessEntity::InlineElement(EntityEvent::Updated) => {
153 FlatEventKind::InlineElementUpdated
154 }
155 DirectAccessEntity::InlineElement(EntityEvent::Removed) => {
156 FlatEventKind::InlineElementRemoved
157 }
158 DirectAccessEntity::List(EntityEvent::Created) => FlatEventKind::ListCreated,
159 DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
160 DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
161 DirectAccessEntity::Resource(EntityEvent::Created) => {
162 FlatEventKind::ResourceCreated
163 }
164 DirectAccessEntity::Resource(EntityEvent::Updated) => {
165 FlatEventKind::ResourceUpdated
166 }
167 DirectAccessEntity::Resource(EntityEvent::Removed) => {
168 FlatEventKind::ResourceRemoved
169 }
170 DirectAccessEntity::Table(EntityEvent::Created) => FlatEventKind::TableCreated,
171 DirectAccessEntity::Table(EntityEvent::Updated) => FlatEventKind::TableUpdated,
172 DirectAccessEntity::Table(EntityEvent::Removed) => FlatEventKind::TableRemoved,
173 DirectAccessEntity::TableCell(EntityEvent::Created) => {
174 FlatEventKind::TableCellCreated
175 }
176 DirectAccessEntity::TableCell(EntityEvent::Updated) => {
177 FlatEventKind::TableCellUpdated
178 }
179 DirectAccessEntity::TableCell(EntityEvent::Removed) => {
180 FlatEventKind::TableCellRemoved
181 }
182 },
183
184 Origin::DocumentEditing(fe) => match fe {
185 DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
186 DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
187 DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
188 DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
189 DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
190 DocumentEditingEvent::InsertFormattedText => {
191 FlatEventKind::DocumentEditingInsertFormattedText
192 }
193 DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
194 DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
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 },
225 Origin::DocumentFormatting(fe) => match fe {
226 DocumentFormattingEvent::SetTextFormat => {
227 FlatEventKind::DocumentFormattingSetTextFormat
228 }
229 DocumentFormattingEvent::MergeTextFormat => {
230 FlatEventKind::DocumentFormattingMergeTextFormat
231 }
232 DocumentFormattingEvent::SetBlockFormat => {
233 FlatEventKind::DocumentFormattingSetBlockFormat
234 }
235 DocumentFormattingEvent::SetFrameFormat => {
236 FlatEventKind::DocumentFormattingSetFrameFormat
237 }
238 DocumentFormattingEvent::SetTableFormat => {
239 FlatEventKind::DocumentFormattingSetTableFormat
240 }
241 DocumentFormattingEvent::SetTableCellFormat => {
242 FlatEventKind::DocumentFormattingSetTableCellFormat
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 | InlineElementCreated
315 | InlineElementUpdated
316 | InlineElementRemoved
317 | ListCreated
318 | ListUpdated
319 | ListRemoved
320 | ResourceCreated
321 | ResourceUpdated
322 | ResourceRemoved
323 | TableCreated
324 | TableUpdated
325 | TableRemoved
326 | TableCellCreated
327 | TableCellUpdated
328 | TableCellRemoved
329 )
330}
331
332#[cfg(test)]
333mod tests {
334 use super::*;
335
336 #[test]
337 fn test_entity_event_converts_to_flat() {
338 let event = Event {
339 origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
340 ids: vec![],
341 data: None,
342 };
343 let flat: FlatEvent = event.into();
344 assert_eq!(flat.kind, FlatEventKind::Reset);
345 }
346
347 #[test]
348 fn test_undo_redo_converts_to_flat() {
349 let event = Event {
350 origin: Origin::UndoRedo(UndoRedoEvent::Undone),
351 ids: vec![],
352 data: None,
353 };
354 let flat: FlatEvent = event.into();
355 assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
356 }
357
358 #[test]
359 fn test_is_mutation() {
360 assert!(is_mutation(&FlatEventKind::RootCreated));
361 assert!(is_mutation(&FlatEventKind::RootUpdated));
362 assert!(is_mutation(&FlatEventKind::RootRemoved));
363
364 assert!(is_mutation(&FlatEventKind::DocumentCreated));
365 assert!(is_mutation(&FlatEventKind::DocumentUpdated));
366 assert!(is_mutation(&FlatEventKind::DocumentRemoved));
367
368 assert!(is_mutation(&FlatEventKind::FrameCreated));
369 assert!(is_mutation(&FlatEventKind::FrameUpdated));
370 assert!(is_mutation(&FlatEventKind::FrameRemoved));
371
372 assert!(is_mutation(&FlatEventKind::BlockCreated));
373 assert!(is_mutation(&FlatEventKind::BlockUpdated));
374 assert!(is_mutation(&FlatEventKind::BlockRemoved));
375
376 assert!(is_mutation(&FlatEventKind::InlineElementCreated));
377 assert!(is_mutation(&FlatEventKind::InlineElementUpdated));
378 assert!(is_mutation(&FlatEventKind::InlineElementRemoved));
379
380 assert!(is_mutation(&FlatEventKind::ListCreated));
381 assert!(is_mutation(&FlatEventKind::ListUpdated));
382 assert!(is_mutation(&FlatEventKind::ListRemoved));
383
384 assert!(is_mutation(&FlatEventKind::ResourceCreated));
385 assert!(is_mutation(&FlatEventKind::ResourceUpdated));
386 assert!(is_mutation(&FlatEventKind::ResourceRemoved));
387
388 assert!(is_mutation(&FlatEventKind::TableCreated));
389 assert!(is_mutation(&FlatEventKind::TableUpdated));
390 assert!(is_mutation(&FlatEventKind::TableRemoved));
391
392 assert!(is_mutation(&FlatEventKind::TableCellCreated));
393 assert!(is_mutation(&FlatEventKind::TableCellUpdated));
394 assert!(is_mutation(&FlatEventKind::TableCellRemoved));
395
396 assert!(!is_mutation(&FlatEventKind::Reset));
397 assert!(!is_mutation(&FlatEventKind::UndoPerformed));
398 assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
399 }
400}