moduforge_transform/
mark_step.rs

1use std::sync::Arc;
2
3use moduforge_model::{mark::Mark, schema::Schema, tree::Tree, types::NodeId};
4
5use super::{
6    step::{Step, StepResult},
7    transform::TransformError,
8};
9use serde::{Deserialize, Serialize};
10#[derive(Debug, Serialize, Deserialize, Clone)]
11pub struct AddMarkStep {
12    id: NodeId,
13    marks: Vec<Mark>,
14}
15impl AddMarkStep {
16    pub fn new(
17        id: NodeId,
18        marks: Vec<Mark>,
19    ) -> Self {
20        AddMarkStep { id, marks }
21    }
22}
23impl Step for AddMarkStep {
24    fn name(&self) -> String {
25        "add_mark_step".to_string()
26    }
27    fn apply(
28        &self,
29        dart: &mut Tree,
30        schema: Arc<Schema>,
31    ) -> Result<StepResult, TransformError> {
32        let _ = schema;
33        let result = dart.mark(&self.id) + self.marks.clone();
34        match result {
35            Ok(_) => Ok(StepResult::ok()),
36            Err(e) => Ok(StepResult::fail(e.to_string())),
37        }
38    }
39    fn serialize(&self) -> Option<Vec<u8>> {
40        serde_json::to_vec(self).ok()
41    }
42}
43
44#[derive(Debug, Serialize, Deserialize, Clone)]
45pub struct RemoveMarkStep {
46    id: NodeId,
47    marks: Vec<Mark>,
48}
49impl RemoveMarkStep {
50    pub fn new(
51        id: NodeId,
52        marks: Vec<Mark>,
53    ) -> Self {
54        RemoveMarkStep { id, marks }
55    }
56}
57impl Step for RemoveMarkStep {
58    fn name(&self) -> String {
59        "remove_mark_step".to_string()
60    }
61    fn apply(
62        &self,
63        dart: &mut Tree,
64        schema: Arc<Schema>,
65    ) -> Result<StepResult, TransformError> {
66        let _ = schema;
67        let result = dart.mark(&self.id) - self.marks.clone();
68        match result {
69            Ok(_) => Ok(StepResult::ok()),
70            Err(e) => Ok(StepResult::fail(e.to_string())),
71        }
72    }
73    fn serialize(&self) -> Option<Vec<u8>> {
74        serde_json::to_vec(self).ok()
75    }
76}