moduforge-transform 0.2.4

不可变数据结构与事务系统基础
Documentation
use std::sync::Arc;

use moduforge_model::{node_pool::NodePool, schema::Schema};
use std::fmt::Debug;

use super::{draft::Draft, patch::Patch, transform::TransformError, ConcreteStep};

pub trait Step: Send + Sync + Debug {
    fn apply(
        &self,
        dart: &mut Draft,
        schema: Arc<Schema>,
    ) -> Result<StepResult, TransformError>;
    fn to_concrete(&self) -> ConcreteStep;
}

#[derive(Debug, Clone)]
pub struct StepResult {
    pub doc: Option<Arc<NodePool>>,
    pub failed: Option<String>,
    pub patches: Vec<Patch>,
}

impl StepResult {
    pub fn ok(
        doc: Arc<NodePool>,
        patches: Vec<Patch>,
    ) -> Self {
        StepResult { doc: Some(doc), failed: None, patches }
    }

    pub fn fail(message: String) -> Self {
        StepResult { doc: None, failed: Some(message), patches: vec![] }
    }
}

pub enum Steps {}