moduforge_model/ops/
add.rs1use 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
9impl<'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
22impl<'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
35impl<'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
48impl<'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
61impl<'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
74impl<'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}