moduforge_transform/
mark_step.rs1use 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}