grapl_graph_descriptions/
node.rs1use log::warn;
2use serde_json::Value;
3
4use crate::graph_description::node::WhichNode;
5use crate::graph_description::{
6 Asset, DynamicNode, File, IpAddress, IpConnection, IpPort, NetworkConnection, Node, Process,
7 ProcessInboundConnection, ProcessOutboundConnection,
8};
9
10pub trait NodeT {
11 fn get_asset_id(&self) -> Option<&str>;
12
13 fn clone_asset_id(&self) -> Option<String> {
14 self.get_asset_id().map(String::from)
15 }
16
17 fn set_asset_id(&mut self, asset_id: impl Into<String>);
18
19 fn get_node_key(&self) -> &str;
20
21 fn clone_node_key(&self) -> String {
22 self.get_node_key().to_string()
23 }
24
25 fn set_node_key(&mut self, node_key: impl Into<String>);
26
27 fn merge(&mut self, other: &Self) -> bool;
28
29 fn merge_into(&mut self, other: Self) -> bool;
30}
31
32impl From<IpConnection> for Node {
33 fn from(ip_connection: IpConnection) -> Self {
34 Self {
35 which_node: Some(WhichNode::IpConnectionNode(ip_connection)),
36 }
37 }
38}
39
40impl From<Asset> for Node {
41 fn from(asset: Asset) -> Self {
42 Self {
43 which_node: Some(WhichNode::AssetNode(asset)),
44 }
45 }
46}
47
48impl From<Process> for Node {
49 fn from(process: Process) -> Self {
50 Self {
51 which_node: Some(WhichNode::ProcessNode(process)),
52 }
53 }
54}
55
56impl From<File> for Node {
57 fn from(file: File) -> Self {
58 Self {
59 which_node: Some(WhichNode::FileNode(file)),
60 }
61 }
62}
63
64impl From<IpAddress> for Node {
65 fn from(ip_address: IpAddress) -> Self {
66 Self {
67 which_node: Some(WhichNode::IpAddressNode(ip_address)),
68 }
69 }
70}
71
72impl From<ProcessOutboundConnection> for Node {
73 fn from(process_outbound_connection: ProcessOutboundConnection) -> Self {
74 Self {
75 which_node: Some(WhichNode::ProcessOutboundConnectionNode(
76 process_outbound_connection,
77 )),
78 }
79 }
80}
81
82impl From<ProcessInboundConnection> for Node {
83 fn from(process_inbound_connection: ProcessInboundConnection) -> Self {
84 Self {
85 which_node: Some(WhichNode::ProcessInboundConnectionNode(
86 process_inbound_connection,
87 )),
88 }
89 }
90}
91
92impl From<IpPort> for Node {
93 fn from(ip_port: IpPort) -> Self {
94 Self {
95 which_node: Some(WhichNode::IpPortNode(ip_port)),
96 }
97 }
98}
99
100impl From<NetworkConnection> for Node {
101 fn from(network_connection: NetworkConnection) -> Self {
102 Self {
103 which_node: Some(WhichNode::NetworkConnectionNode(network_connection)),
104 }
105 }
106}
107
108impl From<DynamicNode> for Node {
109 fn from(dynamic_node: DynamicNode) -> Self {
110 Self {
111 which_node: Some(WhichNode::DynamicNode(dynamic_node)),
112 }
113 }
114}
115
116impl Node {
117 pub fn as_asset(&self) -> Option<&Asset> {
118 let which_node = match self.which_node {
119 Some(ref which_node) => which_node,
120 None => return None,
121 };
122
123 if let WhichNode::AssetNode(ref asset) = which_node {
124 Some(asset)
125 } else {
126 None
127 }
128 }
129
130 pub fn into_asset(self) -> Option<Asset> {
131 let which_node = match self.which_node {
132 Some(which_node) => which_node,
133 None => return None,
134 };
135
136 if let WhichNode::AssetNode(asset) = which_node {
137 Some(asset)
138 } else {
139 None
140 }
141 }
142
143 pub fn as_mut_asset(&mut self) -> Option<&mut Asset> {
144 let which_node = match self.which_node {
145 Some(ref mut which_node) => which_node,
146 None => return None,
147 };
148
149 if let WhichNode::AssetNode(ref mut asset) = which_node {
150 Some(asset)
151 } else {
152 None
153 }
154 }
155
156 pub fn as_process(&self) -> Option<&Process> {
157 let which_node = match self.which_node {
158 Some(ref which_node) => which_node,
159 None => return None,
160 };
161
162 if let WhichNode::ProcessNode(ref process) = which_node {
163 Some(process)
164 } else {
165 None
166 }
167 }
168
169 pub fn into_process(self) -> Option<Process> {
170 let which_node = match self.which_node {
171 Some(which_node) => which_node,
172 None => return None,
173 };
174
175 if let WhichNode::ProcessNode(process) = which_node {
176 Some(process)
177 } else {
178 None
179 }
180 }
181
182 pub fn as_mut_process(&mut self) -> Option<&mut Process> {
183 let which_node = match self.which_node {
184 Some(ref mut which_node) => which_node,
185 None => return None,
186 };
187
188 if let WhichNode::ProcessNode(ref mut process) = which_node {
189 Some(process)
190 } else {
191 None
192 }
193 }
194
195 pub fn as_file(&self) -> Option<&File> {
196 let which_node = match self.which_node {
197 Some(ref which_node) => which_node,
198 None => return None,
199 };
200
201 if let WhichNode::FileNode(ref file) = which_node {
202 Some(file)
203 } else {
204 None
205 }
206 }
207
208 pub fn into_file(self) -> Option<File> {
209 let which_node = match self.which_node {
210 Some(which_node) => which_node,
211 None => return None,
212 };
213
214 if let WhichNode::FileNode(file) = which_node {
215 Some(file)
216 } else {
217 None
218 }
219 }
220
221 pub fn as_mut_file(&mut self) -> Option<&mut File> {
222 let which_node = match self.which_node {
223 Some(ref mut which_node) => which_node,
224 None => return None,
225 };
226
227 if let WhichNode::FileNode(ref mut file) = which_node {
228 Some(file)
229 } else {
230 None
231 }
232 }
233
234 pub fn as_ip_address(&self) -> Option<&IpAddress> {
235 let which_node = match self.which_node {
236 Some(ref which_node) => which_node,
237 None => return None,
238 };
239
240 if let WhichNode::IpAddressNode(ref ip_address) = which_node {
241 Some(ip_address)
242 } else {
243 None
244 }
245 }
246
247 pub fn into_ip_address(self) -> Option<IpAddress> {
248 let which_node = match self.which_node {
249 Some(which_node) => which_node,
250 None => return None,
251 };
252
253 if let WhichNode::IpAddressNode(ip_address) = which_node {
254 Some(ip_address)
255 } else {
256 None
257 }
258 }
259
260 pub fn as_mut_ip_address(&mut self) -> Option<&mut IpAddress> {
261 let which_node = match self.which_node {
262 Some(ref mut which_node) => which_node,
263 None => return None,
264 };
265
266 if let WhichNode::IpAddressNode(ref mut ip_address) = which_node {
267 Some(ip_address)
268 } else {
269 None
270 }
271 }
272
273 pub fn as_process_outbound_connection(&self) -> Option<&ProcessOutboundConnection> {
274 let which_node = match self.which_node {
275 Some(ref which_node) => which_node,
276 None => return None,
277 };
278
279 if let WhichNode::ProcessOutboundConnectionNode(ref process_outbound_connection) =
280 which_node
281 {
282 Some(process_outbound_connection)
283 } else {
284 None
285 }
286 }
287
288 pub fn into_process_outbound_connection(self) -> Option<ProcessOutboundConnection> {
289 let which_node = match self.which_node {
290 Some(which_node) => which_node,
291 None => return None,
292 };
293
294 if let WhichNode::ProcessOutboundConnectionNode(process_outbound_connection) = which_node {
295 Some(process_outbound_connection)
296 } else {
297 None
298 }
299 }
300
301 pub fn as_mut_process_outbound_connection(&mut self) -> Option<&mut ProcessOutboundConnection> {
302 let which_node = match self.which_node {
303 Some(ref mut which_node) => which_node,
304 None => return None,
305 };
306
307 if let WhichNode::ProcessOutboundConnectionNode(ref mut process_outbound_connection) =
308 which_node
309 {
310 Some(process_outbound_connection)
311 } else {
312 None
313 }
314 }
315
316 pub fn as_process_inbound_connection(&self) -> Option<&ProcessInboundConnection> {
317 let which_node = match self.which_node {
318 Some(ref which_node) => which_node,
319 None => return None,
320 };
321
322 if let WhichNode::ProcessInboundConnectionNode(ref process_inbound_connection) = which_node
323 {
324 Some(process_inbound_connection)
325 } else {
326 None
327 }
328 }
329
330 pub fn into_process_inbound_connection(self) -> Option<ProcessInboundConnection> {
331 let which_node = match self.which_node {
332 Some(which_node) => which_node,
333 None => return None,
334 };
335
336 if let WhichNode::ProcessInboundConnectionNode(process_inbound_connection) = which_node {
337 Some(process_inbound_connection)
338 } else {
339 None
340 }
341 }
342
343 pub fn as_mut_process_inbound_connection(&mut self) -> Option<&mut ProcessInboundConnection> {
344 let which_node = match self.which_node {
345 Some(ref mut which_node) => which_node,
346 None => return None,
347 };
348
349 if let WhichNode::ProcessInboundConnectionNode(ref mut process_inbound_connection) =
350 which_node
351 {
352 Some(process_inbound_connection)
353 } else {
354 None
355 }
356 }
357
358 pub fn as_ip_port(&self) -> Option<&IpPort> {
359 let which_node = match self.which_node {
360 Some(ref which_node) => which_node,
361 None => return None,
362 };
363
364 if let WhichNode::IpPortNode(ref ip_port) = which_node {
365 Some(ip_port)
366 } else {
367 None
368 }
369 }
370
371 pub fn as_network_connection(&self) -> Option<&NetworkConnection> {
372 let which_node = match self.which_node {
373 Some(ref which_node) => which_node,
374 None => return None,
375 };
376
377 if let WhichNode::NetworkConnectionNode(ref network_connection) = which_node {
378 Some(network_connection)
379 } else {
380 None
381 }
382 }
383
384 pub fn into_network_connection(self) -> Option<NetworkConnection> {
385 let which_node = match self.which_node {
386 Some(which_node) => which_node,
387 None => return None,
388 };
389
390 if let WhichNode::NetworkConnectionNode(network_connection) = which_node {
391 Some(network_connection)
392 } else {
393 None
394 }
395 }
396
397 pub fn as_mut_network_connection(&mut self) -> Option<&mut NetworkConnection> {
398 let which_node = match self.which_node {
399 Some(ref mut which_node) => which_node,
400 None => return None,
401 };
402
403 if let WhichNode::NetworkConnectionNode(ref mut network_connection) = which_node {
404 Some(network_connection)
405 } else {
406 None
407 }
408 }
409
410 pub fn as_ip_connection(&self) -> Option<&IpConnection> {
411 let which_node = match self.which_node {
412 Some(ref which_node) => which_node,
413 None => return None,
414 };
415
416 if let WhichNode::IpConnectionNode(ref ip_connection) = which_node {
417 Some(ip_connection)
418 } else {
419 None
420 }
421 }
422
423 pub fn into_ip_connection(self) -> Option<IpConnection> {
424 let which_node = match self.which_node {
425 Some(which_node) => which_node,
426 None => return None,
427 };
428
429 if let WhichNode::IpConnectionNode(ip_connection) = which_node {
430 Some(ip_connection)
431 } else {
432 None
433 }
434 }
435
436 pub fn as_mut_ip_connection(&mut self) -> Option<&mut IpConnection> {
437 let which_node = match self.which_node {
438 Some(ref mut which_node) => which_node,
439 None => return None,
440 };
441
442 if let WhichNode::IpConnectionNode(ref mut ip_connection) = which_node {
443 Some(ip_connection)
444 } else {
445 None
446 }
447 }
448
449 pub fn as_dynamic_node(&self) -> Option<&DynamicNode> {
450 let which_node = match self.which_node {
451 Some(ref which_node) => which_node,
452 None => return None,
453 };
454
455 if let WhichNode::DynamicNode(ref dynamic_node) = which_node {
456 Some(dynamic_node)
457 } else {
458 None
459 }
460 }
461
462 pub fn into_dynamic_node(self) -> Option<DynamicNode> {
463 let which_node = match self.which_node {
464 Some(which_node) => which_node,
465 None => return None,
466 };
467
468 if let WhichNode::DynamicNode(dynamic_node) = which_node {
469 Some(dynamic_node)
470 } else {
471 None
472 }
473 }
474
475 pub fn as_mut_dynamic_node(&mut self) -> Option<&mut DynamicNode> {
476 let which_node = match self.which_node {
477 Some(ref mut which_node) => which_node,
478 None => {
479 warn!("Failed to determine variant of node");
480 return None;
481 }
482 };
483
484 if let WhichNode::DynamicNode(ref mut dynamic_node) = which_node {
485 Some(dynamic_node)
486 } else {
487 None
488 }
489 }
490
491 pub fn into_json(self) -> Value {
492 let which_node = match self.which_node {
493 Some(which_node) => which_node,
494 None => {
495 panic!("Failed to determine variant of node");
496 }
497 };
498
499 match which_node {
500 WhichNode::AssetNode(asset_node) => asset_node.into_json(),
501 WhichNode::ProcessNode(process_node) => process_node.into_json(),
502 WhichNode::FileNode(file_node) => file_node.into_json(),
503 WhichNode::IpAddressNode(ip_address_node) => ip_address_node.into_json(),
504 WhichNode::ProcessOutboundConnectionNode(process_outbound_connection_node) => {
505 process_outbound_connection_node.into_json()
506 }
507 WhichNode::ProcessInboundConnectionNode(process_inbound_connection_node) => {
508 process_inbound_connection_node.into_json()
509 }
510 WhichNode::IpPortNode(ip_port_node) => ip_port_node.into_json(),
511 WhichNode::NetworkConnectionNode(network_connection_node) => {
512 network_connection_node.into_json()
513 }
514 WhichNode::IpConnectionNode(ip_connection_node) => ip_connection_node.into_json(),
515 WhichNode::DynamicNode(dynamic_node) => dynamic_node.into_json(),
516 }
517 }
518}
519
520impl NodeT for Node {
521 fn get_asset_id(&self) -> Option<&str> {
522 let which_node = match self.which_node {
523 Some(ref which_node) => which_node,
524 None => {
525 warn!("Failed to determine variant of node");
526 return None;
527 }
528 };
529
530 match which_node {
531 WhichNode::AssetNode(asset_node) => asset_node.get_asset_id(),
532 WhichNode::ProcessNode(process_node) => process_node.get_asset_id(),
533 WhichNode::FileNode(file_node) => file_node.get_asset_id(),
534 WhichNode::IpAddressNode(ip_address_node) => ip_address_node.get_asset_id(),
535 WhichNode::ProcessOutboundConnectionNode(process_outbound_connection_node) => {
536 process_outbound_connection_node.get_asset_id()
537 }
538 WhichNode::ProcessInboundConnectionNode(process_inbound_connection_node) => {
539 process_inbound_connection_node.get_asset_id()
540 }
541 WhichNode::IpPortNode(ip_port_node) => ip_port_node.get_asset_id(),
542 WhichNode::NetworkConnectionNode(network_connection_node) => {
543 network_connection_node.get_asset_id()
544 }
545 WhichNode::IpConnectionNode(ip_connection_node) => ip_connection_node.get_asset_id(),
546 WhichNode::DynamicNode(dynamic_node) => dynamic_node.get_asset_id(),
547 }
548 }
549
550 fn set_asset_id(&mut self, asset_id: impl Into<String>) {
551 let which_node = match self.which_node {
552 Some(ref mut which_node) => which_node,
553 None => {
554 warn!("Failed to determine variant of node");
555 return;
556 }
557 };
558
559 match which_node {
560 WhichNode::AssetNode(ref mut asset_node) => asset_node.set_asset_id(asset_id.into()),
561 WhichNode::ProcessNode(ref mut process_node) => {
562 process_node.set_asset_id(asset_id.into())
563 }
564 WhichNode::FileNode(ref mut file_node) => file_node.set_asset_id(asset_id.into()),
565 WhichNode::IpAddressNode(ref mut ip_address_node) => {
566 ip_address_node.set_asset_id(asset_id.into())
567 }
568 WhichNode::ProcessOutboundConnectionNode(ref mut process_outbound_connection_node) => {
569 process_outbound_connection_node.set_asset_id(asset_id.into())
570 }
571 WhichNode::ProcessInboundConnectionNode(ref mut process_inbound_connection_node) => {
572 process_inbound_connection_node.set_asset_id(asset_id.into())
573 }
574 WhichNode::IpPortNode(ref mut ip_port_node) => {
575 ip_port_node.set_asset_id(asset_id.into())
576 }
577 WhichNode::NetworkConnectionNode(ref mut network_connection_node) => {
578 network_connection_node.set_asset_id(asset_id.into())
579 }
580 WhichNode::IpConnectionNode(ip_connection_node) => {
581 ip_connection_node.set_asset_id(asset_id.into())
582 }
583 WhichNode::DynamicNode(ref mut dynamic_node) => {
584 dynamic_node.set_asset_id(asset_id.into())
585 }
586 }
587 }
588
589 fn get_node_key(&self) -> &str {
590 let which_node = match self.which_node {
591 Some(ref which_node) => which_node,
592 None => {
593 panic!("Failed to determine variant of node");
594 }
595 };
596
597 match which_node {
598 WhichNode::AssetNode(asset_node) => asset_node.get_node_key(),
599 WhichNode::ProcessNode(process_node) => process_node.get_node_key(),
600 WhichNode::FileNode(file_node) => file_node.get_node_key(),
601 WhichNode::IpAddressNode(ip_address_node) => ip_address_node.get_node_key(),
602 WhichNode::ProcessOutboundConnectionNode(process_outbound_connection_node) => {
603 process_outbound_connection_node.get_node_key()
604 }
605 WhichNode::ProcessInboundConnectionNode(process_inbound_connection_node) => {
606 process_inbound_connection_node.get_node_key()
607 }
608 WhichNode::IpPortNode(ip_port_node) => ip_port_node.get_node_key(),
609 WhichNode::NetworkConnectionNode(network_connection_node) => {
610 network_connection_node.get_node_key()
611 }
612 WhichNode::IpConnectionNode(ip_connection_node) => ip_connection_node.get_node_key(),
613 WhichNode::DynamicNode(dynamic_node) => dynamic_node.get_node_key(),
614 }
615 }
616
617 fn set_node_key(&mut self, node_key: impl Into<String>) {
618 let which_node = match self.which_node {
619 Some(ref mut which_node) => which_node,
620 None => {
621 warn!("Failed to determine variant of node");
622 return;
623 }
624 };
625
626 match which_node {
627 WhichNode::AssetNode(ref mut asset_node) => asset_node.set_node_key(node_key.into()),
628 WhichNode::ProcessNode(ref mut process_node) => {
629 process_node.set_node_key(node_key.into())
630 }
631 WhichNode::FileNode(ref mut file_node) => file_node.set_node_key(node_key.into()),
632 WhichNode::IpAddressNode(ref mut ip_address_node) => {
633 ip_address_node.set_node_key(node_key.into())
634 }
635 WhichNode::ProcessOutboundConnectionNode(ref mut process_outbound_connection_node) => {
636 process_outbound_connection_node.set_node_key(node_key.into())
637 }
638 WhichNode::ProcessInboundConnectionNode(ref mut process_inbound_connection_node) => {
639 process_inbound_connection_node.set_node_key(node_key.into())
640 }
641 WhichNode::IpPortNode(ref mut ip_port_node) => {
642 ip_port_node.set_node_key(node_key.into())
643 }
644 WhichNode::NetworkConnectionNode(ref mut network_connection_node) => {
645 network_connection_node.set_node_key(node_key.into())
646 }
647 WhichNode::IpConnectionNode(ip_connection_node) => {
648 ip_connection_node.set_node_key(node_key.into())
649 }
650 WhichNode::DynamicNode(ref mut dynamic_node) => {
651 dynamic_node.set_node_key(node_key.into())
652 }
653 }
654 }
655
656 fn merge(&mut self, other: &Self) -> bool {
657 let which_node = match self.which_node {
658 Some(ref mut which_node) => which_node,
659 None => {
660 warn!("Failed to determine variant of node");
661 return false;
662 }
663 };
664
665 match which_node {
666 WhichNode::AssetNode(ref mut asset_node) => {
667 if let Some(WhichNode::AssetNode(ref other)) = other.which_node {
668 asset_node.merge(other)
669 } else {
670 warn!("Attempted to merge AssetNode with non-AssetNode ");
671 false
672 }
673 }
674 WhichNode::ProcessNode(ref mut process_node) => {
675 if let Some(WhichNode::ProcessNode(ref other)) = other.which_node {
676 process_node.merge(other)
677 } else {
678 warn!("Attempted to merge ProcessNode with non-ProcessNode ");
679 false
680 }
681 }
682 WhichNode::FileNode(ref mut file_node) => {
683 if let Some(WhichNode::FileNode(ref other)) = other.which_node {
684 file_node.merge(other)
685 } else {
686 warn!("Attempted to merge FileNode with non-FileNode ");
687 false
688 }
689 }
690 WhichNode::IpAddressNode(ref mut ip_address_node) => {
691 if let Some(WhichNode::IpAddressNode(ref other)) = other.which_node {
692 ip_address_node.merge(other)
693 } else {
694 warn!("Attempted to merge IpAddressNode with non-IpAddressNode ");
695 false
696 }
697 }
698 WhichNode::ProcessOutboundConnectionNode(ref mut process_outbound_connection_node) => {
699 if let Some(WhichNode::ProcessOutboundConnectionNode(ref other)) = other.which_node
700 {
701 process_outbound_connection_node.merge(other)
702 } else {
703 warn!("Attempted to merge ProcessOutboundConnectionNode with non-ProcessOutboundConnectionNode ");
704 false
705 }
706 }
707 WhichNode::ProcessInboundConnectionNode(ref mut process_inbound_connection_node) => {
708 if let Some(WhichNode::ProcessInboundConnectionNode(ref other)) = other.which_node {
709 process_inbound_connection_node.merge(other)
710 } else {
711 warn!("Attempted to merge ProcessInboundConnectionNode with non-ProcessInboundConnectionNode ");
712 false
713 }
714 }
715 WhichNode::IpPortNode(ref mut ip_port_node) => {
716 if let Some(WhichNode::IpPortNode(ref other)) = other.which_node {
717 ip_port_node.merge(other)
718 } else {
719 warn!("Attempted to merge IpPortNode with non-IpPortNode ");
720 false
721 }
722 }
723 WhichNode::NetworkConnectionNode(ref mut network_connection_node) => {
724 if let Some(WhichNode::NetworkConnectionNode(ref other)) = other.which_node {
725 network_connection_node.merge(other)
726 } else {
727 warn!(
728 "Attempted to merge NetworkConnectionNode with non-NetworkConnectionNode "
729 );
730 false
731 }
732 }
733 WhichNode::IpConnectionNode(ip_connection_node) => {
734 if let Some(WhichNode::IpConnectionNode(ref other)) = other.which_node {
735 ip_connection_node.merge(other)
736 } else {
737 warn!("Attempted to merge IpConnectionNode with non-NetworkConnectionNode ");
738 false
739 }
740 }
741 WhichNode::DynamicNode(ref mut dynamic_node) => {
742 if let Some(WhichNode::DynamicNode(ref other)) = other.which_node {
743 dynamic_node.merge(other)
744 } else {
745 warn!("Attempted to merge DynamicNode with non-DynamicNode ");
746 false
747 }
748 }
749 }
750 }
751
752 fn merge_into(&mut self, other: Self) -> bool {
753 let which_node = match self.which_node {
754 Some(ref mut which_node) => which_node,
755 None => {
756 warn!("Failed to determine variant of node");
757 return false;
758 }
759 };
760
761 match which_node {
762 WhichNode::AssetNode(ref mut asset_node) => {
763 if let Some(WhichNode::AssetNode(other)) = other.which_node {
764 asset_node.merge_into(other)
765 } else {
766 warn!("Attempted to merge AssetNode with non-AssetNode ");
767 false
768 }
769 }
770 WhichNode::ProcessNode(ref mut process_node) => {
771 if let Some(WhichNode::ProcessNode(other)) = other.which_node {
772 process_node.merge_into(other)
773 } else {
774 warn!("Attempted to merge ProcessNode with non-ProcessNode ");
775 false
776 }
777 }
778 WhichNode::FileNode(ref mut file_node) => {
779 if let Some(WhichNode::FileNode(other)) = other.which_node {
780 file_node.merge_into(other)
781 } else {
782 warn!("Attempted to merge FileNode with non-FileNode ");
783 false
784 }
785 }
786 WhichNode::IpAddressNode(ref mut ip_address_node) => {
787 if let Some(WhichNode::IpAddressNode(other)) = other.which_node {
788 ip_address_node.merge_into(other)
789 } else {
790 warn!("Attempted to merge IpAddressNode with non-IpAddressNode ");
791 false
792 }
793 }
794 WhichNode::ProcessOutboundConnectionNode(ref mut process_outbound_connection_node) => {
795 if let Some(WhichNode::ProcessOutboundConnectionNode(other)) = other.which_node {
796 process_outbound_connection_node.merge_into(other)
797 } else {
798 warn!("Attempted to merge ProcessOutboundConnectionNode with non-ProcessOutboundConnectionNode ");
799 false
800 }
801 }
802 WhichNode::ProcessInboundConnectionNode(ref mut process_inbound_connection_node) => {
803 if let Some(WhichNode::ProcessInboundConnectionNode(other)) = other.which_node {
804 process_inbound_connection_node.merge_into(other)
805 } else {
806 warn!("Attempted to merge ProcessInboundConnectionNode with non-ProcessInboundConnectionNode ");
807 false
808 }
809 }
810 WhichNode::IpPortNode(ref mut ip_port_node) => {
811 if let Some(WhichNode::IpPortNode(other)) = other.which_node {
812 ip_port_node.merge_into(other)
813 } else {
814 warn!("Attempted to merge IpPortNode with non-IpPortNode ");
815 false
816 }
817 }
818 WhichNode::NetworkConnectionNode(ref mut network_connection_node) => {
819 if let Some(WhichNode::NetworkConnectionNode(other)) = other.which_node {
820 network_connection_node.merge_into(other)
821 } else {
822 warn!(
823 "Attempted to merge NetworkConnectionNode with non-NetworkConnectionNode "
824 );
825 false
826 }
827 }
828 WhichNode::IpConnectionNode(ip_connection_node) => {
829 if let Some(WhichNode::IpConnectionNode(other)) = other.which_node {
830 ip_connection_node.merge_into(other)
831 } else {
832 warn!("Attempted to merge IpConnectionNode with non-NetworkConnectionNode ");
833 false
834 }
835 }
836 WhichNode::DynamicNode(ref mut dynamic_node) => {
837 if let Some(WhichNode::DynamicNode(other)) = other.which_node {
838 dynamic_node.merge_into(other)
839 } else {
840 warn!("Attempted to merge DynamicNode with non-DynamicNode ");
841 false
842 }
843 }
844 }
845 }
846}