json-ld 0.22.0

JSON-LD implementation
Documentation
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()
	}
}