Skip to main content

json_ld/algorithms/deserialization/object/
node.rs

1use linked_data::{
2	LinkedDataSerializer, SerializeLinkedData,
3	ser::{IdSerializer, SerializeLinkedDataWith},
4};
5use rdf_syntax::{RDF_TYPE, Term};
6
7use crate::{JsonLdLenient, JsonLdNode};
8
9use super::super::RdfSerializationOptions;
10
11impl SerializeLinkedDataWith<RdfSerializationOptions> for JsonLdNode {
12	fn serialize_rdf_with<S>(
13		&self,
14		opts: RdfSerializationOptions,
15		mut serializer: S,
16		graph: Option<&Term>,
17	) -> Result<S::Ok, S::Error>
18	where
19		S: LinkedDataSerializer<Term>,
20	{
21		let subject = match &self.id {
22			Some(JsonLdLenient::Valid(id)) => id.clone().into(),
23			Some(JsonLdLenient::Invalid(_)) => return serializer.end(),
24			None => serializer.interpret(None)?,
25		};
26
27		if let Some(types) = &self.types
28			&& !types.is_empty()
29		{
30			let predicate = Term::iri(RDF_TYPE.to_owned());
31			types.serialize_rdf_objects(&mut serializer, &subject, &predicate, graph)?;
32		}
33
34		for (id, objects) in self.properties() {
35			let property = id.serialize_rdf_term(&mut serializer)?;
36			if !opts.produce_generalized_rdf && !property.is_iri() {
37				continue;
38			}
39			for obj in objects {
40				obj.serialize_rdf_objects_with(
41					opts.clone(),
42					serializer.as_dyn_mut(),
43					&subject,
44					&property,
45					graph,
46				)?;
47			}
48		}
49
50		if let Some(reverse) = self.reverse_properties() {
51			for (id, subjects) in reverse {
52				let property = id.serialize_rdf_term(&mut serializer)?;
53				if !opts.produce_generalized_rdf && !property.is_iri() {
54					continue;
55				}
56				for rev_subject in subjects {
57					let rev_subject = match rev_subject
58						.serialize_rdf(IdSerializer::new(serializer.as_dyn_mut()), graph)?
59					{
60						Some(s) => s,
61						None => serializer.interpret(None)?,
62					};
63					subject.serialize_rdf_objects(
64						serializer.as_dyn_mut(),
65						&rev_subject,
66						&property,
67						graph,
68					)?;
69				}
70			}
71		}
72
73		self.graph.serialize_rdf_graph_with(
74			opts.clone(),
75			serializer.as_dyn_mut(),
76			Some(&subject),
77		)?;
78
79		serializer.serialize_resource(Some(subject))?;
80
81		self.included
82			.serialize_rdf_graph_with(opts, serializer, graph)
83	}
84}
85
86impl SerializeLinkedData for JsonLdNode {
87	fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
88	where
89		S: LinkedDataSerializer<Term>,
90	{
91		self.serialize_rdf_with(RdfSerializationOptions::default(), serializer, graph)
92	}
93}