1use crate::{NodeSelector, ShapeSelector};
2use serde::Serialize;
3use shex_ast::{object_value::ObjectValue, ShapeExprLabel};
4use srdf::Query;
5use std::iter::once;
6
7#[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}