json-ld 0.22.0

JSON-LD implementation
Documentation
use linked_data::{
	LinkedDataSerializer, SerializeLinkedData,
	ser::{IdSerializer, SerializeLinkedDataWith},
};
use rdf_syntax::{RDF_TYPE, Term};

use crate::{JsonLdLenient, JsonLdNode};

use super::super::RdfSerializationOptions;

impl SerializeLinkedDataWith<RdfSerializationOptions> for JsonLdNode {
	fn serialize_rdf_with<S>(
		&self,
		opts: RdfSerializationOptions,
		mut serializer: S,
		graph: Option<&Term>,
	) -> Result<S::Ok, S::Error>
	where
		S: LinkedDataSerializer<Term>,
	{
		let subject = match &self.id {
			Some(JsonLdLenient::Valid(id)) => id.clone().into(),
			Some(JsonLdLenient::Invalid(_)) => return serializer.end(),
			None => serializer.interpret(None)?,
		};

		if let Some(types) = &self.types
			&& !types.is_empty()
		{
			let predicate = Term::iri(RDF_TYPE.to_owned());
			types.serialize_rdf_objects(&mut serializer, &subject, &predicate, graph)?;
		}

		for (id, objects) in self.properties() {
			let property = id.serialize_rdf_term(&mut serializer)?;
			if !opts.produce_generalized_rdf && !property.is_iri() {
				continue;
			}
			for obj in objects {
				obj.serialize_rdf_objects_with(
					opts.clone(),
					serializer.as_dyn_mut(),
					&subject,
					&property,
					graph,
				)?;
			}
		}

		if let Some(reverse) = self.reverse_properties() {
			for (id, subjects) in reverse {
				let property = id.serialize_rdf_term(&mut serializer)?;
				if !opts.produce_generalized_rdf && !property.is_iri() {
					continue;
				}
				for rev_subject in subjects {
					let rev_subject = match rev_subject
						.serialize_rdf(IdSerializer::new(serializer.as_dyn_mut()), graph)?
					{
						Some(s) => s,
						None => serializer.interpret(None)?,
					};
					subject.serialize_rdf_objects(
						serializer.as_dyn_mut(),
						&rev_subject,
						&property,
						graph,
					)?;
				}
			}
		}

		self.graph.serialize_rdf_graph_with(
			opts.clone(),
			serializer.as_dyn_mut(),
			Some(&subject),
		)?;

		serializer.serialize_resource(Some(subject))?;

		self.included
			.serialize_rdf_graph_with(opts, serializer, graph)
	}
}

impl SerializeLinkedData for JsonLdNode {
	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)
	}
}