Skip to main content

json_ld/algorithms/deserialization/
mod.rs

1use linked_data::{LinkedDataSerializer, SerializeLinkedData, ser::SerializeLinkedDataWith};
2use rdf_syntax::{Id, Term};
3
4use crate::{JsonLdExpandedDocument, JsonLdLenient, JsonLdValidate};
5
6mod object;
7
8/// Options for serializing an expanded JSON-LD document to RDF.
9#[derive(Clone, Default)]
10pub struct RdfSerializationOptions {
11	/// Allow predicates to be arbitrary terms (generalized RDF).
12	///
13	/// When `false` (the default), triples whose predicate is not a well-formed
14	/// IRI are silently skipped, producing only well-formed RDF output.
15	/// When `true`, any predicate term is accepted (generalized RDF mode).
16	pub produce_generalized_rdf: bool,
17}
18
19impl SerializeLinkedDataWith<RdfSerializationOptions> for JsonLdExpandedDocument {
20	fn serialize_rdf_with<S>(
21		&self,
22		opts: RdfSerializationOptions,
23		mut serializer: S,
24		graph: Option<&Term>,
25	) -> Result<S::Ok, S::Error>
26	where
27		S: LinkedDataSerializer<Term>,
28	{
29		for object in self {
30			object.serialize_rdf_with(opts.clone(), serializer.as_dyn_mut(), graph)?;
31		}
32
33		serializer.end()
34	}
35}
36
37impl SerializeLinkedData for JsonLdExpandedDocument {
38	fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
39	where
40		S: LinkedDataSerializer<Term>,
41	{
42		self.serialize_rdf_with(RdfSerializationOptions::default(), serializer, graph)
43	}
44}
45
46impl JsonLdLenient<Id> {
47	pub fn serialize_rdf_term<S>(&self, serializer: &mut S) -> Result<Term, S::Error>
48	where
49		S: LinkedDataSerializer,
50	{
51		match self {
52			Self::Valid(id) => Ok(id.clone().into()),
53			Self::Invalid(_) => serializer.interpret(None),
54		}
55	}
56}
57
58impl<T, Q> SerializeLinkedDataWith<Q> for JsonLdLenient<T>
59where
60	T: JsonLdValidate + SerializeLinkedDataWith<Q>,
61{
62	fn serialize_rdf_with<S>(
63		&self,
64		state: Q,
65		serializer: S,
66		graph: Option<&Term>,
67	) -> Result<S::Ok, S::Error>
68	where
69		S: LinkedDataSerializer<Term>,
70	{
71		match self {
72			Self::Valid(t) => t.serialize_rdf_with(state, serializer, graph),
73			Self::Invalid(_) => serializer.end(),
74		}
75	}
76}
77
78impl<T> SerializeLinkedData for JsonLdLenient<T>
79where
80	T: JsonLdValidate + SerializeLinkedData,
81{
82	fn serialize_rdf<S>(&self, serializer: S, graph: Option<&Term>) -> Result<S::Ok, S::Error>
83	where
84		S: LinkedDataSerializer<Term>,
85	{
86		match self {
87			Self::Valid(id) => id.serialize_rdf(serializer, graph),
88			Self::Invalid(_) => serializer.end(),
89		}
90	}
91}