moduforge_transform/
transform.rs

1use 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// 定义 TransformError 结构体
10#[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     /// 当前文档状态
32     pub doc: Arc<NodePool>,
33     /// 文档的草稿状态,用于临时修改
34     pub draft: Draft,
35     /// 存储所有操作步骤
36     pub steps: im::Vector<Arc<dyn Step>>,
37     /// 存储每个步骤对应的补丁列表
38     pub patches: im::Vector<Vec<Patch>>,
39     /// 文档的模式定义
40     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    /// 检查文档是否被修改
57    pub  fn doc_changed(&self) -> bool {
58        !self.steps.is_empty()
59    }
60    /// 添加一个步骤及其结果到事务中
61    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}