Skip to main content

jsonld_core/deserialization/object/
list.rs

1use 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            // The empty list is the well-known `rdf:nil` resource, not a
86            // fresh anonymous node.
87            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}