moduforge_transform/
node_step.rs1use 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#[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#[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>, }
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#[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}