use common::event::{
AllEvent, DirectAccessEntity, DocumentEditingEvent, DocumentFormattingEvent,
DocumentInspectionEvent, DocumentIoEvent, DocumentSearchEvent, EntityEvent, Event,
LongOperationEvent, Origin, UndoRedoEvent,
};
use common::types::EntityId;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum FlatEventKind {
RootCreated,
RootUpdated,
RootRemoved,
DocumentCreated,
DocumentUpdated,
DocumentRemoved,
FrameCreated,
FrameUpdated,
FrameRemoved,
BlockCreated,
BlockUpdated,
BlockRemoved,
InlineElementCreated,
InlineElementUpdated,
InlineElementRemoved,
ListCreated,
ListUpdated,
ListRemoved,
ResourceCreated,
ResourceUpdated,
ResourceRemoved,
DocumentEditingInsertText,
DocumentEditingDeleteText,
DocumentEditingInsertBlock,
DocumentEditingInsertImage,
DocumentEditingInsertFrame,
DocumentEditingInsertFormattedText,
DocumentEditingCreateList,
DocumentEditingInsertList,
DocumentEditingInsertFragment,
DocumentEditingInsertHtmlAtPosition,
DocumentEditingInsertMarkdownAtPosition,
DocumentFormattingSetTextFormat,
DocumentFormattingMergeTextFormat,
DocumentFormattingSetBlockFormat,
DocumentFormattingSetFrameFormat,
DocumentIoImportPlainText,
DocumentIoExportPlainText,
DocumentIoImportMarkdown,
DocumentIoExportMarkdown,
DocumentIoImportHtml,
DocumentIoExportHtml,
DocumentIoExportLatex,
DocumentIoExportDocx,
DocumentSearchFindText,
DocumentSearchFindAll,
DocumentSearchReplaceText,
DocumentInspectionGetDocumentStats,
DocumentInspectionGetTextAtPosition,
DocumentInspectionGetBlockAtPosition,
DocumentInspectionExtractFragment,
UndoPerformed,
RedoPerformed,
CompositeBegin,
CompositeEnd,
CompositeCancelled,
LongOperationStarted,
LongOperationProgress,
LongOperationCompleted,
LongOperationFailed,
LongOperationCancelled,
Reset,
}
#[derive(Debug, Clone)]
pub struct FlatEvent {
pub kind: FlatEventKind,
pub ids: Vec<EntityId>,
pub data: Option<String>,
}
impl From<Event> for FlatEvent {
fn from(event: Event) -> Self {
let kind = match &event.origin {
Origin::DirectAccess(da) => match da {
DirectAccessEntity::All(AllEvent::Reset) => FlatEventKind::Reset,
DirectAccessEntity::Root(EntityEvent::Created) => FlatEventKind::RootCreated,
DirectAccessEntity::Root(EntityEvent::Updated) => FlatEventKind::RootUpdated,
DirectAccessEntity::Root(EntityEvent::Removed) => FlatEventKind::RootRemoved,
DirectAccessEntity::Document(EntityEvent::Created) => {
FlatEventKind::DocumentCreated
}
DirectAccessEntity::Document(EntityEvent::Updated) => {
FlatEventKind::DocumentUpdated
}
DirectAccessEntity::Document(EntityEvent::Removed) => {
FlatEventKind::DocumentRemoved
}
DirectAccessEntity::Frame(EntityEvent::Created) => FlatEventKind::FrameCreated,
DirectAccessEntity::Frame(EntityEvent::Updated) => FlatEventKind::FrameUpdated,
DirectAccessEntity::Frame(EntityEvent::Removed) => FlatEventKind::FrameRemoved,
DirectAccessEntity::Block(EntityEvent::Created) => FlatEventKind::BlockCreated,
DirectAccessEntity::Block(EntityEvent::Updated) => FlatEventKind::BlockUpdated,
DirectAccessEntity::Block(EntityEvent::Removed) => FlatEventKind::BlockRemoved,
DirectAccessEntity::InlineElement(EntityEvent::Created) => {
FlatEventKind::InlineElementCreated
}
DirectAccessEntity::InlineElement(EntityEvent::Updated) => {
FlatEventKind::InlineElementUpdated
}
DirectAccessEntity::InlineElement(EntityEvent::Removed) => {
FlatEventKind::InlineElementRemoved
}
DirectAccessEntity::List(EntityEvent::Created) => FlatEventKind::ListCreated,
DirectAccessEntity::List(EntityEvent::Updated) => FlatEventKind::ListUpdated,
DirectAccessEntity::List(EntityEvent::Removed) => FlatEventKind::ListRemoved,
DirectAccessEntity::Resource(EntityEvent::Created) => {
FlatEventKind::ResourceCreated
}
DirectAccessEntity::Resource(EntityEvent::Updated) => {
FlatEventKind::ResourceUpdated
}
DirectAccessEntity::Resource(EntityEvent::Removed) => {
FlatEventKind::ResourceRemoved
}
},
Origin::DocumentEditing(fe) => match fe {
DocumentEditingEvent::InsertText => FlatEventKind::DocumentEditingInsertText,
DocumentEditingEvent::DeleteText => FlatEventKind::DocumentEditingDeleteText,
DocumentEditingEvent::InsertBlock => FlatEventKind::DocumentEditingInsertBlock,
DocumentEditingEvent::InsertImage => FlatEventKind::DocumentEditingInsertImage,
DocumentEditingEvent::InsertFrame => FlatEventKind::DocumentEditingInsertFrame,
DocumentEditingEvent::InsertFormattedText => {
FlatEventKind::DocumentEditingInsertFormattedText
}
DocumentEditingEvent::CreateList => FlatEventKind::DocumentEditingCreateList,
DocumentEditingEvent::InsertList => FlatEventKind::DocumentEditingInsertList,
DocumentEditingEvent::InsertFragment => {
FlatEventKind::DocumentEditingInsertFragment
}
DocumentEditingEvent::InsertHtmlAtPosition => {
FlatEventKind::DocumentEditingInsertHtmlAtPosition
}
DocumentEditingEvent::InsertMarkdownAtPosition => {
FlatEventKind::DocumentEditingInsertMarkdownAtPosition
}
},
Origin::DocumentFormatting(fe) => match fe {
DocumentFormattingEvent::SetTextFormat => {
FlatEventKind::DocumentFormattingSetTextFormat
}
DocumentFormattingEvent::MergeTextFormat => {
FlatEventKind::DocumentFormattingMergeTextFormat
}
DocumentFormattingEvent::SetBlockFormat => {
FlatEventKind::DocumentFormattingSetBlockFormat
}
DocumentFormattingEvent::SetFrameFormat => {
FlatEventKind::DocumentFormattingSetFrameFormat
}
},
Origin::DocumentIo(fe) => match fe {
DocumentIoEvent::ImportPlainText => FlatEventKind::DocumentIoImportPlainText,
DocumentIoEvent::ExportPlainText => FlatEventKind::DocumentIoExportPlainText,
DocumentIoEvent::ImportMarkdown => FlatEventKind::DocumentIoImportMarkdown,
DocumentIoEvent::ExportMarkdown => FlatEventKind::DocumentIoExportMarkdown,
DocumentIoEvent::ImportHtml => FlatEventKind::DocumentIoImportHtml,
DocumentIoEvent::ExportHtml => FlatEventKind::DocumentIoExportHtml,
DocumentIoEvent::ExportLatex => FlatEventKind::DocumentIoExportLatex,
DocumentIoEvent::ExportDocx => FlatEventKind::DocumentIoExportDocx,
},
Origin::DocumentSearch(fe) => match fe {
DocumentSearchEvent::FindText => FlatEventKind::DocumentSearchFindText,
DocumentSearchEvent::FindAll => FlatEventKind::DocumentSearchFindAll,
DocumentSearchEvent::ReplaceText => FlatEventKind::DocumentSearchReplaceText,
},
Origin::DocumentInspection(fe) => match fe {
DocumentInspectionEvent::GetDocumentStats => {
FlatEventKind::DocumentInspectionGetDocumentStats
}
DocumentInspectionEvent::GetTextAtPosition => {
FlatEventKind::DocumentInspectionGetTextAtPosition
}
DocumentInspectionEvent::GetBlockAtPosition => {
FlatEventKind::DocumentInspectionGetBlockAtPosition
}
DocumentInspectionEvent::ExtractFragment => {
FlatEventKind::DocumentInspectionExtractFragment
}
},
Origin::UndoRedo(ur) => match ur {
UndoRedoEvent::Undone => FlatEventKind::UndoPerformed,
UndoRedoEvent::Redone => FlatEventKind::RedoPerformed,
UndoRedoEvent::BeginComposite => FlatEventKind::CompositeBegin,
UndoRedoEvent::EndComposite => FlatEventKind::CompositeEnd,
UndoRedoEvent::CancelComposite => FlatEventKind::CompositeCancelled,
},
Origin::LongOperation(lo) => match lo {
LongOperationEvent::Started => FlatEventKind::LongOperationStarted,
LongOperationEvent::Progress => FlatEventKind::LongOperationProgress,
LongOperationEvent::Completed => FlatEventKind::LongOperationCompleted,
LongOperationEvent::Failed => FlatEventKind::LongOperationFailed,
LongOperationEvent::Cancelled => FlatEventKind::LongOperationCancelled,
},
};
FlatEvent {
kind,
ids: event.ids,
data: event.data,
}
}
}
pub fn is_mutation(kind: &FlatEventKind) -> bool {
use FlatEventKind::*;
matches!(
kind,
RootCreated
| RootUpdated
| RootRemoved
| DocumentCreated
| DocumentUpdated
| DocumentRemoved
| FrameCreated
| FrameUpdated
| FrameRemoved
| BlockCreated
| BlockUpdated
| BlockRemoved
| InlineElementCreated
| InlineElementUpdated
| InlineElementRemoved
| ListCreated
| ListUpdated
| ListRemoved
| ResourceCreated
| ResourceUpdated
| ResourceRemoved
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_entity_event_converts_to_flat() {
let event = Event {
origin: Origin::DirectAccess(DirectAccessEntity::All(AllEvent::Reset)),
ids: vec![],
data: None,
};
let flat: FlatEvent = event.into();
assert_eq!(flat.kind, FlatEventKind::Reset);
}
#[test]
fn test_undo_redo_converts_to_flat() {
let event = Event {
origin: Origin::UndoRedo(UndoRedoEvent::Undone),
ids: vec![],
data: None,
};
let flat: FlatEvent = event.into();
assert_eq!(flat.kind, FlatEventKind::UndoPerformed);
}
#[test]
fn test_is_mutation() {
assert!(is_mutation(&FlatEventKind::RootCreated));
assert!(is_mutation(&FlatEventKind::RootUpdated));
assert!(is_mutation(&FlatEventKind::RootRemoved));
assert!(is_mutation(&FlatEventKind::DocumentCreated));
assert!(is_mutation(&FlatEventKind::DocumentUpdated));
assert!(is_mutation(&FlatEventKind::DocumentRemoved));
assert!(is_mutation(&FlatEventKind::FrameCreated));
assert!(is_mutation(&FlatEventKind::FrameUpdated));
assert!(is_mutation(&FlatEventKind::FrameRemoved));
assert!(is_mutation(&FlatEventKind::BlockCreated));
assert!(is_mutation(&FlatEventKind::BlockUpdated));
assert!(is_mutation(&FlatEventKind::BlockRemoved));
assert!(is_mutation(&FlatEventKind::InlineElementCreated));
assert!(is_mutation(&FlatEventKind::InlineElementUpdated));
assert!(is_mutation(&FlatEventKind::InlineElementRemoved));
assert!(is_mutation(&FlatEventKind::ListCreated));
assert!(is_mutation(&FlatEventKind::ListUpdated));
assert!(is_mutation(&FlatEventKind::ListRemoved));
assert!(is_mutation(&FlatEventKind::ResourceCreated));
assert!(is_mutation(&FlatEventKind::ResourceUpdated));
assert!(is_mutation(&FlatEventKind::ResourceRemoved));
assert!(!is_mutation(&FlatEventKind::Reset));
assert!(!is_mutation(&FlatEventKind::UndoPerformed));
assert!(!is_mutation(&FlatEventKind::LongOperationStarted));
}
}