Pārlūkot izejas kodu

feat: add operations of the document

Vincent Chan 2 gadi atpakaļ
vecāks
revīzija
2466b3eebc

+ 1 - 0
shared-lib/lib-ot/src/core/document/attributes.rs

@@ -1,5 +1,6 @@
 use std::collections::HashMap;
 
+#[derive(Clone)]
 pub struct NodeAttributes(HashMap<String, Option<String>>);
 
 impl NodeAttributes {

+ 57 - 0
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<NodeId>,
+}
+
+pub struct UpdateOperation {
+    path: Position,
+    attributes: NodeAttributes,
+    old_attributes: NodeAttributes,
+}
+
+pub struct DeleteOperation {
+    path: Position,
+    nodes: Vec<NodeId>,
+}
+
+pub struct TextEditOperation {
+    path: Position,
+    delta: TextDelta,
+    inverted: TextDelta,
+}

+ 2 - 0
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::*;

+ 1 - 0
shared-lib/lib-ot/src/core/document/position.rs

@@ -1,3 +1,4 @@
+#[derive(Clone)]
 pub struct Position(pub Vec<usize>);
 
 impl Position {