moduforge_model/ops/
sub.rs

1use std::ops::Sub;
2
3use crate::{
4    error::{PoolResult},
5    mark::Mark,
6    types::NodeId,
7};
8
9use super::{MarkRef, NodeRef};
10
11/// 为 NodeRef 实现自定义的 - 运算符,用于删除单个节点
12/// 当使用 - 运算符时,会从当前节点的子节点列表中移除指定的节点
13impl<'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
24/// 为 NodeRef 实现自定义的 - 运算符,用于删除多个节点
25/// 当使用 - 运算符时,会从当前节点的子节点列表中移除指定的多个节点
26impl<'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}
36/// 为 NodeRef 实现自定义的 - 运算符,用于删除单个节点
37/// 当使用 - 运算符时,会从当前节点的子节点列表中移除指定的节点
38impl<'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}
48/// 为 MarkRef 实现自定义的 - 运算符,用于删除单个标记
49/// 当使用 - 运算符时,会从当前标记列表中移除指定的标记
50impl<'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
72/// 为 MarkRef 实现自定义的 - 运算符,用于删除多个标记
73/// 当使用 - 运算符时,会从当前标记列表中移除指定的多个标记
74/// 注意:这里使用循环逐个删除标记,而不是一次性删除所有标记
75impl<'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}