Skip to main content

jsonld_core/deserialization/object/
node.rs

1use ld_core::{LinkedData, LinkedDataGraph, LinkedDataPredicateObjects, LinkedDataResource, LinkedDataSubject, ResourceInterpretation};
2use rdfx::Interpretation;
3
4use crate::{IndexedNode, IndexedObject, Node, rdf::RDF_TYPE};
5
6impl<T, B, I: Interpretation> LinkedDataResource<I> for Node<T, B>
7where
8    T: LinkedDataResource<I>,
9    B: LinkedDataResource<I>,
10{
11    fn interpretation(&self, interpretation: &mut I) -> ResourceInterpretation<'_, I> {
12        match &self.id {
13            Some(crate::Id::Valid(id)) => id.interpretation(interpretation),
14            _ => ResourceInterpretation::Uninterpreted(None),
15        }
16    }
17}
18
19impl<T, B, I: Interpretation> LinkedDataSubject<I> for Node<T, B>
20where
21    T: LinkedDataResource<I> + LinkedDataSubject<I>,
22    B: LinkedDataResource<I> + LinkedDataSubject<I>,
23{
24    fn visit_subject<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
25    where
26        S: ld_core::SubjectVisitor<I>,
27    {
28        if !self.types().is_empty() {
29            visitor.predicate(&RDF_TYPE, &Types(self.types()))?;
30        }
31
32        for (property, objects) in self.properties() {
33            if let crate::Id::Valid(id) = property {
34                visitor.predicate(id, &Objects(objects))?;
35            }
36        }
37
38        if let Some(reverse_properties) = self.reverse_properties() {
39            for (property, nodes) in reverse_properties {
40                if let crate::Id::Valid(id) = property {
41                    visitor.reverse_predicate(id, &Nodes(nodes))?;
42                }
43            }
44        }
45
46        if self.is_graph() {
47            visitor.graph(self)?;
48        }
49
50        if let Some(included) = self.included() {
51            for node in included {
52                visitor.include(node.inner())?;
53            }
54        }
55
56        visitor.end()
57    }
58}
59
60impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for Node<T, B>
61where
62    T: LinkedDataResource<I> + LinkedDataSubject<I>,
63    B: LinkedDataResource<I> + LinkedDataSubject<I>,
64{
65    fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
66    where
67        S: ld_core::PredicateObjectsVisitor<I>,
68    {
69        visitor.object(self)?;
70        visitor.end()
71    }
72}
73
74impl<T, B, I: Interpretation> LinkedDataGraph<I> for Node<T, B>
75where
76    T: LinkedDataResource<I> + LinkedDataSubject<I>,
77    B: LinkedDataResource<I> + LinkedDataSubject<I>,
78{
79    fn visit_graph<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
80    where
81        S: ld_core::GraphVisitor<I>,
82    {
83        match self.graph() {
84            Some(g) => {
85                for object in g {
86                    visitor.subject(object.inner())?;
87                }
88            }
89            None => {
90                visitor.subject(self)?;
91            }
92        }
93
94        visitor.end()
95    }
96}
97
98impl<T, B, I: Interpretation> LinkedData<I> for Node<T, B>
99where
100    T: LinkedDataResource<I> + LinkedDataSubject<I>,
101    B: LinkedDataResource<I> + LinkedDataSubject<I>,
102{
103    fn visit<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
104    where
105        S: ld_core::Visitor<I>,
106    {
107        if self.is_graph() {
108            visitor.named_graph(self)?;
109        } else {
110            visitor.default_graph(self)?;
111        }
112
113        visitor.end()
114    }
115}
116
117struct Types<'a, T, B>(&'a [crate::Id<T, B>]);
118
119impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for Types<'_, T, B>
120where
121    T: LinkedDataResource<I> + LinkedDataSubject<I>,
122    B: LinkedDataResource<I> + LinkedDataSubject<I>,
123{
124    fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
125    where
126        S: ld_core::PredicateObjectsVisitor<I>,
127    {
128        for ty in self.0 {
129            if let crate::Id::Valid(id) = ty {
130                visitor.object(id)?;
131            }
132        }
133
134        visitor.end()
135    }
136}
137
138struct Objects<'a, T, B>(&'a [IndexedObject<T, B>]);
139
140impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for Objects<'_, T, B>
141where
142    T: LinkedDataResource<I> + LinkedDataSubject<I>,
143    B: LinkedDataResource<I> + LinkedDataSubject<I>,
144{
145    fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
146    where
147        S: ld_core::PredicateObjectsVisitor<I>,
148    {
149        for object in self.0 {
150            visitor.object(object.inner())?;
151        }
152
153        visitor.end()
154    }
155}
156
157struct Nodes<'a, T, B>(&'a [IndexedNode<T, B>]);
158
159impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for Nodes<'_, T, B>
160where
161    T: LinkedDataResource<I> + LinkedDataSubject<I>,
162    B: LinkedDataResource<I> + LinkedDataSubject<I>,
163{
164    fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
165    where
166        S: ld_core::PredicateObjectsVisitor<I>,
167    {
168        for node in self.0 {
169            visitor.object(node.inner())?;
170        }
171
172        visitor.end()
173    }
174}