shapemap/
node_selector.rs

1use iri_s::IriS;
2use prefixmap::IriRef;
3use serde::Serialize;
4use shex_ast::{object_value::ObjectValue, Node};
5use srdf::literal::Literal;
6use srdf::shacl_path::SHACLPath;
7use srdf::Query;
8use thiserror::Error;
9
10/// A NodeSelector following [ShapeMap spec](https://shexspec.github.io/shape-map/#shapemap-structure) can be used to select RDF Nodes
11///
12#[derive(Debug, PartialEq, Clone, Serialize)]
13pub enum NodeSelector {
14    Node(ObjectValue),
15    TriplePattern {
16        subject: Pattern,
17        pred: IriS,
18        object: Pattern,
19    },
20    TriplePatternPath {
21        subject: Pattern,
22        pred: SHACLPath,
23        object: Pattern,
24    },
25    Sparql {
26        query: String,
27    },
28    Generic {
29        iri: IriS,
30        param: String,
31    },
32}
33
34impl NodeSelector {
35    pub fn iri_unchecked(str: &str) -> NodeSelector {
36        NodeSelector::Node(ObjectValue::iri(IriS::new_unchecked(str)))
37    }
38
39    pub fn iri_ref(iri: IriRef) -> NodeSelector {
40        NodeSelector::Node(ObjectValue::iri_ref(iri))
41    }
42
43    pub fn literal(lit: Literal) -> NodeSelector {
44        NodeSelector::Node(ObjectValue::literal(lit))
45    }
46
47    pub fn prefixed(alias: &str, local: &str) -> NodeSelector {
48        NodeSelector::Node(ObjectValue::prefixed(alias, local))
49    }
50
51    pub fn iter_node<S>(&self, _rdf: &S) -> impl Iterator<Item = &ObjectValue>
52    where
53        S: Query,
54    {
55        match self {
56            NodeSelector::Node(value) => std::iter::once(value),
57            _ => todo!(),
58        }
59    }
60}
61
62#[derive(Debug, Error)]
63pub enum NodeSelectorError {}
64
65impl NodeSelect for NodeSelector {
66    fn select<S>(&self, _rdf: S) -> Result<Vec<S::Term>, NodeSelectorError>
67    where
68        S: Query,
69    {
70        match self {
71            NodeSelector::Node(_node) => {
72                todo!()
73            }
74            NodeSelector::TriplePattern {
75                subject,
76                pred,
77                object,
78            } => match (subject, pred, object) {
79                (Pattern::Focus, _pred, Pattern::Wildcard) => todo!(),
80                (Pattern::Focus, _pred, Pattern::Node(_node)) => todo!(),
81                (Pattern::Wildcard, _pred, Pattern::Focus) => todo!(),
82                (Pattern::Node(_n), _pred, Pattern::Focus) => todo!(),
83                (_, _, _) => todo!(),
84            },
85            NodeSelector::TriplePatternPath { .. } => todo!(),
86            NodeSelector::Sparql { .. } => todo!(),
87            NodeSelector::Generic { .. } => todo!(),
88        }
89    }
90}
91#[derive(Debug, PartialEq, Clone, Serialize)]
92
93pub enum Pattern {
94    Node(Node),
95    Wildcard,
96    Focus,
97}
98
99#[allow(dead_code)]
100trait NodeSelect {
101    fn select<S>(&self, rdf: S) -> Result<Vec<S::Term>, NodeSelectorError>
102    where
103        S: Query;
104}