moduforge_core/model/
patch.rs

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