moduforge_model/ops/
mul.rs

1use std::ops::Mul;
2
3use crate::{
4    error::PoolResult, id_generator::IdGenerator, types::NodeId
5};
6
7use super::NodeRef;
8
9/// 为 NodeRef 实现自定义的 * 运算符,用于复制当前节点N次
10/// 当使用 * 运算符时,会将当前节点复制指定次数并添加到父节点中
11impl<'a> Mul<usize> for NodeRef<'a> {
12    type Output = PoolResult<NodeRef<'a>>;
13    fn mul(
14        self,
15        count: usize,
16    ) -> Self::Output {
17        // 获取当前节点
18        if let Some(current_node) = self.tree.get_node(&self.key.clone().into()) {
19            let mut nodes = Vec::new();
20            for _ in 0..count {
21                // 创建节点的副本
22                let mut node = current_node.as_ref().clone();
23                node.id = IdGenerator::get_id();
24                node.content = im::Vector::new();
25                nodes.push(node);
26            }
27            // 添加到当前节点的父节点中
28            if let Some(parent) = self.tree.get_parent_node(&self.key.clone().into()) {
29                self.tree.add_node(&parent.id, &nodes)?;
30            }
31        }
32        Ok(NodeRef::new(self.tree, self.key.clone()))
33    }
34}
35
36/// 为 NodeRef 实现自定义的 * 运算符,用于复制指定节点到当前位置
37/// 当使用 * 运算符时,会将指定节点复制到当前节点的子节点列表中
38impl<'a> Mul<NodeId> for NodeRef<'a> {
39    type Output = PoolResult<NodeRef<'a>>;
40    fn mul(
41        self,
42        node_id: NodeId,
43    ) -> Self::Output {
44        // 获取要复制的节点
45        if let Some(source_node) = self.tree.get_node(&node_id) {
46            let mut node = source_node.as_ref().clone();
47            node.id = IdGenerator::get_id();
48            node.content = im::Vector::new();
49            // 添加到当前节点
50            self.tree.add_node(&self.key.clone().into(), &vec![node])?;
51        }
52        Ok(NodeRef::new(self.tree, self.key.clone()))
53    }
54}
55
56/// 为 NodeRef 实现自定义的 * 运算符,用于批量复制多个指定节点
57/// 当使用 * 运算符时,会将指定的多个节点复制到当前节点的子节点列表中
58impl<'a> Mul<Vec<NodeId>> for NodeRef<'a> {
59    type Output = PoolResult<NodeRef<'a>>;
60    fn mul(
61        self,
62        node_ids: Vec<NodeId>,
63    ) -> Self::Output {
64        let mut cloned_nodes = Vec::new();
65        
66        for node_id in node_ids {
67            if let Some(source_node) = self.tree.get_node(&node_id) {
68                let mut node = source_node.as_ref().clone();
69                node.id = IdGenerator::get_id();
70                node.content = im::Vector::new();
71                cloned_nodes.push(node);
72            }
73        }
74        
75        if !cloned_nodes.is_empty() {
76            self.tree.add_node(&self.key.clone().into(), &cloned_nodes)?;
77        }
78        
79        Ok(NodeRef::new(self.tree, self.key.clone()))
80    }
81}