Skip to main content

json_ld/algorithms/deserialization/object/
list.rs

1use 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}