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