Skip to main content

ld_core/
graph.rs

1use iri_rs::IriBuf;
2use rdfx::Interpretation;
3
4use crate::{LinkedData, LinkedDataPredicateObjects, LinkedDataResource, LinkedDataSubject};
5
6/// Serialize a Linked-Data graph.
7pub trait LinkedDataGraph<I: Interpretation = ()> {
8	/// Visits the subjects of the graph represented by this value.
9	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
78/// Visitor over the subjects of an RDF graph.
79pub trait GraphVisitor<I: Interpretation> {
80	/// Value returned once the graph has been entirely visited.
81	type Ok;
82	/// Error type.
83	type Error;
84
85	/// Visits a subject of the graph.
86	fn subject<T>(&mut self, value: &T) -> Result<(), Self::Error>
87	where
88		T: ?Sized + LinkedDataResource<I> + LinkedDataSubject<I>;
89
90	/// Ends the graph visit.
91	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
110/// Wrapper serializing its value as an anonymous graph.
111pub 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}