json-ld 0.22.0

JSON-LD implementation
Documentation
use linked_data::{DeserializeLinkedData, LinkedDataDeserializer};
use rdf_syntax::Term;

use crate::JsonLdObject;

mod list;
mod node;
mod value;

use list::*;
use node::*;
use value::*;

impl DeserializeLinkedData for JsonLdObject {
	fn deserialize_rdf<D>(mut deserializer: D, graph: Option<&Term>) -> Result<Self, D::Error>
	where
		D: LinkedDataDeserializer,
	{
		let subject = match deserializer.deserialize_resource(graph.cloned())? {
			Some(subject) => {
				if let Some(other) = deserializer.deserialize_resource(graph.cloned())? {
					return Err(linked_data::de::Error::unexpected_resource(&other));
				}

				subject
			}
			None => return Err(linked_data::de::Error::missing_resource()),
		};

		deserialize_object(&mut deserializer, &subject, graph)
	}
}

pub fn deserialize_object<R, D>(
	deserializer: &mut D,
	subject: &R,
	graph: Option<&R>,
) -> Result<JsonLdObject, D::Error>
where
	R: Clone + PartialEq,
	D: LinkedDataDeserializer<R>,
{
	if let Some(value) = try_deserialize_value_object(deserializer, subject)? {
		return Ok(JsonLdObject::Value(value));
	}

	if let Some(list) = try_deserialize_list_object(deserializer, subject, graph)? {
		return Ok(JsonLdObject::List(list));
	}

	deserialize_node_object(deserializer, subject, graph).map(JsonLdObject::node)
}

fn deserialize_object_ref<R, D>(
	deserializer: &mut D,
	subject: &R,
	graph: Option<&R>,
) -> Result<JsonLdObject, D::Error>
where
	R: Clone + PartialEq,
	D: LinkedDataDeserializer<R>,
{
	if let Some(value) = try_deserialize_value_object(deserializer, subject)? {
		return Ok(JsonLdObject::Value(value));
	}

	if let Some(list) = try_deserialize_list_object(deserializer, subject, graph)? {
		return Ok(JsonLdObject::List(list));
	}

	deserialize_node_object_ref(deserializer, subject).map(JsonLdObject::node)
}