shapemap/
node_selector.rs1use 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#[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}