mf_model/ops/
shr.rs

1use std::ops::Shr;
2
3use crate::{error::PoolResult, error_helpers, mark::Mark, node::Node};
4
5use super::{MarkRef, NodeRef};
6
7/// 为 NodeRef 实现自定义的 >> 运算符,用于在子节点列表末尾添加单个节点
8/// 当使用 >> 运算符时,会将新节点添加到当前节点的子节点列表的末尾位置
9impl<'a> Shr<Node> for NodeRef<'a> {
10    type Output = PoolResult<NodeRef<'a>>;
11    fn shr(
12        self,
13        node: Node,
14    ) -> Self::Output {
15        // 添加到末尾(等同于标准的add操作)
16        self.tree.add_node(&self.key.clone(), &vec![node])?;
17        Ok(NodeRef::new(self.tree, self.key.clone()))
18    }
19}
20
21/// 为 NodeRef 实现自定义的 >> 运算符,用于在子节点列表末尾添加多个节点
22/// 当使用 >> 运算符时,会将多个新节点添加到当前节点的子节点列表的末尾位置
23impl<'a> Shr<Vec<Node>> for NodeRef<'a> {
24    type Output = PoolResult<NodeRef<'a>>;
25    fn shr(
26        self,
27        nodes: Vec<Node>,
28    ) -> Self::Output {
29        if !nodes.is_empty() {
30            self.tree.add_node(&self.key.clone(), &nodes)?;
31        }
32        Ok(NodeRef::new(self.tree, self.key.clone()))
33    }
34}
35
36/// 为 NodeRef 实现自定义的 >> 运算符,用于将当前节点向右移动指定位置
37/// 当使用 >> 运算符时,会将当前节点在其父节点的子节点列表中向右移动指定位置数
38impl<'a> Shr<usize> for NodeRef<'a> {
39    type Output = PoolResult<NodeRef<'a>>;
40    fn shr(
41        self,
42        positions: usize,
43    ) -> Self::Output {
44        // 获取当前节点在父节点中的位置
45        if let Some(parent) = self.tree.get_parent_node(&self.key.clone()) {
46            let siblings = self.tree.children(&parent.id).unwrap_or_default();
47
48            if let Some(current_index) =
49                siblings.iter().position(|id| id.clone() == self.key)
50            {
51                // 计算新位置,不能超过列表长度
52                let max_index = siblings.len().saturating_sub(1);
53                let new_index = (current_index + positions).min(max_index);
54
55                // 如果位置有变化,执行移动
56                if new_index != current_index {
57                    //这里只需要修改  content 中的顺序就行,不需要删除和添加
58                    let node = {
59                        let node = {
60                            match self.tree.get_node(&self.key.clone()) {
61                                Some(n) => n,
62                                None => {
63                                    return Err(error_helpers::node_not_found(
64                                        self.key.clone(),
65                                    ));
66                                },
67                            }
68                        };
69                        match node.swap(current_index, new_index) {
70                            Some(n) => n,
71                            None => return Err(anyhow::anyhow!("下标越界了")),
72                        }
73                    };
74                    self.tree.update_node(node)?;
75                }
76            }
77        }
78
79        Ok(NodeRef::new(self.tree, self.key.clone()))
80    }
81}
82
83/// 为 MarkRef 实现自定义的 >> 运算符,用于在标记列表末尾添加单个标记
84/// 当使用 >> 运算符时,会将新标记添加到当前标记列表的末尾位置
85impl<'a> Shr<Mark> for MarkRef<'a> {
86    type Output = PoolResult<MarkRef<'a>>;
87    fn shr(
88        self,
89        mark: Mark,
90    ) -> Self::Output {
91        // 添加到末尾(等同于标准的add操作)
92        self.tree.add_mark(&self.key.clone(), &[mark])?;
93        Ok(MarkRef::new(self.tree, self.key.clone()))
94    }
95}
96
97/// 为 MarkRef 实现自定义的 >> 运算符,用于在标记列表末尾添加多个标记
98/// 当使用 >> 运算符时,会将多个新标记添加到当前标记列表的末尾位置
99impl<'a> Shr<Vec<Mark>> for MarkRef<'a> {
100    type Output = PoolResult<MarkRef<'a>>;
101    fn shr(
102        self,
103        marks: Vec<Mark>,
104    ) -> Self::Output {
105        if !marks.is_empty() {
106            self.tree.add_mark(&self.key.clone(), &marks)?;
107        }
108        Ok(MarkRef::new(self.tree, self.key.clone()))
109    }
110}