moduforge_model/ops/
shr.rs

1use std::ops::Shr;
2
3use crate::{error::PoolResult, 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().into(), &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().into(), &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) =
46            self.tree.get_parent_node(&self.key.clone().into())
47        {
48            let siblings: im::Vector<String> =
49                self.tree.children(&parent.id).unwrap_or_default();
50
51            if let Some(current_index) =
52                siblings.iter().position(|id| id.clone() == self.key)
53            {
54                // 计算新位置,不能超过列表长度
55                let max_index = siblings.len().saturating_sub(1);
56                let new_index = (current_index + positions).min(max_index);
57
58                // 如果位置有变化,执行移动
59                if new_index != current_index {
60                    //这里只需要修改  content 中的顺序就行,不需要删除和添加
61                    let mut node = self
62                        .tree
63                        .get_node(&self.key.clone().into())
64                        .unwrap()
65                        .as_ref()
66                        .clone();
67                    let mut content = node.content.clone();
68                    content.swap(current_index, new_index);
69                    node.content = content;
70                    self.tree.update_node(node)?;
71                }
72            }
73        }
74
75        Ok(NodeRef::new(self.tree, self.key.clone()))
76    }
77}
78
79/// 为 MarkRef 实现自定义的 >> 运算符,用于在标记列表末尾添加单个标记
80/// 当使用 >> 运算符时,会将新标记添加到当前标记列表的末尾位置
81impl<'a> Shr<Mark> for MarkRef<'a> {
82    type Output = PoolResult<MarkRef<'a>>;
83    fn shr(
84        self,
85        mark: Mark,
86    ) -> Self::Output {
87        // 添加到末尾(等同于标准的add操作)
88        self.tree.add_mark(&self.key.clone().into(), &vec![mark])?;
89        Ok(MarkRef::new(self.tree, self.key.clone()))
90    }
91}
92
93/// 为 MarkRef 实现自定义的 >> 运算符,用于在标记列表末尾添加多个标记
94/// 当使用 >> 运算符时,会将多个新标记添加到当前标记列表的末尾位置
95impl<'a> Shr<Vec<Mark>> for MarkRef<'a> {
96    type Output = PoolResult<MarkRef<'a>>;
97    fn shr(
98        self,
99        marks: Vec<Mark>,
100    ) -> Self::Output {
101        if !marks.is_empty() {
102            self.tree.add_mark(&self.key.clone().into(), &marks)?;
103        }
104        Ok(MarkRef::new(self.tree, self.key.clone()))
105    }
106}