diff --git a/shared-lib/lib-ot/src/core/document/attributes.rs b/shared-lib/lib-ot/src/core/document/attributes.rs index ae9d1fbffb..1b898ccbb3 100644 --- a/shared-lib/lib-ot/src/core/document/attributes.rs +++ b/shared-lib/lib-ot/src/core/document/attributes.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; +#[derive(Clone)] pub struct NodeAttributes(HashMap>); impl NodeAttributes { diff --git a/shared-lib/lib-ot/src/core/document/document_operation.rs b/shared-lib/lib-ot/src/core/document/document_operation.rs new file mode 100644 index 0000000000..b1e797a146 --- /dev/null +++ b/shared-lib/lib-ot/src/core/document/document_operation.rs @@ -0,0 +1,57 @@ +use crate::core::document::position::Position; +use crate::core::{NodeAttributes, TextDelta}; +use indextree::NodeId; + +pub enum DocumentOperation { + Insert(InsertOperation), + Update(UpdateOperation), + Delete(DeleteOperation), + TextEdit(TextEditOperation), +} + +impl DocumentOperation { + pub fn invert(&self) -> DocumentOperation { + match self { + DocumentOperation::Insert(insert_operation) => DocumentOperation::Delete(DeleteOperation { + path: insert_operation.path.clone(), + nodes: insert_operation.nodes.clone(), + }), + DocumentOperation::Update(update_operation) => DocumentOperation::Update(UpdateOperation { + path: update_operation.path.clone(), + attributes: update_operation.old_attributes.clone(), + old_attributes: update_operation.attributes.clone(), + }), + DocumentOperation::Delete(delete_operation) => DocumentOperation::Insert(InsertOperation { + path: delete_operation.path.clone(), + nodes: delete_operation.nodes.clone(), + }), + DocumentOperation::TextEdit(text_edit_operation) => DocumentOperation::TextEdit(TextEditOperation { + path: text_edit_operation.path.clone(), + delta: text_edit_operation.inverted.clone(), + inverted: text_edit_operation.delta.clone(), + }), + } + } +} + +pub struct InsertOperation { + path: Position, + nodes: Vec, +} + +pub struct UpdateOperation { + path: Position, + attributes: NodeAttributes, + old_attributes: NodeAttributes, +} + +pub struct DeleteOperation { + path: Position, + nodes: Vec, +} + +pub struct TextEditOperation { + path: Position, + delta: TextDelta, + inverted: TextDelta, +} diff --git a/shared-lib/lib-ot/src/core/document/mod.rs b/shared-lib/lib-ot/src/core/document/mod.rs index efbf9f362c..81008fa50e 100644 --- a/shared-lib/lib-ot/src/core/document/mod.rs +++ b/shared-lib/lib-ot/src/core/document/mod.rs @@ -1,8 +1,10 @@ mod attributes; mod document; +mod document_operation; mod node; mod position; pub use attributes::*; pub use document::*; +pub use document_operation::*; pub use node::*; diff --git a/shared-lib/lib-ot/src/core/document/position.rs b/shared-lib/lib-ot/src/core/document/position.rs index 6e1983b440..60a69ce8be 100644 --- a/shared-lib/lib-ot/src/core/document/position.rs +++ b/shared-lib/lib-ot/src/core/document/position.rs @@ -1,3 +1,4 @@ +#[derive(Clone)] pub struct Position(pub Vec); impl Position {