moduforge_transform/
mark_step.rs

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