moduforge_model/ops/
sub.rs1use std::ops::Sub;
2
3use crate::{
4 error::{PoolResult},
5 mark::Mark,
6 types::NodeId,
7};
8
9use super::{MarkRef, NodeRef};
10
11impl<'a> Sub<NodeId> for NodeRef<'a> {
14 type Output = PoolResult<NodeRef<'a>>;
15 fn sub(
16 self,
17 node_id: NodeId,
18 ) -> Self::Output {
19 self.tree.remove_node(&self.key.clone().into(), vec![node_id])?;
20 Ok(NodeRef::new(self.tree, self.key.clone()))
21 }
22}
23
24impl<'a> Sub<Vec<NodeId>> for NodeRef<'a> {
27 type Output = PoolResult<NodeRef<'a>>;
28 fn sub(
29 self,
30 node_ids: Vec<NodeId>,
31 ) -> Self::Output {
32 self.tree.remove_node(&self.key.clone().into(), node_ids)?;
33 Ok(NodeRef::new(self.tree, self.key.clone()))
34 }
35}
36impl<'a> Sub<usize> for NodeRef<'a> {
39 type Output = PoolResult<NodeRef<'a>>;
40 fn sub(
41 self,
42 index: usize,
43 ) -> Self::Output {
44 self.tree.remove_node_by_index(&self.key.clone().into(), index)?;
45 Ok(NodeRef::new(self.tree, self.key.clone()))
46 }
47}
48impl<'a> Sub<Mark> for MarkRef<'a> {
51 type Output = PoolResult<MarkRef<'a>>;
52 fn sub(
53 self,
54 mark: Mark,
55 ) -> Self::Output {
56 self.tree.remove_mark(&self.key.clone().into(), mark)?;
57 Ok(MarkRef::new(self.tree, self.key.clone()))
58 }
59}
60
61impl<'a> Sub<String> for MarkRef<'a> {
62 type Output = PoolResult<MarkRef<'a>>;
63 fn sub(
64 self,
65 mark_name: String,
66 ) -> Self::Output {
67 self.tree.remove_mark_by_name(&self.key.clone().into(), &mark_name)?;
68 Ok(MarkRef::new(self.tree, self.key.clone()))
69 }
70}
71
72impl<'a> Sub<Vec<Mark>> for MarkRef<'a> {
76 type Output = PoolResult<MarkRef<'a>>;
77 fn sub(
78 self,
79 marks: Vec<Mark>,
80 ) -> Self::Output {
81 for mark in marks {
82 self.tree.remove_mark(&self.key.clone().into(), mark)?;
83 }
84 Ok(MarkRef::new(self.tree, self.key.clone()))
85 }
86}