moduforge_transform/
patch.rs

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