mf_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
57            .remove_mark(&self.key.clone().into(), &[mark.r#type.clone()])?;
58        Ok(MarkRef::new(self.tree, self.key.clone()))
59    }
60}
61
62impl<'a> Sub<String> for MarkRef<'a> {
63    type Output = PoolResult<MarkRef<'a>>;
64    fn sub(
65        self,
66        mark_name: String,
67    ) -> Self::Output {
68        self.tree.remove_mark_by_name(&self.key.clone().into(), &mark_name)?;
69        Ok(MarkRef::new(self.tree, self.key.clone()))
70    }
71}
72impl<'a> Sub<Vec<String>> for MarkRef<'a> {
73    type Output = PoolResult<MarkRef<'a>>;
74    fn sub(
75        self,
76        mark_names: Vec<String>,
77    ) -> Self::Output {
78        self.tree.remove_mark(&self.key.clone().into(), &mark_names)?;
79        Ok(MarkRef::new(self.tree, self.key.clone()))
80    }
81}
82
83/// 为 MarkRef 实现自定义的 - 运算符,用于删除多个标记
84/// 当使用 - 运算符时,会从当前标记列表中移除指定的多个标记
85/// 注意:这里使用循环逐个删除标记,而不是一次性删除所有标记
86impl<'a> Sub<Vec<Mark>> for MarkRef<'a> {
87    type Output = PoolResult<MarkRef<'a>>;
88    fn sub(
89        self,
90        marks: Vec<Mark>,
91    ) -> Self::Output {
92        self.tree.remove_mark(
93            &self.key.clone().into(),
94            &marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>(),
95        )?;
96        Ok(MarkRef::new(self.tree, self.key.clone()))
97    }
98}