moduforge_transform/
node_step.rs

1use std::sync::Arc;
2
3use moduforge_model::{node::Node, schema::Schema, types::NodeId};
4use crate::draft::Draft;
5
6use super::{
7    ConcreteStep,
8    step::{Step, StepResult},
9    transform::TransformError,
10};
11use serde::{Deserialize, Serialize};
12/// 添加节点的步骤
13#[derive(Debug, Serialize, Deserialize, Clone)]
14pub struct AddNodeStep {
15    parent_id: NodeId,
16    nodes: Vec<Node>,
17}
18impl AddNodeStep {
19    pub fn new(
20        parent_id: NodeId,
21        nodes: Vec<Node>,
22    ) -> Self {
23        AddNodeStep { parent_id, nodes }
24    }
25}
26impl Step for AddNodeStep {
27    fn apply(
28        &self,
29        dart: &mut Draft,
30        schema: Arc<Schema>,
31    ) -> Result<StepResult, TransformError> {
32        let _ = schema;
33
34        match dart.add_node(&self.parent_id, &self.nodes) {
35            Ok(()) => Ok(dart.commit()),
36            Err(err) => Err(TransformError::new(err.to_string())),
37        }
38    }
39
40    fn to_concrete(&self) -> super::ConcreteStep {
41        ConcreteStep::AddNodeStep(self.clone())
42    }
43}
44/// 删除节点的步骤
45#[derive(Debug, Serialize, Deserialize, Clone)]
46pub struct RemoveNodeStep {
47    parent_id: NodeId,
48    node_ids: Vec<NodeId>,
49}
50impl RemoveNodeStep {
51    pub fn new(
52        parent_id: NodeId,
53        node_ids: Vec<NodeId>,
54    ) -> Self {
55        RemoveNodeStep { parent_id, node_ids }
56    }
57}
58impl Step for RemoveNodeStep {
59    fn apply(
60        &self,
61        dart: &mut Draft,
62        schema: Arc<Schema>,
63    ) -> Result<StepResult, TransformError> {
64        let _ = schema;
65
66        match dart.remove_node(&self.parent_id, self.node_ids.clone()) {
67            Ok(()) => Ok(dart.commit()),
68            Err(err) => Err(TransformError::new(err.to_string())),
69        }
70    }
71
72    fn to_concrete(&self) -> super::ConcreteStep {
73        ConcreteStep::RemoveNodeStep(self.clone())
74    }
75}
76
77#[derive(Debug, Serialize, Deserialize, Clone)]
78pub struct MoveNodeStep {
79    source_parent_id: NodeId,
80    target_parent_id: NodeId,
81    node_id: NodeId,
82    position: Option<usize>, // 目标位置,None 表示追加到末尾
83}
84
85impl MoveNodeStep {
86    pub fn new(
87        source_parent_id: NodeId,
88        target_parent_id: NodeId,
89        node_id: NodeId,
90        position: Option<usize>,
91    ) -> Self {
92        MoveNodeStep { source_parent_id, target_parent_id, node_id, position }
93    }
94}
95
96impl Step for MoveNodeStep {
97    fn apply(
98        &self,
99        dart: &mut Draft,
100        schema: Arc<Schema>,
101    ) -> Result<StepResult, TransformError> {
102        let _ = schema;
103
104        match dart.move_node(
105            &self.source_parent_id,
106            &self.target_parent_id,
107            &self.node_id,
108            self.position,
109        ) {
110            Ok(()) => Ok(dart.commit()),
111            Err(err) => Err(TransformError::new(err.to_string())),
112        }
113    }
114
115    fn to_concrete(&self) -> super::ConcreteStep {
116        ConcreteStep::MoveNodeStep(self.clone())
117    }
118}
119
120/// 替换节点
121#[derive(Debug, Serialize, Deserialize, Clone)]
122pub struct ReplaceNodeStep {
123    node_id: NodeId,
124    nodes: Vec<Node>,
125}
126impl ReplaceNodeStep {
127    pub fn new(
128        node_id: NodeId,
129        nodes: Vec<Node>,
130    ) -> Self {
131        ReplaceNodeStep { node_id, nodes }
132    }
133}
134impl Step for ReplaceNodeStep {
135    fn apply(
136        &self,
137        dart: &mut Draft,
138        schema: Arc<Schema>,
139    ) -> Result<StepResult, TransformError> {
140        let _ = schema;
141
142        match dart.replace_node(self.node_id.clone(), &self.nodes) {
143            Ok(()) => Ok(dart.commit()),
144            Err(err) => Err(TransformError::new(err.to_string())),
145        }
146    }
147
148    fn to_concrete(&self) -> super::ConcreteStep {
149        ConcreteStep::ReplaceNodeStep(self.clone())
150    }
151}