1use std::ops::BitAnd;
2
3use crate::{
4 error::{error_helpers, PoolResult},
5};
6
7use super::{MarkRef, NodeRef};
8
9impl<'a> BitAnd<String> for NodeRef<'a> {
12 type Output = PoolResult<NodeRef<'a>>;
13 fn bitand(
14 self,
15 node_type: String,
16 ) -> Self::Output {
17 let children =
18 self.tree.children(&self.key.clone().into()).unwrap_or_default();
19 let mut nodes_to_remove = Vec::new();
20
21 for child_id in children {
22 if let Some(node) = self.tree.get_node(&child_id) {
23 if node.r#type.to_string() != node_type {
24 nodes_to_remove.push(child_id);
25 }
26 }
27 }
28
29 if !nodes_to_remove.is_empty() {
31 self.tree.remove_node(&self.key.clone().into(), nodes_to_remove)?;
32 }
33
34 Ok(NodeRef::new(self.tree, self.key.clone()))
35 }
36}
37
38impl<'a> BitAnd<Vec<String>> for NodeRef<'a> {
41 type Output = PoolResult<NodeRef<'a>>;
42 fn bitand(
43 self,
44 node_types: Vec<String>,
45 ) -> Self::Output {
46 let children =
47 self.tree.children(&self.key.clone().into()).unwrap_or_default();
48 let mut nodes_to_remove = Vec::new();
49
50 for child_id in children {
51 if let Some(node) = self.tree.get_node(&child_id) {
52 let node_type_str = node.r#type.to_string();
53 if !node_types.contains(&node_type_str) {
54 nodes_to_remove.push(child_id);
55 }
56 }
57 }
58
59 if !nodes_to_remove.is_empty() {
61 self.tree.remove_node(&self.key.clone().into(), nodes_to_remove)?;
62 }
63
64 Ok(NodeRef::new(self.tree, self.key.clone()))
65 }
66}
67
68impl<'a> BitAnd<String> for MarkRef<'a> {
71 type Output = PoolResult<MarkRef<'a>>;
72 fn bitand(
73 self,
74 mark_name: String,
75 ) -> Self::Output {
76 let noderef = self.tree.get_node(&self.key.clone().into());
77 match noderef {
78 Some(_) => {
79 self.tree
80 .remove_mark(&self.key.clone().into(), &[mark_name])?;
81 Ok(MarkRef::new(self.tree, self.key.clone()))
82 },
83 None => Err(error_helpers::node_not_found(self.key.clone().into())),
84 }
85 }
86}
87
88impl<'a> BitAnd<Vec<String>> for MarkRef<'a> {
91 type Output = PoolResult<MarkRef<'a>>;
92 fn bitand(
93 self,
94 mark_names: Vec<String>,
95 ) -> Self::Output {
96 let noderef = self.tree.get_node(&self.key.clone().into());
97 match noderef {
98 Some(_) => {
99 self.tree.remove_mark(&self.key.clone().into(), &mark_names)?;
100 Ok(MarkRef::new(self.tree, self.key.clone()))
101 },
102 None => Err(error_helpers::node_not_found(self.key.clone().into())),
103 }
104 }
105}