moduforge_transform/
lib.rs

1use 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/// 批量操作步骤
90#[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                    // 继续执行下一个步骤
141                },
142                Err(err) => return Err(err),
143            }
144        }
145        dart.begin = false;
146        // 所有步骤执行成功,提交更改
147        Ok(dart.commit())
148    }
149
150    fn to_concrete(&self) -> ConcreteStep {
151        ConcreteStep::BatchStep(self.clone())
152    }
153}