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
47 DocumentEditingInsertText,
49 DocumentEditingDeleteText,
50 DocumentEditingInsertBlock,
51 DocumentEditingInsertImage,
52 DocumentEditingInsertFrame,
53 DocumentEditingInsertFormattedText,
54 DocumentEditingCreateList,
55 DocumentEditingInsertList,
56 DocumentEditingInsertFragment,
57 DocumentEditingInsertHtmlAtPosition,
58 DocumentEditingInsertMarkdownAtPosition,
59
60 DocumentFormattingSetTextFormat,
61 DocumentFormattingMergeTextFormat,
62 DocumentFormattingSetBlockFormat,
63 DocumentFormattingSetFrameFormat,
64
65 DocumentIoImportPlainText,
66 DocumentIoExportPlainText,
67 DocumentIoImportMarkdown,
68 DocumentIoExportMarkdown,
69 DocumentIoImportHtml,
70 DocumentIoExportHtml,
71 DocumentIoExportLatex,
72 DocumentIoExportDocx,
73
74 DocumentSearchFindText,
75 DocumentSearchFindAll,
76 DocumentSearchReplaceText,
77
78 DocumentInspectionGetDocumentStats,
79 DocumentInspectionGetTextAtPosition,
80 DocumentInspectionGetBlockAtPosition,
81 DocumentInspectionExtractFragment,
82
83 UndoPerformed,
85 RedoPerformed,
86 CompositeBegin,
87 CompositeEnd,
88 CompositeCancelled,
89
90 LongOperationStarted,
92 LongOperationProgress,
93 LongOperationCompleted,
94 LongOperationFailed,
95 LongOperationCancelled,
96
97 Reset,
99}
100
101#[derive(Debug, Clone)]
103pub struct FlatEvent {
104 pub kind: FlatEventKind,
105 pub ids: Vec<EntityId>,
106 pub data: Option<String>,
107}
108
109impl From<Event> for FlatEvent {
110 fn from(event: Event) -> Self {
111 let kind = match &event.origin {
112 Origin::DirectAccess(da) => match da {
113 DirectAccessEntity::All(AllEvent::Reset) => FlatEventKind::Reset,
114
115 DirectAccessEntity::Root(EntityEvent::Created) => FlatEventKind::RootCreated,
116 DirectAccessEntity::Root(EntityEvent::Updated) => FlatEventKind::RootUpdated,
117 DirectAccessEntity::Root(EntityEvent::Removed) => FlatEventKind::RootRemoved,
118 DirectAccessEntity::Document(EntityEvent::Created) => {
119 FlatEventKind::DocumentCreated
120 }
121 DirectAccessEntity::Document(EntityEvent::Updated) => {
122 FlatEventKind::DocumentUpdated
123 }
124 DirectAccessEntity::Document(EntityEvent::Removed) => {
125 FlatEventKind::DocumentRemoved
126 }
127 DirectAccessEntity::Frame(EntityEvent::Created) => FlatEventKind::FrameCreated,
128 DirectAccessEntity::Frame(EntityEvent::Updated) => FlatEventKind::FrameUpdated,
129 DirectAccessEntity::Frame(EntityEvent::Removed) => FlatEventKind::FrameRemoved,
130 DirectAccessEntity::Block(EntityEvent::Created) => FlatEventKind::BlockCreated,
131 DirectAccessEntity::Block(EntityEvent::Updated) => FlatEventKind::BlockUpdated,
132 DirectAccessEntity::Block(EntityEvent::Removed) => FlatEventKind::BlockRemoved,
133 DirectAccessEntity::InlineElement(EntityEvent::Created) => {
134 FlatEventKind::InlineElementCreated
135 }
136 DirectAccessEntity::InlineElement(EntityEvent::Updated) => {
137 FlatEventKind::InlineElementUpdated
138 }
139 DirectAccessEntity::InlineElement(EntityEvent::Removed) => {
140 FlatEventKind::InlineElementRemoved
141 }
142 DirectAccessEntity::List(EntityEvent::Created) => FlatEventKind::ListCreated,
143 DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
144 DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
145 DirectAccessEntity::Resource(EntityEvent::Created) => {
146 FlatEventKind::ResourceCreated
147 }
148 DirectAccessEntity::Resource(EntityEvent::Updated) => {
149 FlatEventKind::ResourceUpdated
150 }
151 DirectAccessEntity::Resource(EntityEvent::Removed) => {
152 FlatEventKind::ResourceRemoved
153 }
154 },
155
156 Origin::DocumentEditing(fe) => match fe {
157 DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
158 DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
159 DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
160 DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
161 DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
162 DocumentEditingEvent::InsertFormattedText => {
163 FlatEventKind::DocumentEditingInsertFormattedText
164 }
165 DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
166 DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
167 DocumentEditingEvent::InsertFragment => {
168 FlatEventKind::DocumentEditingInsertFragment
169 }
170 DocumentEditingEvent::InsertHtmlAtPosition => {
171 FlatEventKind::DocumentEditingInsertHtmlAtPosition
172 }
173 DocumentEditingEvent::InsertMarkdownAtPosition => {
174 FlatEventKind::DocumentEditingInsertMarkdownAtPosition
175 }
176 },
177 Origin::DocumentFormatting(fe) => match fe {
178 DocumentFormattingEvent::SetTextFormat => {
179 FlatEventKind::DocumentFormattingSetTextFormat
180 }
181 DocumentFormattingEvent::MergeTextFormat => {
182 FlatEventKind::DocumentFormattingMergeTextFormat
183 }
184 DocumentFormattingEvent::SetBlockFormat => {
185 FlatEventKind::DocumentFormattingSetBlockFormat
186 }
187 DocumentFormattingEvent::SetFrameFormat => {
188 FlatEventKind::DocumentFormattingSetFrameFormat
189 }
190 },
191 Origin::DocumentIo(fe) => match fe {
192 DocumentIoEvent::ImportPlainText => FlatEventKind::DocumentIoImportPlainText,
193 DocumentIoEvent::ExportPlainText => FlatEventKind::DocumentIoExportPlainText,
194 DocumentIoEvent::ImportMarkdown => FlatEventKind::DocumentIoImportMarkdown,
195 DocumentIoEvent::ExportMarkdown => FlatEventKind::DocumentIoExportMarkdown,
196 DocumentIoEvent::ImportHtml => FlatEventKind::DocumentIoImportHtml,
197 DocumentIoEvent::ExportHtml => FlatEventKind::DocumentIoExportHtml,
198 DocumentIoEvent::ExportLatex => FlatEventKind::DocumentIoExportLatex,
199 DocumentIoEvent::ExportDocx => FlatEventKind::DocumentIoExportDocx,
200 },
201 Origin::DocumentSearch(fe) => match fe {
202 DocumentSearchEvent::FindText => FlatEventKind::DocumentSearchFindText,
203 DocumentSearchEvent::FindAll => FlatEventKind::DocumentSearchFindAll,
204 DocumentSearchEvent::ReplaceText => FlatEventKind::DocumentSearchReplaceText,
205 },
206 Origin::DocumentInspection(fe) => match fe {
207 DocumentInspectionEvent::GetDocumentStats => {
208 FlatEventKind::DocumentInspectionGetDocumentStats
209 }
210 DocumentInspectionEvent::GetTextAtPosition => {
211 FlatEventKind::DocumentInspectionGetTextAtPosition
212 }
213 DocumentInspectionEvent::GetBlockAtPosition => {
214 FlatEventKind::DocumentInspectionGetBlockAtPosition
215 }
216 DocumentInspectionEvent::ExtractFragment => {
217 FlatEventKind::DocumentInspectionExtractFragment
218 }
219 },
220 Origin::UndoRedo(ur) => match ur {
221 UndoRedoEvent::Undone => FlatEventKind::UndoPerformed,
222 UndoRedoEvent::Redone => FlatEventKind::RedoPerformed,
223 UndoRedoEvent::BeginComposite => FlatEventKind::CompositeBegin,
224 UndoRedoEvent::EndComposite => FlatEventKind::CompositeEnd,
225 UndoRedoEvent::CancelComposite => FlatEventKind::CompositeCancelled,
226 },
227 Origin::LongOperation(lo) => match lo {
228 LongOperationEvent::Started => FlatEventKind::LongOperationStarted,
229 LongOperationEvent::Progress => FlatEventKind::LongOperationProgress,
230 LongOperationEvent::Completed => FlatEventKind::LongOperationCompleted,
231 LongOperationEvent::Failed => FlatEventKind::LongOperationFailed,
232 LongOperationEvent::Cancelled => FlatEventKind::LongOperationCancelled,
233 },
234 };
235 FlatEvent {
236 kind,
237 ids: event.ids,
238 data: event.data,
239 }
240 }
241}
242
243pub fn is_mutation(kind: &FlatEventKind) -> bool {
245 use FlatEventKind::*;
246 matches!(
247 kind,
248 RootCreated
249 | RootUpdated
250 | RootRemoved
251 | DocumentCreated
252 | DocumentUpdated
253 | DocumentRemoved
254 | FrameCreated
255 | FrameUpdated
256 | FrameRemoved
257 | BlockCreated
258 | BlockUpdated
259 | BlockRemoved
260 | InlineElementCreated
261 | InlineElementUpdated
262 | InlineElementRemoved
263 | ListCreated
264 | ListUpdated
265 | ListRemoved
266 | ResourceCreated
267 | ResourceUpdated
268 | ResourceRemoved
269 )
270}
271
272#[cfg(test)]
273mod tests {
274 use super::*;
275
276 #[test]
277 fn test_entity_event_converts_to_flat() {
278 let event = Event {
279 origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
280 ids: vec![],
281 data: None,
282 };
283 let flat: FlatEvent = event.into();
284 assert_eq!(flat.kind, FlatEventKind::Reset);
285 }
286
287 #[test]
288 fn test_undo_redo_converts_to_flat() {
289 let event = Event {
290 origin: Origin::UndoRedo(UndoRedoEvent::Undone),
291 ids: vec![],
292 data: None,
293 };
294 let flat: FlatEvent = event.into();
295 assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
296 }
297
298 #[test]
299 fn test_is_mutation() {
300 assert!(is_mutation(&FlatEventKind::RootCreated));
301 assert!(is_mutation(&FlatEventKind::RootUpdated));
302 assert!(is_mutation(&FlatEventKind::RootRemoved));
303
304 assert!(is_mutation(&FlatEventKind::DocumentCreated));
305 assert!(is_mutation(&FlatEventKind::DocumentUpdated));
306 assert!(is_mutation(&FlatEventKind::DocumentRemoved));
307
308 assert!(is_mutation(&FlatEventKind::FrameCreated));
309 assert!(is_mutation(&FlatEventKind::FrameUpdated));
310 assert!(is_mutation(&FlatEventKind::FrameRemoved));
311
312 assert!(is_mutation(&FlatEventKind::BlockCreated));
313 assert!(is_mutation(&FlatEventKind::BlockUpdated));
314 assert!(is_mutation(&FlatEventKind::BlockRemoved));
315
316 assert!(is_mutation(&FlatEventKind::InlineElementCreated));
317 assert!(is_mutation(&FlatEventKind::InlineElementUpdated));
318 assert!(is_mutation(&FlatEventKind::InlineElementRemoved));
319
320 assert!(is_mutation(&FlatEventKind::ListCreated));
321 assert!(is_mutation(&FlatEventKind::ListUpdated));
322 assert!(is_mutation(&FlatEventKind::ListRemoved));
323
324 assert!(is_mutation(&FlatEventKind::ResourceCreated));
325 assert!(is_mutation(&FlatEventKind::ResourceUpdated));
326 assert!(is_mutation(&FlatEventKind::ResourceRemoved));
327
328 assert!(!is_mutation(&FlatEventKind::Reset));
329 assert!(!is_mutation(&FlatEventKind::UndoPerformed));
330 assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
331 }
332}