json_ld/algorithms/deserialization/object/
list.rs1use linked_data::{LinkedDataSerializer, SerializeLinkedData, ser::SerializeLinkedDataWith};
2use rdf_syntax::{RDF_FIRST, RDF_NIL, RDF_REST, Term};
3
4use crate::{JsonLdIndexedObject, object::JsonLdList};
5
6use super::super::RdfSerializationOptions;
7
8impl SerializeLinkedDataWith<RdfSerializationOptions> for JsonLdList {
9 fn serialize_rdf_with<S>(
10 &self,
11 opts: RdfSerializationOptions,
12 serializer: S,
13 graph: Option<&Term>,
14 ) -> Result<S::Ok, S::Error>
15 where
16 S: LinkedDataSerializer<Term>,
17 {
18 RestWith(self.as_slice(), opts).serialize_rdf(serializer, graph)
19 }
20}
21
22impl SerializeLinkedData for JsonLdList {
23 fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
24 where
25 S: LinkedDataSerializer<Term>,
26 {
27 self.serialize_rdf_with(RdfSerializationOptions::default(), serializer, graph)
28 }
29}
30
31struct RestWith<'a>(&'a [JsonLdIndexedObject], RdfSerializationOptions);
32
33impl SerializeLinkedData for RestWith<'_> {
34 fn serialize_rdf<S>(&self, mut serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
35 where
36 S: LinkedDataSerializer<Term>,
37 {
38 let node = match self.0.split_first() {
39 Some((first, rest)) => {
40 let subject = serializer.interpret(None)?;
41 let predicate = Term::iri(RDF_FIRST.to_owned());
42 first.serialize_rdf_objects_with(
43 self.1.clone(),
44 serializer.as_dyn_mut(),
45 &subject,
46 &predicate,
47 graph,
48 )?;
49 let predicate = Term::iri(RDF_REST.to_owned());
50 RestWith(rest, self.1.clone()).serialize_rdf_objects(
51 serializer.as_dyn_mut(),
52 &subject,
53 &predicate,
54 graph,
55 )?;
56 subject
57 }
58 None => Term::iri(RDF_NIL.to_owned()),
59 };
60
61 serializer.serialize_resource(Some(node))?;
62 serializer.end()
63 }
64}