jsonld_core/deserialization/object/
list.rs1use ld_core::{
2 BorrowedRdfTerm,
3 CowRdfTerm,
4 LinkedData,
5 LinkedDataGraph,
6 LinkedDataPredicateObjects,
7 LinkedDataResource,
8 LinkedDataSubject,
9 ResourceInterpretation,
10};
11use rdfx::Interpretation;
12
13use crate::{
14 IndexedObject,
15 object::List,
16 rdf::{RDF_FIRST, RDF_NIL, RDF_REST},
17};
18
19impl<T, B, I: Interpretation> LinkedDataResource<I> for List<T, B> {
20 fn interpretation(&self, _interpretation: &mut I) -> ResourceInterpretation<'_, I> {
21 ResourceInterpretation::Uninterpreted(None)
22 }
23}
24
25impl<T, B, I: Interpretation> LinkedDataSubject<I> for List<T, B>
26where
27 T: LinkedDataResource<I> + LinkedDataSubject<I>,
28 B: LinkedDataResource<I> + LinkedDataSubject<I>,
29{
30 fn visit_subject<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
31 where
32 S: ld_core::SubjectVisitor<I>,
33 {
34 Rest(self.as_slice()).visit_subject(visitor)
35 }
36}
37
38impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for List<T, B>
39where
40 T: LinkedDataResource<I> + LinkedDataSubject<I>,
41 B: LinkedDataResource<I> + LinkedDataSubject<I>,
42{
43 fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
44 where
45 S: ld_core::PredicateObjectsVisitor<I>,
46 {
47 visitor.object(self)?;
48 visitor.end()
49 }
50}
51
52impl<T, B, I: Interpretation> LinkedDataGraph<I> for List<T, B>
53where
54 T: LinkedDataResource<I> + LinkedDataSubject<I>,
55 B: LinkedDataResource<I> + LinkedDataSubject<I>,
56{
57 fn visit_graph<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
58 where
59 S: ld_core::GraphVisitor<I>,
60 {
61 visitor.subject(self)?;
62 visitor.end()
63 }
64}
65
66impl<T, B, I: Interpretation> LinkedData<I> for List<T, B>
67where
68 T: LinkedDataResource<I> + LinkedDataSubject<I>,
69 B: LinkedDataResource<I> + LinkedDataSubject<I>,
70{
71 fn visit<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
72 where
73 S: ld_core::Visitor<I>,
74 {
75 visitor.default_graph(self)?;
76 visitor.end()
77 }
78}
79
80struct Rest<'a, T, B>(&'a [IndexedObject<T, B>]);
81
82impl<T, B, I: Interpretation> LinkedDataResource<I> for Rest<'_, T, B> {
83 fn interpretation(&self, _interpretation: &mut I) -> ResourceInterpretation<'_, I> {
84 if self.0.is_empty() {
85 ResourceInterpretation::Uninterpreted(Some(CowRdfTerm::Borrowed(BorrowedRdfTerm::Iri(RDF_NIL))))
88 } else {
89 ResourceInterpretation::Uninterpreted(None)
90 }
91 }
92}
93
94impl<T, B, I: Interpretation> LinkedDataSubject<I> for Rest<'_, T, B>
95where
96 T: LinkedDataResource<I> + LinkedDataSubject<I>,
97 B: LinkedDataResource<I> + LinkedDataSubject<I>,
98{
99 fn visit_subject<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
100 where
101 S: ld_core::SubjectVisitor<I>,
102 {
103 if let Some((first, rest)) = self.0.split_first() {
104 visitor.predicate(&RDF_FIRST, first.inner())?;
105 visitor.predicate(&RDF_REST, &Rest(rest))?;
106 }
107
108 visitor.end()
109 }
110}
111
112impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for Rest<'_, T, B>
113where
114 T: LinkedDataResource<I> + LinkedDataSubject<I>,
115 B: LinkedDataResource<I> + LinkedDataSubject<I>,
116{
117 fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
118 where
119 S: ld_core::PredicateObjectsVisitor<I>,
120 {
121 visitor.object(self)?;
122 visitor.end()
123 }
124}