use linked_data::{LinkedDataSerializer, SerializeLinkedData, ser::SerializeLinkedDataWith};
use rdf_syntax::{RDF_FIRST, RDF_NIL, RDF_REST, Term};
use crate::{JsonLdIndexedObject, object::JsonLdList};
use super::super::RdfSerializationOptions;
impl SerializeLinkedDataWith<RdfSerializationOptions> for JsonLdList {
fn serialize_rdf_with<S>(
&self,
opts: RdfSerializationOptions,
serializer: S,
graph: Option<&Term>,
) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
RestWith(self.as_slice(), opts).serialize_rdf(serializer, graph)
}
}
impl SerializeLinkedData for JsonLdList {
fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
self.serialize_rdf_with(RdfSerializationOptions::default(), serializer, graph)
}
}
struct RestWith<'a>(&'a [JsonLdIndexedObject], RdfSerializationOptions);
impl SerializeLinkedData for RestWith<'_> {
fn serialize_rdf<S>(&self, mut serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
where
S: LinkedDataSerializer<Term>,
{
let node = match self.0.split_first() {
Some((first, rest)) => {
let subject = serializer.interpret(None)?;
let predicate = Term::iri(RDF_FIRST.to_owned());
first.serialize_rdf_objects_with(
self.1.clone(),
serializer.as_dyn_mut(),
&subject,
&predicate,
graph,
)?;
let predicate = Term::iri(RDF_REST.to_owned());
RestWith(rest, self.1.clone()).serialize_rdf_objects(
serializer.as_dyn_mut(),
&subject,
&predicate,
graph,
)?;
subject
}
None => Term::iri(RDF_NIL.to_owned()),
};
serializer.serialize_resource(Some(node))?;
serializer.end()
}
}