Skip to main content

json_ld/algorithms/serialization/object/
mod.rs

1use linked_data::{DeserializeLinkedData, LinkedDataDeserializer};
2use rdf_syntax::Term;
3
4use crate::JsonLdObject;
5
6mod list;
7mod node;
8mod value;
9
10use list::*;
11use node::*;
12use value::*;
13
14impl DeserializeLinkedData for JsonLdObject {
15	fn deserialize_rdf<D>(mut deserializer: D, graph: Option<&Term>) -> Result<Self, D::Error>
16	where
17		D: LinkedDataDeserializer,
18	{
19		let subject = match deserializer.deserialize_resource(graph.cloned())? {
20			Some(subject) => {
21				if let Some(other) = deserializer.deserialize_resource(graph.cloned())? {
22					return Err(linked_data::de::Error::unexpected_resource(&other));
23				}
24
25				subject
26			}
27			None => return Err(linked_data::de::Error::missing_resource()),
28		};
29
30		deserialize_object(&mut deserializer, &subject, graph)
31	}
32}
33
34pub fn deserialize_object<R, D>(
35	deserializer: &mut D,
36	subject: &R,
37	graph: Option<&R>,
38) -> Result<JsonLdObject, D::Error>
39where
40	R: Clone + PartialEq,
41	D: LinkedDataDeserializer<R>,
42{
43	if let Some(value) = try_deserialize_value_object(deserializer, subject)? {
44		return Ok(JsonLdObject::Value(value));
45	}
46
47	if let Some(list) = try_deserialize_list_object(deserializer, subject, graph)? {
48		return Ok(JsonLdObject::List(list));
49	}
50
51	deserialize_node_object(deserializer, subject, graph).map(JsonLdObject::node)
52}
53
54fn deserialize_object_ref<R, D>(
55	deserializer: &mut D,
56	subject: &R,
57	graph: Option<&R>,
58) -> Result<JsonLdObject, D::Error>
59where
60	R: Clone + PartialEq,
61	D: LinkedDataDeserializer<R>,
62{
63	if let Some(value) = try_deserialize_value_object(deserializer, subject)? {
64		return Ok(JsonLdObject::Value(value));
65	}
66
67	if let Some(list) = try_deserialize_list_object(deserializer, subject, graph)? {
68		return Ok(JsonLdObject::List(list));
69	}
70
71	deserialize_node_object_ref(deserializer, subject).map(JsonLdObject::node)
72}