1use iri_rs::IriBuf;
2use rdfx::Interpretation;
3
4use crate::{LinkedData, LinkedDataPredicateObjects, LinkedDataResource, LinkedDataSubject};
5
6pub trait LinkedDataGraph<I: Interpretation = ()> {
8 fn visit_graph<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
10 where
11 S: GraphVisitor<I>;
12}
13
14impl<I: Interpretation> LinkedDataGraph<I> for () {
15 fn visit_graph<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
16 where
17 S: GraphVisitor<I>,
18 {
19 visitor.end()
20 }
21}
22
23impl<I: Interpretation, T: ?Sized + LinkedDataGraph<I>> LinkedDataGraph<I> for &T {
24 fn visit_graph<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
25 where
26 S: GraphVisitor<I>,
27 {
28 T::visit_graph(self, visitor)
29 }
30}
31
32impl<I: Interpretation, T: ?Sized + LinkedDataGraph<I>> LinkedDataGraph<I> for Box<T> {
33 fn visit_graph<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
34 where
35 S: GraphVisitor<I>,
36 {
37 T::visit_graph(self, visitor)
38 }
39}
40
41impl<I: Interpretation> LinkedDataGraph<I> for IriBuf {
42 fn visit_graph<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
43 where
44 S: GraphVisitor<I>,
45 {
46 visitor.end()
47 }
48}
49
50impl<I: Interpretation, T: LinkedDataSubject<I> + LinkedDataResource<I>> LinkedDataGraph<I>
51 for [T]
52{
53 fn visit_graph<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
54 where
55 S: GraphVisitor<I>,
56 {
57 for t in self {
58 visitor.subject(t)?;
59 }
60 visitor.end()
61 }
62}
63
64impl<I: Interpretation, T: LinkedDataSubject<I> + LinkedDataResource<I>> LinkedDataGraph<I>
65 for Vec<T>
66{
67 fn visit_graph<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
68 where
69 S: GraphVisitor<I>,
70 {
71 for t in self {
72 visitor.subject(t)?;
73 }
74 visitor.end()
75 }
76}
77
78pub trait GraphVisitor<I: Interpretation> {
80 type Ok;
82 type Error;
84
85 fn subject<T>(&mut self, value: &T) -> Result<(), Self::Error>
87 where
88 T: ?Sized + LinkedDataResource<I> + LinkedDataSubject<I>;
89
90 fn end(self) -> Result<Self::Ok, Self::Error>;
92}
93
94impl<I: Interpretation, S: GraphVisitor<I>> GraphVisitor<I> for &mut S {
95 type Ok = ();
96 type Error = S::Error;
97
98 fn subject<T>(&mut self, value: &T) -> Result<(), Self::Error>
99 where
100 T: ?Sized + LinkedDataResource<I> + LinkedDataSubject<I>,
101 {
102 S::subject(self, value)
103 }
104
105 fn end(self) -> Result<Self::Ok, Self::Error> {
106 Ok(())
107 }
108}
109
110pub struct AnonymousGraph<T>(pub T);
112
113impl<I: Interpretation, T> LinkedDataResource<I> for AnonymousGraph<T> {
114 fn interpretation(&self, _interpretation: &mut I) -> crate::ResourceInterpretation<'_, I> {
115 crate::ResourceInterpretation::Uninterpreted(None)
116 }
117}
118
119impl<I: Interpretation, T: LinkedDataGraph<I>> LinkedDataSubject<I> for AnonymousGraph<T> {
120 fn visit_subject<S>(&self, mut serializer: S) -> Result<S::Ok, S::Error>
121 where
122 S: crate::SubjectVisitor<I>,
123 {
124 serializer.graph(&self.0)?;
125 serializer.end()
126 }
127}
128
129impl<I: Interpretation, T: LinkedDataGraph<I>> LinkedDataPredicateObjects<I> for AnonymousGraph<T> {
130 fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
131 where
132 S: crate::PredicateObjectsVisitor<I>,
133 {
134 visitor.object(self)?;
135 visitor.end()
136 }
137}
138
139impl<I: Interpretation, T: LinkedDataGraph<I>> LinkedDataGraph<I> for AnonymousGraph<T> {
140 fn visit_graph<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
141 where
142 S: GraphVisitor<I>,
143 {
144 T::visit_graph(&self.0, visitor)
145 }
146}
147
148impl<I: Interpretation, T: LinkedDataGraph<I>> LinkedData<I> for AnonymousGraph<T> {
149 fn visit<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
150 where
151 S: crate::Visitor<I>,
152 {
153 visitor.named_graph(self)?;
154 visitor.end()
155 }
156}