shapemap/
association.rs

1use crate::{NodeSelector, ShapeSelector};
2use serde::Serialize;
3use shex_ast::{object_value::ObjectValue, ShapeExprLabel};
4use srdf::Query;
5use std::iter::once;
6
7/// Combines a [`NodeSelector`] with a [`ShapeExprLabel`]
8#[derive(Debug, PartialEq, Clone, Serialize)]
9pub struct Association {
10    pub node_selector: NodeSelector,
11    pub shape_selector: ShapeSelector,
12}
13
14impl Association {
15    pub fn new(node_selector: NodeSelector, shape_selector: ShapeSelector) -> Self {
16        Association {
17            node_selector,
18            shape_selector,
19        }
20    }
21
22    pub fn iter_node_shape<S>(
23        &self,
24        rdf: &S,
25    ) -> impl Iterator<Item = (&ObjectValue, &ShapeExprLabel)>
26    where
27        S: Query,
28    {
29        self.node_selector.iter_node(rdf).flat_map(move |node| {
30            self.shape_selector
31                .iter_shape()
32                .flat_map(move |label| once((node, label)))
33        })
34    }
35}