moduforge_core/transform/
mod.rs1use 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#[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 },
106 Err(err) => return Err(err),
107 }
108 }
109 dart.begin = false;
110 Ok(dart.commit())
112 }
113
114 fn to_concrete(&self) -> ConcreteStep {
115 ConcreteStep::BatchStep(self.clone())
116 }
117}