moduforge_core/model/
patch.rs

1use serde::{Deserialize, Serialize};
2
3use super::{mark::Mark, node::Node, types::NodeId};
4use std::{collections::HashMap, sync::Arc};
5
6/// 文档补丁枚举
7/// 用于描述对文档树的各种修改操作
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub enum Patch {
10    /// 更新节点属性
11    UpdateAttr {
12        /// 节点路径,用于定位节点位置
13        path: Vec<String>,
14        /// 目标节点的唯一标识符
15        id: NodeId,
16        /// 更新前的属性映射
17        old: HashMap<String, String>,
18        /// 更新后的属性映射
19        new: HashMap<String, String>,
20    },
21    /// 添加新节点
22    AddNode {
23        /// 新节点的路径
24        path: Vec<String>,
25        /// 父节点的唯一标识符
26        parent_id: NodeId,
27        /// 要添加的节点
28        node: Arc<Node>,
29    },
30    /// 添加标记
31    AddMark {
32        /// 目标节点的路径
33        path: Vec<String>,
34        /// 目标节点的唯一标识符
35        node_id: NodeId,
36        /// 要添加的标记
37        mark: Mark,
38    },
39    /// 移除标记
40    RemoveMark {
41        /// 目标节点的路径
42        path: Vec<String>,
43        /// 父节点的唯一标识符
44        parent_id: NodeId,
45        /// 要移除的标记列表
46        marks: Vec<Arc<Mark>>,
47    },
48    /// 移除节点
49    RemoveNode {
50        /// 目标节点的路径
51        path: Vec<String>,
52        /// 父节点的唯一标识符
53        parent_id: NodeId,
54        /// 要移除的节点列表
55        nodes: Vec<Arc<Node>>,
56    },
57    /// 移动节点
58    MoveNode {
59        path: Vec<String>,
60        node_id: NodeId,
61        source_parent_id: NodeId,
62        target_parent_id: NodeId,
63        position: Option<usize>,
64    },
65    ReplaceNode {
66        path: Vec<String>,
67        old: Arc<Node>,
68        new: Arc<Node>,
69    },
70}