json_ld/algorithms/deserialization/object/
node.rs1use 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}