moduforge_transform/
patch.rs

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