jsonld_core/deserialization/object/
node.rs1use 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}