feat: add operations of the document

This commit is contained in:
Vincent Chan 2022-08-17 16:20:56 +08:00
parent 7d404ff0da
commit 2466b3eebc
4 changed files with 61 additions and 0 deletions
shared-lib/lib-ot/src/core/document

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

@ -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,
}

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