moduforge_core/transform/
mod.rs

1use std::sync::Arc;
2
3use attr_step::AttrStep;
4use mark_step::AddMarkStep;
5use node_step::{AddNodeStep, MoveNodeStep, RemoveNodeStep, ReplaceNodeStep};
6use serde::{Deserialize, Serialize};
7use step::{Step, StepResult};
8use transform::TransformError;
9
10use crate::model::{node_pool::Draft, patch::Patch, schema::Schema};
11pub mod attr_step;
12pub mod mark_step;
13pub mod node_step;
14pub mod step;
15pub mod transform;
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub enum ConcreteStep {
19    UpdateAttrs(AttrStep),
20    AddNodeStep(AddNodeStep),
21    AddMarkStep(AddMarkStep),
22    RemoveNodeStep(RemoveNodeStep),
23    PatchStep(PatchStep),
24    MoveNodeStep(MoveNodeStep),
25    ReplaceNodeStep(ReplaceNodeStep),
26    BatchStep(BatchStep),
27}
28impl Step for ConcreteStep {
29    fn apply(
30        &self,
31        dart: &mut Draft,
32        schema: std::sync::Arc<crate::model::schema::Schema>,
33    ) -> Result<step::StepResult, transform::TransformError> {
34        match self {
35            ConcreteStep::UpdateAttrs(attr_step) => attr_step.apply(dart, schema),
36            ConcreteStep::AddNodeStep(add_node_step) => add_node_step.apply(dart, schema),
37            ConcreteStep::AddMarkStep(add_mark_step) => add_mark_step.apply(dart, schema),
38            ConcreteStep::RemoveNodeStep(remove_node_step) => remove_node_step.apply(dart, schema),
39            ConcreteStep::PatchStep(patch_step) => patch_step.apply(dart, schema),
40            ConcreteStep::MoveNodeStep(move_node_step) => move_node_step.apply(dart, schema),
41            ConcreteStep::BatchStep(batch_step) => batch_step.apply(dart, schema),
42            ConcreteStep::ReplaceNodeStep(replace_node_step) => replace_node_step.apply(dart, schema),
43        }
44    }
45    fn to_concrete(&self) -> ConcreteStep {
46        self.clone()
47    }
48}
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct PatchStep {
51    pub patches: Vec<Patch>,
52}
53impl Step for PatchStep {
54    fn apply(
55        &self,
56        dart: &mut Draft,
57        _: std::sync::Arc<crate::model::schema::Schema>,
58    ) -> Result<step::StepResult, transform::TransformError> {
59        match dart.apply_patches(&self.patches) {
60            Ok(()) => Ok(dart.commit()),
61            Err(err) => Err(TransformError::new(err.to_string())),
62        }
63    }
64
65    fn to_concrete(&self) -> ConcreteStep {
66        ConcreteStep::PatchStep(self.clone())
67    }
68}
69/// 批量操作步骤
70#[derive(Debug, Serialize, Deserialize, Clone)]
71pub struct BatchStep {
72    steps: Vec<ConcreteStep>,
73}
74
75impl BatchStep {
76    pub fn new(steps: Vec<ConcreteStep>) -> Self {
77        BatchStep { steps }
78    }
79}
80impl Step for BatchStep {
81    fn apply(
82        &self,
83        dart: &mut Draft,
84        schema: Arc<Schema>,
85    ) -> Result<StepResult, TransformError> {
86        dart.begin = true;
87        for step in &self.steps {
88            let schema = schema.clone();
89            let result = match step {
90                ConcreteStep::UpdateAttrs(attr_step) => attr_step.apply(dart, schema),
91                ConcreteStep::AddNodeStep(add_node_step) => add_node_step.apply(dart, schema),
92                ConcreteStep::AddMarkStep(add_mark_step) => add_mark_step.apply(dart, schema),
93                ConcreteStep::RemoveNodeStep(remove_node_step) => remove_node_step.apply(dart, schema),
94                ConcreteStep::PatchStep(patch_step) => patch_step.apply(dart, schema),
95                ConcreteStep::MoveNodeStep(move_node_step) => move_node_step.apply(dart, schema),
96                ConcreteStep::ReplaceNodeStep(replace_node_step) => replace_node_step.apply(dart, schema),
97                ConcreteStep::BatchStep(batch_setp) => batch_setp.apply(dart, schema),
98            };
99            match result {
100                Ok(result) => {
101                    if let Some(message) = result.failed {
102                        return Ok(StepResult::fail(message));
103                    }
104                    // 继续执行下一个步骤
105                },
106                Err(err) => return Err(err),
107            }
108        }
109        dart.begin = false;
110        // 所有步骤执行成功,提交更改
111        Ok(dart.commit())
112    }
113
114    fn to_concrete(&self) -> ConcreteStep {
115        ConcreteStep::BatchStep(self.clone())
116    }
117}