1use crate::{
2 attrs::{AttrMap, Attribute, HasAttributes},
3 timeseries::{HasSeries, HasTimeSeries, SeriesMap, TsMap},
4};
5use abi_stable::{
6 external_types::RMutex,
7 std_types::{
8 RArc,
9 ROption::{self, RSome},
10 RString, RVec,
11 },
12 StableAbi,
13};
14
15pub type Node = RArc<RMutex<NodeInner>>;
17
18pub fn new_node(index: usize, name: &str) -> Node {
20 RArc::new(RMutex::new(NodeInner::new(index, name)))
21}
22
23#[repr(C)]
47#[derive(StableAbi, Default, Clone)]
48pub struct NodeInner {
49 pub(crate) index: usize,
51 pub(crate) name: RString,
53 pub(crate) level: u64,
56 pub(crate) order: u64,
58 pub(crate) attributes: AttrMap,
60 pub(crate) series: SeriesMap,
62 pub(crate) timeseries: TsMap,
64 pub(crate) inputs: RVec<Node>,
66 pub(crate) output: ROption<Node>,
68}
69
70impl HasAttributes for NodeInner {
71 fn node_name(&self) -> Option<&str> {
72 Some(self.name())
73 }
74 fn attr_map(&self) -> &AttrMap {
75 &self.attributes
76 }
77
78 fn attr_map_mut(&mut self) -> &mut AttrMap {
79 &mut self.attributes
80 }
81}
82
83impl HasSeries for NodeInner {
84 fn series_map(&self) -> &SeriesMap {
85 &self.series
86 }
87
88 fn series_map_mut(&mut self) -> &mut SeriesMap {
89 &mut self.series
90 }
91}
92
93impl HasTimeSeries for NodeInner {
94 fn ts_map(&self) -> &TsMap {
95 &self.timeseries
96 }
97
98 fn ts_map_mut(&mut self) -> &mut TsMap {
99 &mut self.timeseries
100 }
101}
102
103impl NodeInner {
104 pub fn new(index: usize, name: &str) -> Self {
106 let mut node = Self {
107 index,
108 name: name.into(),
109 ..Default::default()
110 };
111 node.set_attr("NAME", Attribute::String(name.into()));
112 node.set_attr("INDEX", Attribute::Integer(index as i64));
113 node
114 }
115
116 pub fn name(&self) -> &str {
118 &self.name
119 }
120
121 pub fn index(&self) -> usize {
123 self.index
124 }
125
126 pub fn set_index(&mut self, index: usize) {
128 self.index = index;
129 self.set_attr("INDEX", Attribute::Integer(index as i64));
130 }
131
132 pub fn level(&self) -> u64 {
134 self.level
135 }
136
137 pub fn order(&self) -> u64 {
139 self.order
140 }
141
142 pub fn set_level(&mut self, level: u64) {
144 self.level = level;
145 self.set_attr("LEVEL", Attribute::Integer(level as i64));
146 }
147
148 pub fn set_order(&mut self, order: u64) {
150 self.order = order;
151 self.set_attr("ORDER", Attribute::Integer(order as i64));
152 }
153
154 pub fn inputs(&self) -> &[Node] {
156 &self.inputs
157 }
158
159 pub(crate) fn inputs_mut(&mut self) -> &mut RVec<Node> {
161 &mut self.inputs
162 }
163
164 pub fn add_input(&mut self, input: Node) {
166 self.inputs.push(input);
167 }
168
169 pub fn unset_inputs(&mut self) {
171 self.inputs = RVec::new();
172 }
173
174 pub fn order_inputs(&mut self) {
176 self.inputs
177 .sort_by(|a, b| b.lock().order.partial_cmp(&a.lock().order).unwrap());
178 }
179
180 pub fn output(&self) -> ROption<&Node> {
182 self.output.as_ref()
183 }
184
185 pub fn set_output(&mut self, output: Node) -> ROption<Node> {
187 self.output.replace(output)
188 }
189
190 pub fn unset_output(&mut self) -> ROption<Node> {
192 self.output.take()
193 }
194
195 pub fn move_aside(&mut self) {
197 if let RSome(o) = self.output() {
198 self.inputs().iter().for_each(|i| {
199 o.lock().add_input(i.clone());
200 i.lock().set_output(o.clone());
201 });
202 } else {
203 self.inputs().iter().for_each(|i| {
204 i.lock().unset_output();
205 });
206 }
207 self.unset_inputs();
208 }
209
210 pub fn move_down(&mut self) {
212 if let RSome(out) = self.unset_output() {
213 let i = out
214 .lock()
215 .inputs()
216 .iter()
217 .position(|c| c.try_lock().is_none())
219 .unwrap();
220 let o = out.lock().inputs.remove(i);
221 self.output = out.lock().output.clone();
222 out.lock().set_output(o);
223 self.add_input(out.clone());
224 }
225 }
226}