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;
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        nodes: Vec<Node>,
30    },
31    /// 添加标记
32    AddMark {
33        /// 目标节点的路径
34        path: Vec<String>,
35        /// 目标节点的唯一标识符
36        node_id: NodeId,
37        /// 要添加的标记
38        marks: Vec<Mark>,
39    },
40    /// 移除标记
41    RemoveMark {
42        /// 目标节点的路径
43        path: Vec<String>,
44        /// 父节点的唯一标识符
45        parent_id: NodeId,
46        /// 要移除的标记列表
47        marks: Vec<Mark>,
48    },
49    /// 移除节点
50    RemoveNode {
51        /// 目标节点的路径
52        path: Vec<String>,
53        /// 父节点的唯一标识符
54        parent_id: NodeId,
55        /// 要移除的节点列表
56        nodes: Vec<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    /// 排序子节点
67    SortChildren {
68        /// 目标节点的路径
69        path: Vec<String>,
70        /// 父节点的唯一标识符
71        parent_id: NodeId,
72        /// 排序前的子节点列表
73        old_children: Vec<NodeId>,
74        /// 排序后的子节点列表
75        new_children: Vec<NodeId>,
76    },
77}