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