moduforge_model/ops/
add.rs

1use std::ops::Add;
2
3use serde_json::Value;
4
5use crate::{attrs::Attrs, error::PoolError, mark::Mark, node::Node};
6
7use super::{AttrsRef, MarkRef, NodeRef};
8
9/// 为 NodeRef 实现自定义的 + 运算符,用于添加单个节点
10/// 当使用 + 运算符时,会将新节点添加到当前节点的子节点列表中
11impl<'a> Add<Node> for NodeRef<'a> {
12    type Output = Result<NodeRef<'a>, PoolError>;
13    fn add(
14        self,
15        node: Node,
16    ) -> Self::Output {
17        let _ = self.tree.add_node(&self.key.clone().into(), &vec![node]);
18        Ok(NodeRef::new(self.tree, self.key.clone()))
19    }
20}
21
22/// 为 NodeRef 实现自定义的 + 运算符,用于添加多个节点
23/// 当使用 + 运算符时,会将多个新节点添加到当前节点的子节点列表中
24impl<'a> Add<Vec<Node>> for NodeRef<'a> {
25    type Output = Result<NodeRef<'a>, PoolError>;
26    fn add(
27        self,
28        nodes: Vec<Node>,
29    ) -> Self::Output {
30        let _ = self.tree.add_node(&self.key.clone().into(), &nodes);
31        Ok(NodeRef::new(self.tree, self.key.clone()))
32    }
33}
34
35/// 为 MarkRef 实现自定义的 + 运算符,用于添加单个标记
36/// 当使用 + 运算符时,会将新标记添加到当前标记的列表中
37impl<'a> Add<Mark> for MarkRef<'a> {
38    type Output = Result<MarkRef<'a>, PoolError>;
39    fn add(
40        self,
41        mark: Mark,
42    ) -> Self::Output {
43        let _ = self.tree.add_mark(&self.key.clone().into(), &vec![mark]);
44        Ok(MarkRef::new(self.tree, self.key.clone()))
45    }
46}
47
48/// 为 MarkRef 实现自定义的 + 运算符,用于添加多个标记
49/// 当使用 + 运算符时,会将多个新标记添加到当前标记的列表中
50impl<'a> Add<Vec<Mark>> for MarkRef<'a> {
51    type Output = Result<MarkRef<'a>, PoolError>;
52    fn add(
53        self,
54        marks: Vec<Mark>,
55    ) -> Self::Output {
56        let _ = self.tree.add_mark(&self.key.clone().into(), &marks);
57        Ok(MarkRef::new(self.tree, self.key.clone()))
58    }
59}
60
61/// 为 AttrsRef 实现自定义的 + 运算符,用于添加属性
62/// 当使用 + 运算符时,会更新当前节点的属性
63impl<'a> Add<Attrs> for AttrsRef<'a> {
64    type Output = Result<AttrsRef<'a>, PoolError>;
65    fn add(
66        self,
67        attrs: Attrs,
68    ) -> Self::Output {
69        let _ = self.tree.update_attr(&self.key.clone().into(), attrs.attrs);
70        Ok(AttrsRef::new(self.tree, self.key.clone()))
71    }
72}
73
74/// 为 AttrsRef 实现自定义的 + 运算符,用于直接添加属性映射
75/// 当使用 + 运算符时,会直接使用提供的属性映射更新当前节点的属性
76impl<'a> Add<im::HashMap<String, Value>> for AttrsRef<'a> {
77    type Output = Result<AttrsRef<'a>, PoolError>;
78    fn add(
79        self,
80        attrs: im::HashMap<String, Value>,
81    ) -> Self::Output {
82        let _ = self.tree.update_attr(&self.key.clone().into(), attrs);
83        Ok(AttrsRef::new(self.tree, self.key.clone()))
84    }
85}