moduforge_transform/
lib.rs1use std::sync::Arc;
2
3use attr_step::AttrStep;
4use draft::Draft;
5use mark_step::AddMarkStep;
6use node_step::{AddNodeStep, MoveNodeStep, RemoveNodeStep, ReplaceNodeStep};
7use patch::Patch;
8use serde::{Deserialize, Serialize};
9use step::{Step, StepResult};
10use transform::TransformError;
11
12use moduforge_model::schema::Schema;
13pub mod attr_step;
14pub mod draft;
15pub mod mark_step;
16pub mod node_step;
17pub mod patch;
18pub mod step;
19pub mod transform;
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub enum ConcreteStep {
23 UpdateAttrs(AttrStep),
24 AddNodeStep(AddNodeStep),
25 AddMarkStep(AddMarkStep),
26 RemoveNodeStep(RemoveNodeStep),
27 PatchStep(PatchStep),
28 MoveNodeStep(MoveNodeStep),
29 ReplaceNodeStep(ReplaceNodeStep),
30 BatchStep(BatchStep),
31}
32impl Step for ConcreteStep {
33 fn apply(
34 &self,
35 dart: &mut Draft,
36 schema: std::sync::Arc<moduforge_model::schema::Schema>,
37 ) -> Result<step::StepResult, transform::TransformError> {
38 match self {
39 ConcreteStep::UpdateAttrs(attr_step) => {
40 attr_step.apply(dart, schema)
41 },
42 ConcreteStep::AddNodeStep(add_node_step) => {
43 add_node_step.apply(dart, schema)
44 },
45 ConcreteStep::AddMarkStep(add_mark_step) => {
46 add_mark_step.apply(dart, schema)
47 },
48 ConcreteStep::RemoveNodeStep(remove_node_step) => {
49 remove_node_step.apply(dart, schema)
50 },
51 ConcreteStep::PatchStep(patch_step) => {
52 patch_step.apply(dart, schema)
53 },
54 ConcreteStep::MoveNodeStep(move_node_step) => {
55 move_node_step.apply(dart, schema)
56 },
57 ConcreteStep::BatchStep(batch_step) => {
58 batch_step.apply(dart, schema)
59 },
60 ConcreteStep::ReplaceNodeStep(replace_node_step) => {
61 replace_node_step.apply(dart, schema)
62 },
63 }
64 }
65 fn to_concrete(&self) -> ConcreteStep {
66 self.clone()
67 }
68}
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct PatchStep {
71 pub patches: Vec<Patch>,
72}
73impl Step for PatchStep {
74 fn apply(
75 &self,
76 dart: &mut Draft,
77 _: std::sync::Arc<moduforge_model::schema::Schema>,
78 ) -> Result<step::StepResult, transform::TransformError> {
79 match dart.apply_patches(&self.patches) {
80 Ok(()) => Ok(dart.commit()),
81 Err(err) => Err(TransformError::new(err.to_string())),
82 }
83 }
84
85 fn to_concrete(&self) -> ConcreteStep {
86 ConcreteStep::PatchStep(self.clone())
87 }
88}
89#[derive(Debug, Serialize, Deserialize, Clone)]
91pub struct BatchStep {
92 steps: Vec<ConcreteStep>,
93}
94
95impl BatchStep {
96 pub fn new(steps: Vec<ConcreteStep>) -> Self {
97 BatchStep { steps }
98 }
99}
100impl Step for BatchStep {
101 fn apply(
102 &self,
103 dart: &mut Draft,
104 schema: Arc<Schema>,
105 ) -> Result<StepResult, TransformError> {
106 dart.begin = true;
107 for step in &self.steps {
108 let schema = schema.clone();
109 let result = match step {
110 ConcreteStep::UpdateAttrs(attr_step) => {
111 attr_step.apply(dart, schema)
112 },
113 ConcreteStep::AddNodeStep(add_node_step) => {
114 add_node_step.apply(dart, schema)
115 },
116 ConcreteStep::AddMarkStep(add_mark_step) => {
117 add_mark_step.apply(dart, schema)
118 },
119 ConcreteStep::RemoveNodeStep(remove_node_step) => {
120 remove_node_step.apply(dart, schema)
121 },
122 ConcreteStep::PatchStep(patch_step) => {
123 patch_step.apply(dart, schema)
124 },
125 ConcreteStep::MoveNodeStep(move_node_step) => {
126 move_node_step.apply(dart, schema)
127 },
128 ConcreteStep::ReplaceNodeStep(replace_node_step) => {
129 replace_node_step.apply(dart, schema)
130 },
131 ConcreteStep::BatchStep(batch_setp) => {
132 batch_setp.apply(dart, schema)
133 },
134 };
135 match result {
136 Ok(result) => {
137 if let Some(message) = result.failed {
138 return Ok(StepResult::fail(message));
139 }
140 },
142 Err(err) => return Err(err),
143 }
144 }
145 dart.begin = false;
146 Ok(dart.commit())
148 }
149
150 fn to_concrete(&self) -> ConcreteStep {
151 ConcreteStep::BatchStep(self.clone())
152 }
153}