schema2000/merge/
any.rs

1use crate::merge;
2use crate::model::{AnyNode, NodeType};
3
4pub fn merge_any(xs: &AnyNode, ys: AnyNode) -> NodeType {
5    let xs = &xs.nodes;
6    let ys = ys.nodes;
7
8    let mut zs = xs.clone();
9    for node_type in ys {
10        match node_type {
11            node @ NodeType::Object { .. } => match xs.iter().find(|x| x.is_object()) {
12                None => {
13                    zs.insert(node);
14                }
15                Some(other @ NodeType::Object { .. }) => {
16                    zs.remove(other);
17                    zs.insert(merge::merge_node_type(node, other.clone()));
18                }
19                Some(_) => unreachable!(),
20            },
21            node @ NodeType::Array(_) => match xs.iter().find(|x| x.is_array()) {
22                None => {
23                    zs.insert(node);
24                }
25                Some(other @ NodeType::Array(_)) => {
26                    zs.remove(other);
27                    zs.insert(merge::merge_node_type(node, other.clone()));
28                }
29                Some(_) => unreachable!(),
30            },
31            _ => {
32                zs.insert(node_type);
33            }
34        }
35    }
36
37    AnyNode::new(zs).into()
38}