moduforge_transform/
transform.rs1use std::{fmt, sync::Arc};
2
3use moduforge_model::{node_pool::NodePool, schema::Schema};
4
5use crate::{draft::Draft, patch::Patch};
6
7use super::step::{Step, StepResult};
8
9#[derive(Debug)]
11pub struct TransformError {
12 message: String,
13}
14impl fmt::Display for TransformError {
15 fn fmt(
16 &self,
17 f: &mut fmt::Formatter,
18 ) -> fmt::Result {
19 write!(f, "{}", self.message)
20 }
21}
22impl std::error::Error for TransformError {}
23
24impl TransformError {
25 pub fn new(message: String) -> Self {
26 TransformError { message }
27 }
28}
29#[derive(Debug, Clone)]
30pub struct Transform {
31 pub doc: Arc<NodePool>,
33 pub draft: Draft,
35 pub steps: im::Vector<Arc<dyn Step>>,
37 pub patches: im::Vector<Vec<Patch>>,
39 pub schema: Arc<Schema>,
41}
42impl Transform {
43 pub fn step(
44 &mut self,
45 step: Arc<dyn Step>,
46 ) -> Result<(), TransformError> {
47 let result = step.apply(&mut self.draft, self.schema.clone())?;
48 match result.failed {
49 Some(message) => Err(TransformError::new(message)),
50 None => {
51 self.add_step(step, result);
52 Ok(())
53 },
54 }
55 }
56 pub fn doc_changed(&self) -> bool {
58 !self.steps.is_empty()
59 }
60 pub fn add_step(
62 &mut self,
63 step: Arc<dyn Step>,
64 result: StepResult,
65 ) {
66 self.steps.push_back(step);
67 self.patches.push_back(result.patches);
68 self.doc = result.doc.unwrap();
69 }
70}